Merge branch 'stable-6.2' into stable-6.3

* stable-6.2:
  [bazel] Move ToolTestCase to src folder (6.2)
  GcConcurrentTest: @Ignore flaky testInterruptGc
  Fix CommitTemplateConfigTest
  Fix after_open config and Snapshotting RefDir tests to work with bazel
  [bazel] Skip ConfigTest#testCommitTemplatePathInHomeDirecory
  Demote severity of some error prone bug patterns to warnings
  UploadPack: Fix NPE when traversing a tag chain

Change-Id: I736c7d0ed9c6e9718fa98976c3dc5a25ab8cda85
diff --git a/org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ToolTestCase.java b/org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/pgm/ToolTestCase.java
similarity index 100%
rename from org.eclipse.jgit.pgm.test/tst/org/eclipse/jgit/pgm/ToolTestCase.java
rename to org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/pgm/ToolTestCase.java
diff --git a/org.eclipse.jgit.test/BUILD b/org.eclipse.jgit.test/BUILD
index 258e845..5066808 100644
--- a/org.eclipse.jgit.test/BUILD
+++ b/org.eclipse.jgit.test/BUILD
@@ -52,6 +52,23 @@
     exclude = HELPERS + DATA + EXCLUDED,
 ))
 
+# Non abstract base classes used for tests by other test classes
+BASE = [
+    PKG + "internal/storage/file/FileRepositoryBuilderTest.java",
+    PKG + "internal/storage/file/RefDirectoryTest.java",
+]
+
+java_library(
+    name = "base",
+    testonly = 1,
+    srcs = BASE,
+    deps = [
+        "//lib:junit",
+        "//org.eclipse.jgit:jgit",
+        "//org.eclipse.jgit.junit:junit",
+    ],
+)
+
 java_library(
     name = "helpers",
     testonly = 1,
diff --git a/org.eclipse.jgit.test/tests.bzl b/org.eclipse.jgit.test/tests.bzl
index e201bdb..170bf0c 100644
--- a/org.eclipse.jgit.test/tests.bzl
+++ b/org.eclipse.jgit.test/tests.bzl
@@ -52,6 +52,12 @@
                 "//lib:xz",
                 "//org.eclipse.jgit.archive:jgit-archive",
             ]
+        if src.endswith("FileRepositoryBuilderAfterOpenConfigTest.java") or \
+           src.endswith("RefDirectoryAfterOpenConfigTest.java") or \
+           src.endswith("SnapshottingRefDirectoryTest.java"):
+            additional_deps = [
+                ":base",
+            ]
         heap_size = "-Xmx256m"
         if src.endswith("HugeCommitMessageTest.java"):
             heap_size = "-Xmx512m"
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 5f52e6b..1519873 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
@@ -43,6 +43,7 @@
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.storage.file.FileBasedConfig;
 import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
