Merge branch 'stable-5.11' into stable-5.12

* stable-5.11:
  UploadPack v2 protocol: Stop negotiation for orphan refs

Change-Id: I5db432bd416cfa8d3dd295bdce63e31d5f160a8a
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 5045e94..3958de2 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
@@ -999,6 +999,61 @@ public void testV2FetchClientStopsNegotiation() throws Exception {
 	}
 
 	@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 9fda639..63deff2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
@@ -2103,6 +2103,11 @@ private boolean wantSatisfied(RevObject want) throws IOException {
 		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)