diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java index eee121555..e9eb366f6 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java @@ -175,6 +175,8 @@ public class PackWriter { private boolean reuseDeltas; + private boolean reuseDeltaCommits; + private boolean thin; private boolean useCachedPacks; @@ -275,6 +277,27 @@ public void setDeltaBaseAsOffset(boolean deltaBaseAsOffset) { this.deltaBaseAsOffset = deltaBaseAsOffset; } + /** + * Check if the writer will reuse commits that are already stored as deltas. + * + * @return true if the writer would reuse commits stored as deltas, assuming + * delta reuse is already enabled. + */ + public boolean isReuseDeltaCommits() { + return reuseDeltaCommits; + } + + /** + * Set the writer to reuse existing delta versions of commits. + * + * @param reuse + * if true, the writer will reuse any commits stored as deltas. + * By default the writer does not reuse delta commits. + */ + public void setReuseDeltaCommits(boolean reuse) { + reuseDeltaCommits = reuse; + } + /** @return true if this writer is producing a thin pack. */ public boolean isThin() { return thin; @@ -1482,7 +1505,7 @@ else if (PACK_DELTA < nFmt && otp.isDeltaRepresentation()) } else nWeight = next.getWeight(); - if (nFmt == PACK_DELTA && reuseDeltas) { + if (nFmt == PACK_DELTA && reuseDeltas && reuseDeltaFor(otp)) { ObjectId baseId = next.getDeltaBase(); ObjectToPack ptr = objectsMap.get(baseId); if (ptr != null && !ptr.isEdge()) { @@ -1509,6 +1532,21 @@ else if (PACK_DELTA < nFmt && otp.isDeltaRepresentation()) otp.select(next); } + private boolean reuseDeltaFor(ObjectToPack otp) { + switch (otp.getType()) { + case Constants.OBJ_COMMIT: + return reuseDeltaCommits; + case Constants.OBJ_TREE: + return true; + case Constants.OBJ_BLOB: + return true; + case Constants.OBJ_TAG: + return false; + default: + return true; + } + } + /** Summary of how PackWriter created the pack. */ public static class Statistics { Set interestingObjects; 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 b7bf08c38..3e324d093 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java @@ -692,6 +692,7 @@ private void sendPack() throws IOException { final PackWriter pw = new PackWriter(cfg, walk.getObjectReader()); try { pw.setUseCachedPacks(true); + pw.setReuseDeltaCommits(true); pw.setDeltaBaseAsOffset(options.contains(OPTION_OFS_DELTA)); pw.setThin(options.contains(OPTION_THIN_PACK));