PacketLineIn: Add an iterator over strings in the input stream
Allows callers to read all lines in the input stream until the END marker is reached, without having to explicitly check for the END marker. Replace all remaining usage of the END marker with the new method. Change-Id: I51f419c7f569ab7ed01e1aaaf6b40ed8cdc2116b Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
This commit is contained in:
parent
e0133b9440
commit
ee747827b0
|
@ -387,8 +387,7 @@ public void testV2HttpFirstResponse() throws Exception {
|
|||
|
||||
// What remains are capabilities - ensure that all of them are
|
||||
// non-empty strings, and that we see END at the end.
|
||||
String s;
|
||||
while ((s = pckIn.readString()) != PacketLineIn.END) {
|
||||
for (String s : pckIn.readStrings()) {
|
||||
assertTrue(!s.isEmpty());
|
||||
}
|
||||
}
|
||||
|
@ -421,8 +420,7 @@ public void testV2HttpSubsequentResponse() throws Exception {
|
|||
PacketLineIn pckIn = new PacketLineIn(c.getInputStream());
|
||||
|
||||
// Just check that we get what looks like a ref advertisement.
|
||||
String s;
|
||||
while ((s = pckIn.readString()) != PacketLineIn.END) {
|
||||
for (String s : pckIn.readStrings()) {
|
||||
assertTrue(s.matches("[0-9a-f]{40} [A-Za-z/]*"));
|
||||
}
|
||||
|
||||
|
|
|
@ -383,8 +383,7 @@ private void readStatusReport(Map<String, RemoteRefUpdate> refUpdates)
|
|||
JGitText.get().errorOccurredDuringUnpackingOnTheRemoteEnd, unpackStatus));
|
||||
}
|
||||
|
||||
String refLine;
|
||||
while ((refLine = pckIn.readString()) != PacketLineIn.END) {
|
||||
for (String refLine : pckIn.readStrings()) {
|
||||
boolean ok = false;
|
||||
int refNameEnd = -1;
|
||||
if (refLine.startsWith("ok ")) { //$NON-NLS-1$
|
||||
|
|
|
@ -49,7 +49,9 @@
|
|||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Iterator;
|
||||
|
||||
import org.eclipse.jgit.errors.PackProtocolException;
|
||||
import org.eclipse.jgit.internal.JGitText;
|
||||
|
@ -195,6 +197,20 @@ public String readString() throws IOException {
|
|||
return s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an iterator to read strings from the input stream.
|
||||
*
|
||||
* @return an iterator that calls {@link #readString()} until {@link #END}
|
||||
* is encountered.
|
||||
*
|
||||
* @throws IOException
|
||||
* on failure to read the initial packet line.
|
||||
* @since 5.4
|
||||
*/
|
||||
public PacketLineInIterator readStrings() throws IOException {
|
||||
return new PacketLineInIterator(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a single UTF-8 encoded string packet from the input stream.
|
||||
* <p>
|
||||
|
@ -331,4 +347,46 @@ private IOException invalidHeader() {
|
|||
public static class InputOverLimitIOException extends IOException {
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterator over packet lines.
|
||||
* <p>
|
||||
* Calls {@link #readString()} on the {@link PacketLineIn} until
|
||||
* {@link #END} is encountered.
|
||||
*
|
||||
* @since 5.4
|
||||
*
|
||||
*/
|
||||
public static class PacketLineInIterator implements Iterable<String> {
|
||||
private PacketLineIn in;
|
||||
|
||||
private String current;
|
||||
|
||||
PacketLineInIterator(PacketLineIn in) throws IOException {
|
||||
this.in = in;
|
||||
current = in.readString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<String> iterator() {
|
||||
return new Iterator<String>() {
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return !PacketLineIn.isEnd(current);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String next() {
|
||||
String next = current;
|
||||
try {
|
||||
current = in.readString();
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
}
|
||||
return next;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -144,29 +144,30 @@ FetchV2Request parseFetchRequest(PacketLineIn pckIn)
|
|||
}
|
||||
|
||||
boolean filterReceived = false;
|
||||
while ((line = pckIn.readString()) != PacketLineIn.END) {
|
||||
if (line.startsWith("want ")) { //$NON-NLS-1$
|
||||
reqBuilder.addWantId(ObjectId.fromString(line.substring(5)));
|
||||
for (String line2 : pckIn.readStrings()) {
|
||||
if (line2.startsWith("want ")) { //$NON-NLS-1$
|
||||
reqBuilder.addWantId(ObjectId.fromString(line2.substring(5)));
|
||||
} else if (transferConfig.isAllowRefInWant()
|
||||
&& line.startsWith(OPTION_WANT_REF + " ")) { //$NON-NLS-1$
|
||||
reqBuilder.addWantedRef(line.substring(OPTION_WANT_REF.length() + 1));
|
||||
} else if (line.startsWith("have ")) { //$NON-NLS-1$
|
||||
reqBuilder.addPeerHas(ObjectId.fromString(line.substring(5)));
|
||||
} else if (line.equals("done")) { //$NON-NLS-1$
|
||||
&& line2.startsWith(OPTION_WANT_REF + " ")) { //$NON-NLS-1$
|
||||
reqBuilder.addWantedRef(
|
||||
line2.substring(OPTION_WANT_REF.length() + 1));
|
||||
} else if (line2.startsWith("have ")) { //$NON-NLS-1$
|
||||
reqBuilder.addPeerHas(ObjectId.fromString(line2.substring(5)));
|
||||
} else if (line2.equals("done")) { //$NON-NLS-1$
|
||||
reqBuilder.setDoneReceived();
|
||||
} else if (line.equals(OPTION_THIN_PACK)) {
|
||||
} else if (line2.equals(OPTION_THIN_PACK)) {
|
||||
reqBuilder.addClientCapability(OPTION_THIN_PACK);
|
||||
} else if (line.equals(OPTION_NO_PROGRESS)) {
|
||||
} else if (line2.equals(OPTION_NO_PROGRESS)) {
|
||||
reqBuilder.addClientCapability(OPTION_NO_PROGRESS);
|
||||
} else if (line.equals(OPTION_INCLUDE_TAG)) {
|
||||
} else if (line2.equals(OPTION_INCLUDE_TAG)) {
|
||||
reqBuilder.addClientCapability(OPTION_INCLUDE_TAG);
|
||||
} else if (line.equals(OPTION_OFS_DELTA)) {
|
||||
} else if (line2.equals(OPTION_OFS_DELTA)) {
|
||||
reqBuilder.addClientCapability(OPTION_OFS_DELTA);
|
||||
} else if (line.startsWith("shallow ")) { //$NON-NLS-1$
|
||||
} else if (line2.startsWith("shallow ")) { //$NON-NLS-1$
|
||||
reqBuilder.addClientShallowCommit(
|
||||
ObjectId.fromString(line.substring(8)));
|
||||
} else if (line.startsWith("deepen ")) { //$NON-NLS-1$
|
||||
int parsedDepth = Integer.parseInt(line.substring(7));
|
||||
ObjectId.fromString(line2.substring(8)));
|
||||
} else if (line2.startsWith("deepen ")) { //$NON-NLS-1$
|
||||
int parsedDepth = Integer.parseInt(line2.substring(7));
|
||||
if (parsedDepth <= 0) {
|
||||
throw new PackProtocolException(
|
||||
MessageFormat.format(JGitText.get().invalidDepth,
|
||||
|
@ -181,19 +182,19 @@ FetchV2Request parseFetchRequest(PacketLineIn pckIn)
|
|||
JGitText.get().deepenNotWithDeepen);
|
||||
}
|
||||
reqBuilder.setDepth(parsedDepth);
|
||||
} else if (line.startsWith("deepen-not ")) { //$NON-NLS-1$
|
||||
reqBuilder.addDeepenNotRef(line.substring(11));
|
||||
} else if (line2.startsWith("deepen-not ")) { //$NON-NLS-1$
|
||||
reqBuilder.addDeepenNotRef(line2.substring(11));
|
||||
if (reqBuilder.getDepth() != 0) {
|
||||
throw new PackProtocolException(
|
||||
JGitText.get().deepenNotWithDeepen);
|
||||
}
|
||||
} else if (line.equals(OPTION_DEEPEN_RELATIVE)) {
|
||||
} else if (line2.equals(OPTION_DEEPEN_RELATIVE)) {
|
||||
reqBuilder.addClientCapability(OPTION_DEEPEN_RELATIVE);
|
||||
} else if (line.startsWith("deepen-since ")) { //$NON-NLS-1$
|
||||
int ts = Integer.parseInt(line.substring(13));
|
||||
} else if (line2.startsWith("deepen-since ")) { //$NON-NLS-1$
|
||||
int ts = Integer.parseInt(line2.substring(13));
|
||||
if (ts <= 0) {
|
||||
throw new PackProtocolException(MessageFormat
|
||||
.format(JGitText.get().invalidTimestamp, line));
|
||||
.format(JGitText.get().invalidTimestamp, line2));
|
||||
}
|
||||
if (reqBuilder.getDepth() != 0) {
|
||||
throw new PackProtocolException(
|
||||
|
@ -201,17 +202,17 @@ FetchV2Request parseFetchRequest(PacketLineIn pckIn)
|
|||
}
|
||||
reqBuilder.setDeepenSince(ts);
|
||||
} else if (transferConfig.isAllowFilter()
|
||||
&& line.startsWith(OPTION_FILTER + ' ')) {
|
||||
&& line2.startsWith(OPTION_FILTER + ' ')) {
|
||||
if (filterReceived) {
|
||||
throw new PackProtocolException(
|
||||
JGitText.get().tooManyFilters);
|
||||
}
|
||||
filterReceived = true;
|
||||
reqBuilder.setFilterSpec(FilterSpec.fromFilterLine(
|
||||
line.substring(OPTION_FILTER.length() + 1)));
|
||||
line2.substring(OPTION_FILTER.length() + 1)));
|
||||
} else {
|
||||
throw new PackProtocolException(MessageFormat
|
||||
.format(JGitText.get().unexpectedPacketLine, line));
|
||||
.format(JGitText.get().unexpectedPacketLine, line2));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -253,16 +254,16 @@ LsRefsV2Request parseLsRefsRequest(PacketLineIn pckIn)
|
|||
.format(JGitText.get().unexpectedPacketLine, line));
|
||||
}
|
||||
|
||||
while ((line = pckIn.readString()) != PacketLineIn.END) {
|
||||
if (line.equals("peel")) { //$NON-NLS-1$
|
||||
for (String line2 : pckIn.readStrings()) {
|
||||
if (line2.equals("peel")) { //$NON-NLS-1$
|
||||
builder.setPeel(true);
|
||||
} else if (line.equals("symrefs")) { //$NON-NLS-1$
|
||||
} else if (line2.equals("symrefs")) { //$NON-NLS-1$
|
||||
builder.setSymrefs(true);
|
||||
} else if (line.startsWith("ref-prefix ")) { //$NON-NLS-1$
|
||||
prefixes.add(line.substring("ref-prefix ".length())); //$NON-NLS-1$
|
||||
} else if (line2.startsWith("ref-prefix ")) { //$NON-NLS-1$
|
||||
prefixes.add(line2.substring("ref-prefix ".length())); //$NON-NLS-1$
|
||||
} else {
|
||||
throw new PackProtocolException(MessageFormat
|
||||
.format(JGitText.get().unexpectedPacketLine, line));
|
||||
.format(JGitText.get().unexpectedPacketLine, line2));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue