Merge branch 'stable-6.4' into stable-6.5

* stable-6.4:
  Disable MergeToolTest#testEmptyToolName
  Allow to discover bitmap on disk created after the packfile
  Prepare 5.13.6-SNAPSHOT builds
  JGit v5.13.5.202508271544-r
  Remove resolver option from target-platform-configuration
  Add missing release property to maven build
  Suppress API errors for minor API changes in service releases
  Remove unnecessary casts

Change-Id: I333683f4ec31618cedcb70625afa056fd4f65aa2
diff --git a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
index c1cdf3b..fddeb31 100644
--- a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
@@ -10,6 +10,7 @@
 Import-Package: org.eclipse.jgit.api;version="[6.5.1,6.6.0)",
  org.eclipse.jgit.attributes;version="[6.5.1,6.6.0)",
  org.eclipse.jgit.internal.storage.dfs;version="[6.5.1,6.6.0)",
+ org.eclipse.jgit.internal.storage.file;version="[6.5.1,6.6.0)",
  org.eclipse.jgit.junit;version="[6.5.1,6.6.0)",
  org.eclipse.jgit.lfs;version="[6.5.1,6.6.0)",
  org.eclipse.jgit.lfs.errors;version="[6.5.1,6.6.0)",
diff --git a/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/internal/LfsConnectionFactoryTest.java b/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/internal/LfsConnectionFactoryTest.java
index badcb7d..9fb1ff1 100644
--- a/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/internal/LfsConnectionFactoryTest.java
+++ b/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/internal/LfsConnectionFactoryTest.java
@@ -97,7 +97,7 @@ public void lfsUrlFromRemoteUrlWithoutDotGit() throws Exception {
 	public void lfsUrlFromLocalConfig() throws Exception {
 		addRemoteUrl("https://localhost/repo");
 
-		StoredConfig cfg = ((Repository) db).getConfig();
+		StoredConfig cfg = db.getConfig();
 		cfg.setString(ConfigConstants.CONFIG_SECTION_LFS,
 				null,
 				ConfigConstants.CONFIG_KEY_URL,
@@ -111,7 +111,7 @@ public void lfsUrlFromLocalConfig() throws Exception {
 	public void lfsUrlFromOriginConfig() throws Exception {
 		addRemoteUrl("https://localhost/repo");
 
-		StoredConfig cfg = ((Repository) db).getConfig();
+		StoredConfig cfg = db.getConfig();
 		cfg.setString(ConfigConstants.CONFIG_SECTION_LFS,
 				org.eclipse.jgit.lib.Constants.DEFAULT_REMOTE_NAME,
 				ConfigConstants.CONFIG_KEY_URL,
diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/MergeToolTest.java b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/MergeToolTest.java
index 65c7e9a..6339831 100644
--- a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/MergeToolTest.java
+++ b/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/MergeToolTest.java
@@ -27,6 +27,7 @@
 import org.eclipse.jgit.internal.diffmergetool.MergeTools;
 import org.eclipse.jgit.lib.StoredConfig;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -77,6 +78,7 @@ public void testUserToolWithCommandNotFoundError() throws Exception {
 				+ errorReturnCode);
 	}
 
+	@Ignore
 	@Test
 	public void testEmptyToolName() throws Exception {
 		assumeLinuxPlatform();
diff --git a/org.eclipse.jgit.ssh.apache.agent/bin/.project b/org.eclipse.jgit.ssh.apache.agent/bin/.project
deleted file mode 100644
index 73358f4..0000000
--- a/org.eclipse.jgit.ssh.apache.agent/bin/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jgit.ssh.apache.agent</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF
index 22d9576..736f1a9 100644
--- a/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.apache.test/META-INF/MANIFEST.MF
@@ -23,6 +23,7 @@
  org.apache.sshd.server.forward;version="[2.9.2,2.10.0)",
  org.eclipse.jgit.api;version="[6.5.1,6.6.0)",
  org.eclipse.jgit.api.errors;version="[6.5.1,6.6.0)",
+ org.eclipse.jgit.internal.storage.file;version="[6.5.1,6.6.0)",
  org.eclipse.jgit.internal.transport.sshd.proxy;version="[6.5.1,6.6.0)",
  org.eclipse.jgit.junit;version="[6.5.1,6.6.0)",
  org.eclipse.jgit.junit.ssh;version="[6.5.1,6.6.0)",
diff --git a/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/transport/sshd/ApacheSshProtocol2Test.java b/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/transport/sshd/ApacheSshProtocol2Test.java
index eef0402..617e86c 100644
--- a/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/transport/sshd/ApacheSshProtocol2Test.java
+++ b/org.eclipse.jgit.ssh.apache.test/tst/org/eclipse/jgit/transport/sshd/ApacheSshProtocol2Test.java
@@ -17,7 +17,6 @@
 
 import org.eclipse.jgit.junit.ssh.SshBasicTestBase;
 import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.StoredConfig;
 import org.eclipse.jgit.transport.SshSessionFactory;
 import org.eclipse.jgit.util.FS;
@@ -52,7 +51,7 @@ protected void installConfig(String... config) {
 	@Override
 	public void setUp() throws Exception {
 		super.setUp();
-		StoredConfig config = ((Repository) db).getConfig();
+		StoredConfig config = db.getConfig();
 		config.setInt("protocol", null, "version", 2);
 		config.save();
 	}
diff --git a/org.eclipse.jgit.ssh.jsch.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.ssh.jsch.test/META-INF/MANIFEST.MF
index 2e57de4..a4a3168 100644
--- a/org.eclipse.jgit.ssh.jsch.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit.ssh.jsch.test/META-INF/MANIFEST.MF
@@ -9,6 +9,7 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Import-Package: com.jcraft.jsch;version="[0.1.54,0.2.0)",
  org.eclipse.jgit.errors;version="[6.5.1,6.6.0)",
+ org.eclipse.jgit.internal.storage.file;version="[6.5.1,6.6.0)",
  org.eclipse.jgit.junit;version="[6.5.1,6.6.0)",
  org.eclipse.jgit.junit.ssh;version="[6.5.1,6.6.0)",
  org.eclipse.jgit.lib;version="[6.5.1,6.6.0)",
diff --git a/org.eclipse.jgit.ssh.jsch.test/tst/org/eclipse/jgit/transport/ssh/jsch/JSchSshProtocol2Test.java b/org.eclipse.jgit.ssh.jsch.test/tst/org/eclipse/jgit/transport/ssh/jsch/JSchSshProtocol2Test.java
index 611d4e8..d615400 100644
--- a/org.eclipse.jgit.ssh.jsch.test/tst/org/eclipse/jgit/transport/ssh/jsch/JSchSshProtocol2Test.java
+++ b/org.eclipse.jgit.ssh.jsch.test/tst/org/eclipse/jgit/transport/ssh/jsch/JSchSshProtocol2Test.java
@@ -22,7 +22,6 @@
 import org.eclipse.jgit.errors.TransportException;
 import org.eclipse.jgit.junit.ssh.SshBasicTestBase;
 import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.StoredConfig;
 import org.eclipse.jgit.transport.CredentialsProvider;
 import org.eclipse.jgit.transport.RemoteSession;
@@ -89,7 +88,7 @@ private OpenSshConfig createConfig(String... content) throws IOException {
 	@Override
 	public void setUp() throws Exception {
 		super.setUp();
-		StoredConfig config = ((Repository) db).getConfig();
+		StoredConfig config = db.getConfig();
 		config.setInt("protocol", null, "version", 2);
 		config.save();
 	}
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcConcurrentTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcConcurrentTest.java
index 1519873..96a0649 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcConcurrentTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcConcurrentTest.java
@@ -186,13 +186,12 @@ public void repackAndCheckBitmapUsage() throws Exception {
 		// make sure gc() has caused creation of a new packfile
 		assertNotEquals(oldPackName, newPackName);
 
-		// Even when asking again for the set of packfiles outdated data
-		// will be returned. As long as the repository can work on cached data
-		// it will do so and not detect that a new packfile exists.
-		assertNotEquals(getSinglePack(repository).getPackName(), newPackName);
+		// When asking again for the set of packfiles the new updated data
+		// will be returned because of the rescan of the pack directory.
+		assertEquals(getSinglePack(repository).getPackName(), newPackName);
 
-		// Only when accessing object content it is required to rescan the pack
-		// directory and the new packfile will be detected.
+		// When accessing object content the new packfile refreshed from
+		// the rescan triggered from the list of packs.
 		repository.getObjectDatabase().open(b).getSize();
 		assertEquals(getSinglePack(repository).getPackName(), newPackName);
 		assertNotNull(getSinglePack(repository).getBitmapIndex());
diff --git a/org.eclipse.jgit/META-INF/MANIFEST.MF b/org.eclipse.jgit/META-INF/MANIFEST.MF
index c5b5369..8304a87 100644
--- a/org.eclipse.jgit/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit/META-INF/MANIFEST.MF
@@ -94,9 +94,12 @@
    org.eclipse.jgit.junit.http,
    org.eclipse.jgit.http.server,
    org.eclipse.jgit.lfs,
+   org.eclipse.jgit.lfs.test,
    org.eclipse.jgit.pgm,
    org.eclipse.jgit.pgm.test,
-   org.eclipse.jgit.ssh.apache",
+   org.eclipse.jgit.ssh.apache,
+   org.eclipse.jgit.ssh.apache.test,
+   org.eclipse.jgit.ssh.jsch.test",
  org.eclipse.jgit.internal.storage.io;version="6.5.1";
   x-friends:="org.eclipse.jgit.junit,
    org.eclipse.jgit.test,
diff --git a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
index faea9cb..fea29fc 100644
--- a/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
+++ b/org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
@@ -55,6 +55,8 @@
 binaryHunkInvalidLength=Binary hunk, line {0}: input corrupt; expected length byte, got 0x{1}
 binaryHunkLineTooShort=Binary hunk, line {0}: input ended prematurely
 binaryHunkMissingNewline=Binary hunk, line {0}: input line not terminated by newline
+bitmapAccessErrorForPackfile=Error whilst trying to access bitmap file for {}
+bitmapFailedToGet=Failed to get bitmap index file {}
 bitmapMissingObject=Bitmap at {0} is missing {1}.
 bitmapsMustBePrepared=Bitmaps must be prepared before they may be written.
 blameNotCommittedYet=Not Committed Yet
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
index 39cc749..eb20ecd 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
@@ -83,6 +83,8 @@ public static JGitText get() {
 	/***/ public String binaryHunkInvalidLength;
 	/***/ public String binaryHunkLineTooShort;
 	/***/ public String binaryHunkMissingNewline;
+	/***/ public String bitmapAccessErrorForPackfile;
+	/***/ public String bitmapFailedToGet;
 	/***/ public String bitmapMissingObject;
 	/***/ public String bitmapsMustBePrepared;
 	/***/ public String blameNotCommittedYet;
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/Pack.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/Pack.java
index 6e74136..9dafa83 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/Pack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/Pack.java
@@ -1146,6 +1146,19 @@ synchronized PackBitmapIndex getBitmapIndex() throws IOException {
 		return bitmapIdx;
 	}
 
+	synchronized void refreshBitmapIndex(PackFile bitmapIndexFile) {
+		this.bitmapIdx = null;
+		this.invalid = false;
+		this.bitmapIdxFile = bitmapIndexFile;
+		try {
+			getBitmapIndex();
+		} catch (IOException e) {
+			LOG.warn(JGitText.get().bitmapFailedToGet, bitmapIdxFile, e);
+			this.bitmapIdx = null;
+			this.bitmapIdxFile = null;
+		}
+	}
+
 	private synchronized PackReverseIndex getReverseIdx() throws IOException {
 		if (reverseIdx == null)
 			reverseIdx = new PackReverseIndex(idx());
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackDirectory.java
index 6a99cb3..1676d8b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackDirectory.java
@@ -115,10 +115,13 @@ void close() {
 	}
 
 	Collection<Pack> getPacks() {
-		PackList list = packList.get();
-		if (list == NO_PACKS) {
-			list = scanPacks(list);
-		}
+		PackList list;
+		do {
+			list = packList.get();
+			if (list == NO_PACKS) {
+				list = scanPacks(list);
+			}
+		} while (searchPacksAgain(list));
 		Pack[] packs = list.packs;
 		return Collections.unmodifiableCollection(Arrays.asList(packs));
 	}
@@ -455,6 +458,13 @@ private PackList scanPacksImpl(PackList old) {
 					&& !oldPack.getFileSnapshot().isModified(packFile)) {
 				forReuse.remove(packFile.getName());
 				list.add(oldPack);
+				try {
+					if(oldPack.getBitmapIndex() == null) {
+						oldPack.refreshBitmapIndex(packFilesByExt.get(BITMAP_INDEX));
+					}
+				} catch (IOException e) {
+					LOG.warn(JGitText.get().bitmapAccessErrorForPackfile, oldPack.getPackName(), e);
+				}
 				continue;
 			}
 
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java
index a6ea523..3887dff 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/notes/NoteMapMerger.java
@@ -193,7 +193,7 @@ private void addIfNotNull(FanoutBucket b, int cell, NoteBucket child)
 		if (child == null)
 			return;
 		if (child instanceof InMemoryNoteBucket)
-			b.setBucket(cell, ((InMemoryNoteBucket) child).writeTree(inserter));
+			b.setBucket(cell, child.writeTree(inserter));
 		else
 			b.setBucket(cell, child.getTreeId());
 	}