diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java index 16f85166d..9d331ad9e 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java @@ -710,11 +710,32 @@ public class PackWriter implements AutoCloseable { public void preparePack(ProgressMonitor countingMonitor, @NonNull Set want, @NonNull Set have) throws IOException { + preparePack(countingMonitor, + want, have, Collections. emptySet()); + } + + /** + * Prepare the list of objects to be written to the pack stream. + *

+ * Like {@link #preparePack(ProgressMonitor, Set, Set)} but also allows + * specifying commits that should not be walked past ("shallow" commits). + * The caller is responsible for filtering out commits that should not + * be shallow any more ("unshallow" commits as in {@link #setShallowPack}) + * from the shallow set. + * + * @since 4.5 + */ + public void preparePack(ProgressMonitor countingMonitor, + @NonNull Set want, + @NonNull Set have, + @NonNull Set shallow) throws IOException { ObjectWalk ow; - if (shallowPack) + if (shallowPack) { ow = new DepthWalk.ObjectWalk(reader, depth - 1); - else + } else { ow = new ObjectWalk(reader); + } + ow.assumeShallow(shallow); preparePack(countingMonitor, ow, want, have); } 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 fdadb61d1..d1fd67e97 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java @@ -1493,16 +1493,19 @@ public class UploadPack { pw.setTagTargets(tagTargets); } - if (depth > 0) + RevWalk rw = walk; + if (depth > 0) { pw.setShallowPack(depth, unshallowCommits); + rw = new DepthWalk.RevWalk(walk.getObjectReader(), depth - 1); + rw.assumeShallow(clientShallowCommits); + } - RevWalk rw = walk; if (wantAll.isEmpty()) { - pw.preparePack(pm, wantIds, commonBase); + pw.preparePack(pm, wantIds, commonBase, clientShallowCommits); } else { walk.reset(); - ObjectWalk ow = walk.toObjectWalkWithSameObjects(); + ObjectWalk ow = rw.toObjectWalkWithSameObjects(); pw.preparePack(pm, ow, wantAll, commonBase); rw = ow; }