From 530924471320f5e2a53e90c48821d9f09e91e071 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Fri, 18 Jun 2010 20:23:06 -0700 Subject: [PATCH] Move additional have enumeration to Repository This permits the repository implementation to know what its alternates concept means, and avoids needing to expose finer details about the ObjectDatabase to network code like the RefAdvertiser. Change-Id: Ic6d173f300cb72de34519c7607cf7b0ff3ea6882 Signed-off-by: Shawn O. Pearce --- .../src/org/eclipse/jgit/lib/Repository.java | 25 +++++++++++++++++++ .../eclipse/jgit/transport/RefAdvertiser.java | 19 +++----------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java index e0f0a6c89..d482c21fb 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java @@ -1021,6 +1021,31 @@ public String getBranch() throws IOException { return name; } + /** + * Objects known to exist but not expressed by {@link #getAllRefs()}. + *

+ * When a repository borrows objects from another repository, it can + * advertise that it safely has that other repository's references, without + * exposing any other details about the other repository. This may help + * a client trying to push changes avoid pushing more than it needs to. + * + * @return unmodifiable collection of other known objects. + */ + public Set getAdditionalHaves() { + HashSet r = new HashSet(); + for (ObjectDatabase d : objectDatabase.getAlternates()) { + if (d instanceof AlternateRepositoryDatabase) { + Repository repo; + + repo = ((AlternateRepositoryDatabase) d).getRepository(); + for (Ref ref : repo.getAllRefs().values()) + r.add(ref.getObjectId()); + r.addAll(repo.getAdditionalHaves()); + } + } + return r; + } + /** * Get a ref by name. * diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java index 694a2e0f1..532cc11a7 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/RefAdvertiser.java @@ -49,13 +49,11 @@ import java.util.Set; import java.util.SortedMap; -import org.eclipse.jgit.lib.AlternateRepositoryDatabase; import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.lib.ObjectDatabase; +import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.RefComparator; -import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevFlag; import org.eclipse.jgit.revwalk.RevObject; import org.eclipse.jgit.revwalk.RevTag; @@ -217,19 +215,8 @@ public void advertiseHave(AnyObjectId id) throws IOException { * advertisement record. */ public void includeAdditionalHaves() throws IOException { - additionalHaves(walk.getRepository().getObjectDatabase()); - } - - private void additionalHaves(final ObjectDatabase db) throws IOException { - if (db instanceof AlternateRepositoryDatabase) - additionalHaves(((AlternateRepositoryDatabase) db).getRepository()); - for (ObjectDatabase alt : db.getAlternates()) - additionalHaves(alt); - } - - private void additionalHaves(final Repository alt) throws IOException { - for (final Ref r : alt.getAllRefs().values()) - advertiseHave(r.getObjectId()); + for (ObjectId id : walk.getRepository().getAdditionalHaves()) + advertiseHave(id); } /** @return true if no advertisements have been sent yet. */