Merge "[errorprone] Suppress FutureReturnValueIgnored in FileRepository#autoGc" into stable-6.0
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 1c5a521..7131905 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
@@ -1107,6 +1107,61 @@
 	}
 
 	@Test
+	public void testV2FetchServerStopsNegotiationForRefWithoutParents()
+			throws Exception {
+		RevCommit fooCommit = remote.commit().message("x").create();
+		RevCommit barCommit = remote.commit().message("y").create();
+		remote.update("refs/changes/01/1/1", fooCommit);
+		remote.update("refs/changes/02/2/1", barCommit);
+
+		ByteArrayInputStream recvStream = uploadPackV2("command=fetch\n",
+				PacketLineIn.delimiter(),
+				"want " + fooCommit.toObjectId().getName() + "\n",
+				"have " + barCommit.toObjectId().getName() + "\n",
+				PacketLineIn.end());
+		PacketLineIn pckIn = new PacketLineIn(recvStream);
+
+		assertThat(pckIn.readString(), is("acknowledgments"));
+		assertThat(pckIn.readString(),
+				is("ACK " + barCommit.toObjectId().getName()));
+		assertThat(pckIn.readString(), is("ready"));
+		assertTrue(PacketLineIn.isDelimiter(pckIn.readString()));
+		assertThat(pckIn.readString(), is("packfile"));
+		parsePack(recvStream);
+		assertTrue(client.getObjectDatabase().has(fooCommit.toObjectId()));
+	}
+
+	@Test
+	public void testV2FetchServerDoesNotStopNegotiationWhenOneRefWithoutParentAndOtherWithParents()
+			throws Exception {
+		RevCommit fooCommit = remote.commit().message("x").create();
+		RevCommit barParent = remote.commit().message("y").create();
+		RevCommit barChild = remote.commit().message("y").parent(barParent)
+				.create();
+		RevCommit fooBarParent = remote.commit().message("z").create();
+		RevCommit fooBarChild = remote.commit().message("y")
+				.parent(fooBarParent)
+				.create();
+		remote.update("refs/changes/01/1/1", fooCommit);
+		remote.update("refs/changes/02/2/1", barChild);
+		remote.update("refs/changes/03/3/1", fooBarChild);
+
+		ByteArrayInputStream recvStream = uploadPackV2("command=fetch\n",
+				PacketLineIn.delimiter(),
+				"want " + fooCommit.toObjectId().getName() + "\n",
+				"want " + barChild.toObjectId().getName() + "\n",
+				"want " + fooBarChild.toObjectId().getName() + "\n",
+				"have " + fooBarParent.toObjectId().getName() + "\n",
+				PacketLineIn.end());
+		PacketLineIn pckIn = new PacketLineIn(recvStream);
+
+		assertThat(pckIn.readString(), is("acknowledgments"));
+		assertThat(pckIn.readString(),
+				is("ACK " + fooBarParent.toObjectId().getName()));
+		assertTrue(PacketLineIn.isEnd(pckIn.readString()));
+	}
+
+	@Test
 	public void testV2FetchThinPack() throws Exception {
 		String commonInBlob = "abcdefghijklmnopqrstuvwxyz";
 
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 6da6c13..0a7eb17 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
@@ -2175,6 +2175,11 @@
 		if (want.has(SATISFIED))
 			return true;
 
+		if (((RevCommit) want).getParentCount() == 0) {
+			want.add(SATISFIED);
+			return true;
+		}
+
 		walk.resetRetain(SAVE);
 		walk.markStart((RevCommit) want);
 		if (oldestTime != 0)