+import org.junit.Ignore;
 import org.junit.Test;
 
 public class GcConcurrentTest extends GcTestCase {
@@ -197,6 +198,7 @@ public void repackAndCheckBitmapUsage() throws Exception {
 		assertNotNull(getSinglePack(repository).getBitmapIndex());
 	}
 
+	@Ignore
 	@Test
 	public void testInterruptGc() throws Exception {
 		FileBasedConfig c = repo.getConfig();
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java
index 7131905..2b05dec 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/UploadPackTest.java
@@ -2539,6 +2539,75 @@ public void onSendPack(UploadPack up,
 	}
 
 	@Test
+	public void testSingleBranchShallowCloneTagChainWithReflessTag() throws Exception {
+		RevCommit one = remote.commit().message("1").create();
+		remote.update("master", one);
+		RevTag tag1 = remote.tag("t1", one);
+		remote.lightweightTag("t1", tag1);
+		RevTag tag2 = remote.tag("t2", tag1);
+		RevTag tag3 = remote.tag("t3", tag2);
+		remote.lightweightTag("t3", tag3);
+
+		UploadPack uploadPack = new UploadPack(remote.getRepository());
+
+		ByteArrayOutputStream cli = new ByteArrayOutputStream();
+		PacketLineOut clientWant = new PacketLineOut(cli);
+		clientWant.writeString("want " + one.name() + " include-tag");
+		clientWant.writeString("deepen 1\n");
+		clientWant.end();
+		clientWant.writeString("done\n");
+
+		try (ByteArrayOutputStream serverResponse = new ByteArrayOutputStream()) {
+
+			uploadPack.setPreUploadHook(new PreUploadHook() {
+				@Override
+				public void onBeginNegotiateRound(UploadPack up,
+						Collection<? extends ObjectId> wants, int cntOffered)
+						throws ServiceMayNotContinueException {
+					// Do nothing.
+				}
+
+				@Override
+				public void onEndNegotiateRound(UploadPack up,
+						Collection<? extends ObjectId> wants, int cntCommon,
+						int cntNotFound, boolean ready)
+						throws ServiceMayNotContinueException {
+					// Do nothing.
+				}
+
+				@Override
+				public void onSendPack(UploadPack up,
+						Collection<? extends ObjectId> wants,
+						Collection<? extends ObjectId> haves)
+						throws ServiceMayNotContinueException {
+					// collect pack data
+					serverResponse.reset();
+				}
+			});
+			uploadPack.upload(new ByteArrayInputStream(cli.toByteArray()),
+					serverResponse, System.err);
+			ByteArrayInputStream packReceived = new ByteArrayInputStream(
+					serverResponse.toByteArray());
+			PackLock lock = null;
+			try (ObjectInserter ins = client.newObjectInserter()) {
+				PackParser parser = ins.newPackParser(packReceived);
+				parser.setAllowThin(true);
+				parser.setLockMessage("receive-tag-chain");
+				ProgressMonitor mlc = NullProgressMonitor.INSTANCE;
+				lock = parser.parse(mlc, mlc);
+				ins.flush();
+			} finally {
+				if (lock != null) {
+					lock.unlock();
+				}
+			}
+			InMemoryRepository.MemObjDatabase objDb = client
+					.getObjectDatabase();
+			assertTrue(objDb.has(one.toObjectId()));
+		}
+	}
+
+	@Test
 	public void testSafeToClearRefsInFetchV0() throws Exception {
 		server =
 			new RefCallsCountingRepository(
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
index 65dbf12..d2a2a97 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
@@ -2417,11 +2417,11 @@ else if (ref.getName().startsWith(Constants.R_HEADS))
 					if (peeledId == null || objectId == null)
 						continue;
 
-					objectId = ref.getObjectId();
-					if (pw.willInclude(peeledId) && !pw.willInclude(objectId)) {
-						RevObject o = rw.parseAny(objectId);
-						addTagChain(o, pw);
-						pw.addObject(o);
+					if (pw.willInclude(peeledId)) {
+						// We don't need to handle parseTag throwing an
+						// IncorrectObjectTypeException as we only reach
+						// here when ref is an annotated tag
+						addTagChain(rw.parseTag(objectId), pw);
 					}
 				}
 			}
@@ -2471,15 +2471,16 @@ private static void findSymrefs(
 	}
 
 	private void addTagChain(
-			RevObject o, PackWriter pw) throws IOException {
-		while (Constants.OBJ_TAG == o.getType()) {
-			RevTag t = (RevTag) o;
-			o = t.getObject();
-			if (o.getType() == Constants.OBJ_TAG && !pw.willInclude(o.getId())) {
-				walk.parseBody(o);
-				pw.addObject(o);
+			RevTag tag, PackWriter pw) throws IOException {
+		RevObject o = tag;
+		do {
+			tag = (RevTag) o;
+			walk.parseBody(tag);
+			if (!pw.willInclude(tag.getId())) {
+				pw.addObject(tag);
 			}
-		}
+			o = tag.getObject();
+		} while (Constants.OBJ_TAG == o.getType());
 	}
 
 	private List<ObjectId> parseDeepenNots(List<String> deepenNots)
diff --git a/tools/BUILD b/tools/BUILD
index a109019..1e67108 100644
--- a/tools/BUILD
+++ b/tools/BUILD
@@ -45,7 +45,7 @@
         "-Xep:CannotMockFinalClass:ERROR",
         "-Xep:ClassCanBeStatic:ERROR",
         "-Xep:ClassNewInstance:ERROR",
-        "-Xep:DefaultCharset:ERROR",
+        "-Xep:DefaultCharset:WARN",
         "-Xep:DoubleCheckedLocking:ERROR",
         "-Xep:ElementsCountedInLoop:ERROR",
         "-Xep:EqualsHashCode:ERROR",
@@ -55,7 +55,7 @@
         "-Xep:FragmentInjection:ERROR",
         "-Xep:FragmentNotInstantiable:ERROR",
         "-Xep:FunctionalInterfaceClash:ERROR",
-        "-Xep:FutureReturnValueIgnored:ERROR",
+        "-Xep:FutureReturnValueIgnored:WARN",
         "-Xep:GetClassOnEnum:ERROR",
         "-Xep:ImmutableAnnotationChecker:ERROR",
         "-Xep:ImmutableEnumChecker:ERROR",
@@ -89,7 +89,7 @@
         "-Xep:TypeParameterShadowing:ERROR",
         "-Xep:TypeParameterUnusedInFormals:WARN",
         "-Xep:URLEqualsHashCode:ERROR",
-        "-Xep:UnusedException:ERROR",
+        "-Xep:UnusedException:WARN",
         "-Xep:UnsynchronizedOverridesSynchronized:ERROR",
         "-Xep:WaitNotInLoop:ERROR",
     ],