From 5d3a6706eef2b81ba6591b883619721cdff80ee9 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Wed, 24 Sep 2008 12:05:53 -0700 Subject: [PATCH] Use ".have" advertisements during push to reduce what is transferred If a remote peer has an alternate object database it might show the refs of the alternate repositories by sending special ".have" ref lines in the advertisement. These can be used to compute a better common base, avoiding uploading objects which the remote side has physically available (and complete), but which aren't in the ref space of the remote repository. As most repositories have more than one ref, there can be more than one ".have" line, and the same object might appear more than once. Collecting these into a special "additionalHaves" set avoids them from showing up in the advertised refs collection. PackWriter already gracefully skips over remoteObjects that we don't have locally. We can simply include the entire set of additionalHaves when we start creating a pack for the push transfer and PackWriter will seek the best common base available. Anything advertised that we lack will be silently skipped. Signed-off-by: Shawn O. Pearce Signed-off-by: Robin Rosenberg --- .../src/org/spearce/jgit/transport/BasePackConnection.java | 7 ++++++- .../src/org/spearce/jgit/transport/BasePackPushConnection.java | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/BasePackConnection.java b/org.spearce.jgit/src/org/spearce/jgit/transport/BasePackConnection.java index 2d145a63..e5fc0405 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/transport/BasePackConnection.java +++ b/org.spearce.jgit/src/org/spearce/jgit/transport/BasePackConnection.java @@ -93,6 +93,9 @@ abstract class BasePackConnection extends BaseConnection { /** Capability tokens advertised by the remote side. */ private final Set remoteCapablities = new HashSet(); + /** Extra objects the remote has, but which aren't offered as refs. */ + protected final Set additionalHaves = new HashSet(); + BasePackConnection(final PackTransport packTransport) { local = packTransport.local; uri = packTransport.uri; @@ -160,7 +163,9 @@ abstract class BasePackConnection extends BaseConnection { } final ObjectId id = ObjectId.fromString(line.substring(0, 40)); - if (name.endsWith("^{}")) { + if (name.equals(".have")) { + additionalHaves.add(id); + } else if (name.endsWith("^{}")) { name = name.substring(0, name.length() - 3); final Ref prior = avail.get(name); if (prior == null) diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/BasePackPushConnection.java b/org.spearce.jgit/src/org/spearce/jgit/transport/BasePackPushConnection.java index 25946239..17f6915c 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/transport/BasePackPushConnection.java +++ b/org.spearce.jgit/src/org/spearce/jgit/transport/BasePackPushConnection.java @@ -195,6 +195,7 @@ class BasePackPushConnection extends BasePackConnection implements for (final Ref r : getRefs()) remoteObjects.add(r.getObjectId()); + remoteObjects.addAll(additionalHaves); for (final RemoteRefUpdate r : refUpdates.values()) { if (!ObjectId.zeroId().equals(r.getNewObjectId())) newObjects.add(r.getNewObjectId()); -- 2.11.4.GIT