Add support for the "ref-prefix" parameter in the "ls-refs" command in the fetch-pack/upload-pack protocol v2. Change-Id: If9cf93b2646f75d50a11b5f482594f014d59a836 Signed-off-by: Jonathan Tan <jonathantanmy@google.com>tags/v5.0.0.201805151920-m7
@@ -461,4 +461,43 @@ public class UploadPackTest { | |||
assertThat(pckIn.readString(), is(tag.toObjectId().getName() + " refs/tags/tag")); | |||
assertTrue(pckIn.readString() == PacketLineIn.END); | |||
} | |||
@Test | |||
public void testV2LsRefsRefPrefix() throws Exception { | |||
RevCommit tip = remote.commit().message("message").create(); | |||
remote.update("master", tip); | |||
remote.update("other", tip); | |||
remote.update("yetAnother", tip); | |||
ByteArrayInputStream recvStream = uploadPackV2( | |||
"command=ls-refs\n", | |||
PacketLineIn.DELIM, | |||
"ref-prefix refs/heads/maste", | |||
"ref-prefix refs/heads/other", | |||
PacketLineIn.END); | |||
PacketLineIn pckIn = new PacketLineIn(recvStream); | |||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/master")); | |||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/other")); | |||
assertTrue(pckIn.readString() == PacketLineIn.END); | |||
} | |||
@Test | |||
public void testV2LsRefsRefPrefixNoSlash() throws Exception { | |||
RevCommit tip = remote.commit().message("message").create(); | |||
remote.update("master", tip); | |||
remote.update("other", tip); | |||
ByteArrayInputStream recvStream = uploadPackV2( | |||
"command=ls-refs\n", | |||
PacketLineIn.DELIM, | |||
"ref-prefix refs/heads/maste", | |||
"ref-prefix r", | |||
PacketLineIn.END); | |||
PacketLineIn pckIn = new PacketLineIn(recvStream); | |||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/master")); | |||
assertThat(pckIn.readString(), is(tip.toObjectId().getName() + " refs/heads/other")); | |||
assertTrue(pckIn.readString() == PacketLineIn.END); | |||
} | |||
} |
@@ -69,6 +69,7 @@ import java.text.MessageFormat; | |||
import java.util.ArrayList; | |||
import java.util.Collection; | |||
import java.util.Collections; | |||
import java.util.HashMap; | |||
import java.util.HashSet; | |||
import java.util.List; | |||
import java.util.Map; | |||
@@ -868,8 +869,9 @@ public class UploadPack { | |||
private void lsRefsV2() throws IOException { | |||
PacketLineOutRefAdvertiser adv = new PacketLineOutRefAdvertiser(pckOut); | |||
Map<String, Ref> refs = getAdvertisedOrDefaultRefs(); | |||
String line; | |||
ArrayList<String> refPrefixes = new ArrayList<>(); | |||
boolean needToFindSymrefs = false; | |||
adv.setUseProtocolV2(true); | |||
@@ -882,7 +884,9 @@ public class UploadPack { | |||
if (line.equals("peel")) { | |||
adv.setDerefTags(true); | |||
} else if (line.equals("symrefs")) { | |||
findSymrefs(adv, refs); | |||
needToFindSymrefs = true; | |||
} else if (line.startsWith("ref-prefix ")) { | |||
refPrefixes.add(line.substring("ref-prefix ".length())); | |||
} else { | |||
throw new PackProtocolException("unexpected " + line); | |||
} | |||
@@ -892,7 +896,23 @@ public class UploadPack { | |||
} | |||
rawOut.stopBuffering(); | |||
adv.send(refs); | |||
Map<String, Ref> refsToSend; | |||
if (refPrefixes.isEmpty()) { | |||
refsToSend = getAdvertisedOrDefaultRefs(); | |||
} else { | |||
refsToSend = new HashMap<>(); | |||
for (String refPrefix : refPrefixes) { | |||
for (Ref ref : db.getRefDatabase().getRefsByPrefix(refPrefix)) { | |||
refsToSend.put(ref.getName(), ref); | |||
} | |||
} | |||
} | |||
if (needToFindSymrefs) { | |||
findSymrefs(adv, refsToSend); | |||
} | |||
adv.send(refsToSend); | |||
adv.end(); | |||
} | |||