diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java index ca5f4fe61..32d4aac75 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java @@ -1308,6 +1308,18 @@ void carryFlagsImpl(final RevCommit c) { RevCommit.carryFlags(c, carry); } + /** + * Assume additional commits are shallow (have no parents). + * + * @param ids + * commits that should be treated as shallow commits, in addition + * to any commits already known to be shallow by the repository. + */ + public void assumeShallow(Collection ids) { + for (ObjectId id : ids) + lookupCommit(id).parents = RevCommit.NO_PARENTS; + } + void initializeShallowCommits() throws IOException { if (shallowCommitsInitialized) throw new IllegalStateException( 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 0cc6946b1..b007f2b51 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java @@ -684,6 +684,8 @@ else if (requestValidator instanceof AnyRequestValidator) if (depth != 0) processShallow(); + if (!clientShallowCommits.isEmpty()) + walk.assumeShallow(clientShallowCommits); sendPack = negotiate(); } catch (PackProtocolException err) { reportErrorDuringNegotiate(err.getMessage()); @@ -756,7 +758,7 @@ private void processShallow() throws IOException { // Commits not on the boundary which are shallow in the client // need to become unshallowed - if (c.getDepth() < depth && clientShallowCommits.contains(c)) { + if (c.getDepth() < depth && clientShallowCommits.remove(c)) { unshallowCommits.add(c.copy()); pckOut.writeString("unshallow " + c.name()); //$NON-NLS-1$ } @@ -1350,7 +1352,7 @@ private void sendPack(final boolean sideband) throws IOException { try { pw.setIndexDisabled(true); pw.setUseCachedPacks(true); - pw.setUseBitmaps(true); + pw.setUseBitmaps(depth == 0 && clientShallowCommits.isEmpty()); pw.setReuseDeltaCommits(true); pw.setDeltaBaseAsOffset(options.contains(OPTION_OFS_DELTA)); pw.setThin(options.contains(OPTION_THIN_PACK));