FetchV2Request round up (doneReceived, renamings)

Make "doneReceived" a member of the fetch request. It indicates if the
"done" line has been received (so it makes sense there) and makes all
the code after the parsing depend only on the request.

Rename "shallowExcludeRefs" to "deepenNot". Those refs come in
"deepen-not" lines in the protocol, and this name makes clearer the
intention.

Change-Id: I7bec65de04930277266491d278de7c3af7d8cbe6
Signed-off-by: Ivan Frade <ifrade@google.com>
This commit is contained in:
Ivan Frade 2018-08-27 10:14:27 -07:00
parent 74d41be0d1
commit 04d27cf70f
2 changed files with 46 additions and 26 deletions

View File

@ -71,7 +71,7 @@ public final class FetchV2Request {
private final int shallowSince; private final int shallowSince;
private final List<String> shallowExcludeRefs; private final List<String> deepenNotRefs;
private final int depth; private final int depth;
@ -79,19 +79,22 @@ public final class FetchV2Request {
private final Set<String> options; private final Set<String> options;
private final boolean doneReceived;
private FetchV2Request(List<ObjectId> peerHas, private FetchV2Request(List<ObjectId> peerHas,
TreeMap<String, ObjectId> wantedRefs, Set<ObjectId> wantsIds, TreeMap<String, ObjectId> wantedRefs, Set<ObjectId> wantsIds,
Set<ObjectId> clientShallowCommits, int shallowSince, Set<ObjectId> clientShallowCommits, int shallowSince,
List<String> shallowExcludeRefs, int depth, long filterBlobLimit, List<String> deependNotRefs, int depth, long filterBlobLimit,
Set<String> options) { boolean doneReceived, Set<String> options) {
this.peerHas = peerHas; this.peerHas = peerHas;
this.wantedRefs = wantedRefs; this.wantedRefs = wantedRefs;
this.wantsIds = wantsIds; this.wantsIds = wantsIds;
this.clientShallowCommits = clientShallowCommits; this.clientShallowCommits = clientShallowCommits;
this.shallowSince = shallowSince; this.shallowSince = shallowSince;
this.shallowExcludeRefs = shallowExcludeRefs; this.deepenNotRefs = deependNotRefs;
this.depth = depth; this.depth = depth;
this.filterBlobLimit = filterBlobLimit; this.filterBlobLimit = filterBlobLimit;
this.doneReceived = doneReceived;
this.options = options; this.options = options;
} }
@ -135,8 +138,8 @@ Set<ObjectId> getClientShallowCommits() {
* The value in a "deepen-since" line in the request, indicating the * The value in a "deepen-since" line in the request, indicating the
* timestamp where to stop fetching/cloning. * timestamp where to stop fetching/cloning.
* *
* @return timestamp where to stop the shallow fetch/clone. Defaults to 0 if * @return timestamp in seconds since the epoch, where to stop the shallow
* not set in the request * fetch/clone. Defaults to 0 if not set in the request.
*/ */
int getShallowSince() { int getShallowSince() {
return shallowSince; return shallowSince;
@ -146,8 +149,8 @@ int getShallowSince() {
* @return the refs in "deepen-not" lines in the request. * @return the refs in "deepen-not" lines in the request.
*/ */
@NonNull @NonNull
List<String> getShallowExcludeRefs() { List<String> getDeepenNotRefs() {
return shallowExcludeRefs; return deepenNotRefs;
} }
/** /**
@ -164,6 +167,13 @@ long getFilterBlobLimit() {
return filterBlobLimit; return filterBlobLimit;
} }
/**
* @return true if the request had a "done" line
*/
boolean wasDoneReceived() {
return doneReceived;
}
/** /**
* Options that tune the expected response from the server, like * Options that tune the expected response from the server, like
* "thin-pack", "no-progress" or "ofs-delta" * "thin-pack", "no-progress" or "ofs-delta"
@ -194,7 +204,7 @@ static final class Builder {
Set<ObjectId> clientShallowCommits = new HashSet<>(); Set<ObjectId> clientShallowCommits = new HashSet<>();
List<String> shallowExcludeRefs = new ArrayList<>(); List<String> deepenNotRefs = new ArrayList<>();
Set<String> options = new HashSet<>(); Set<String> options = new HashSet<>();
@ -204,6 +214,8 @@ static final class Builder {
long filterBlobLimit = -1; long filterBlobLimit = -1;
boolean doneReceived;
private Builder() { private Builder() {
} }
@ -282,16 +294,16 @@ int getDepth() {
/** /**
* @return if there has been any "deepen not" line in the request * @return if there has been any "deepen not" line in the request
*/ */
boolean hasShallowExcludeRefs() { boolean hasDeepenNotRefs() {
return shallowExcludeRefs.size() > 0; return !deepenNotRefs.isEmpty();
} }
/** /**
* @param shallowExcludeRef reference in a "deepen not" line * @param deepenNotRef reference in a "deepen not" line
* @return the builder * @return the builder
*/ */
Builder addShallowExcludeRefs(String shallowExcludeRef) { Builder addDeepenNotRef(String deepenNotRef) {
this.shallowExcludeRefs.add(shallowExcludeRef); this.deepenNotRefs.add(deepenNotRef);
return this; return this;
} }
@ -323,13 +335,22 @@ Builder setFilterBlobLimit(long filterBlobLimit) {
return this; return this;
} }
/**
* Mark that the "done" line has been received.
*
* @return the builder
*/
Builder setDoneReceived() {
this.doneReceived = true;
return this;
}
/** /**
* @return Initialized fetch request * @return Initialized fetch request
*/ */
FetchV2Request build() { FetchV2Request build() {
return new FetchV2Request(peerHas, wantedRefs, wantsIds, return new FetchV2Request(peerHas, wantedRefs, wantsIds,
clientShallowCommits, shallowSince, shallowExcludeRefs, clientShallowCommits, shallowSince, deepenNotRefs,
depth, filterBlobLimit, options); depth, filterBlobLimit, doneReceived, options);
} }
} }
} }

View File

@ -311,7 +311,7 @@ public Set<String> getOptions() {
* not to send using --shallow-exclude. Cannot be non-empty if depth is * not to send using --shallow-exclude. Cannot be non-empty if depth is
* nonzero. * nonzero.
*/ */
private List<String> shallowExcludeRefs = new ArrayList<>(); private List<String> deepenNotRefs = new ArrayList<>();
/** Commit time of the oldest common commit, in seconds. */ /** Commit time of the oldest common commit, in seconds. */
private int oldestTime; private int oldestTime;
@ -963,7 +963,6 @@ private void fetchV2() throws IOException {
} }
String line; String line;
boolean doneReceived = false;
// Currently, we do not support any capabilities, so the next // Currently, we do not support any capabilities, so the next
// line is DELIM. // line is DELIM.
@ -997,7 +996,7 @@ private void fetchV2() throws IOException {
} else if (line.startsWith("have ")) { //$NON-NLS-1$ } else if (line.startsWith("have ")) { //$NON-NLS-1$
reqBuilder.addPeerHas(ObjectId.fromString(line.substring(5))); reqBuilder.addPeerHas(ObjectId.fromString(line.substring(5)));
} else if (line.equals("done")) { //$NON-NLS-1$ } else if (line.equals("done")) { //$NON-NLS-1$
doneReceived = true; reqBuilder.setDoneReceived();
} else if (line.equals(OPTION_THIN_PACK)) { } else if (line.equals(OPTION_THIN_PACK)) {
reqBuilder.addOption(OPTION_THIN_PACK); reqBuilder.addOption(OPTION_THIN_PACK);
} else if (line.equals(OPTION_NO_PROGRESS)) { } else if (line.equals(OPTION_NO_PROGRESS)) {
@ -1021,13 +1020,13 @@ private void fetchV2() throws IOException {
throw new PackProtocolException( throw new PackProtocolException(
JGitText.get().deepenSinceWithDeepen); JGitText.get().deepenSinceWithDeepen);
} }
if (reqBuilder.hasShallowExcludeRefs()) { if (reqBuilder.hasDeepenNotRefs()) {
throw new PackProtocolException( throw new PackProtocolException(
JGitText.get().deepenNotWithDeepen); JGitText.get().deepenNotWithDeepen);
} }
reqBuilder.setDepth(parsedDepth); reqBuilder.setDepth(parsedDepth);
} else if (line.startsWith("deepen-not ")) { //$NON-NLS-1$ } else if (line.startsWith("deepen-not ")) { //$NON-NLS-1$
reqBuilder.addShallowExcludeRefs(line.substring(11)); reqBuilder.addDeepenNotRef(line.substring(11));
if (reqBuilder.getDepth() != 0) { if (reqBuilder.getDepth() != 0) {
throw new PackProtocolException( throw new PackProtocolException(
JGitText.get().deepenNotWithDeepen); JGitText.get().deepenNotWithDeepen);
@ -1072,7 +1071,7 @@ private void fetchV2() throws IOException {
depth = req.getDepth(); depth = req.getDepth();
shallowSince = req.getShallowSince(); shallowSince = req.getShallowSince();
filterBlobLimit = req.getFilterBlobLimit(); filterBlobLimit = req.getFilterBlobLimit();
shallowExcludeRefs = req.getShallowExcludeRefs(); deepenNotRefs = req.getDeepenNotRefs();
boolean sectionSent = false; boolean sectionSent = false;
@Nullable List<ObjectId> shallowCommits = null; @Nullable List<ObjectId> shallowCommits = null;
@ -1082,14 +1081,14 @@ private void fetchV2() throws IOException {
verifyClientShallow(req.getClientShallowCommits()); verifyClientShallow(req.getClientShallowCommits());
} }
if (req.getDepth() != 0 || req.getShallowSince() != 0 if (req.getDepth() != 0 || req.getShallowSince() != 0
|| !req.getShallowExcludeRefs().isEmpty()) { || !req.getDeepenNotRefs().isEmpty()) {
shallowCommits = new ArrayList<>(); shallowCommits = new ArrayList<>();
processShallow(shallowCommits, unshallowCommits, false); processShallow(shallowCommits, unshallowCommits, false);
} }
if (!req.getClientShallowCommits().isEmpty()) if (!req.getClientShallowCommits().isEmpty())
walk.assumeShallow(req.getClientShallowCommits()); walk.assumeShallow(req.getClientShallowCommits());
if (doneReceived) { if (req.wasDoneReceived()) {
processHaveLines(req.getPeerHas(), ObjectId.zeroId(), processHaveLines(req.getPeerHas(), ObjectId.zeroId(),
new PacketLineOut(NullOutputStream.INSTANCE)); new PacketLineOut(NullOutputStream.INSTANCE));
} else { } else {
@ -1109,7 +1108,7 @@ private void fetchV2() throws IOException {
sectionSent = true; sectionSent = true;
} }
if (doneReceived || okToGiveUp()) { if (req.wasDoneReceived() || okToGiveUp()) {
if (shallowCommits != null) { if (shallowCommits != null) {
if (sectionSent) if (sectionSent)
pckOut.writeDelim(); pckOut.writeDelim();
@ -1252,7 +1251,7 @@ private void processShallow(@Nullable List<ObjectId> shallowCommits,
boolean writeToPckOut) throws IOException { boolean writeToPckOut) throws IOException {
if (options.contains(OPTION_DEEPEN_RELATIVE) || if (options.contains(OPTION_DEEPEN_RELATIVE) ||
shallowSince != 0 || shallowSince != 0 ||
!shallowExcludeRefs.isEmpty()) { !deepenNotRefs.isEmpty()) {
// TODO(jonathantanmy): Implement deepen-relative, deepen-since, // TODO(jonathantanmy): Implement deepen-relative, deepen-since,
// and deepen-not. // and deepen-not.
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();