]> source.dussan.org Git - jgit.git/commitdiff
Use one ObjectReader for WalkFetchConnection 97/997/1
authorShawn O. Pearce <spearce@spearce.org>
Tue, 29 Jun 2010 01:31:29 +0000 (18:31 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Tue, 29 Jun 2010 01:47:33 +0000 (18:47 -0700)
Instead of creating new ObjectReader for each walker, use one for
the entire connection and delegate reads through it.

Change-Id: I7f0a2ec8c9fe60b095a7be77dc423a2ff8b443a3
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
org.eclipse.jgit/src/org/eclipse/jgit/transport/WalkFetchConnection.java

index 89dd6b490439239cf8ab375cd379fad4953dada7..faea378e9aa6dd47e539b3a587fda5c926a12a48 100644 (file)
@@ -70,6 +70,7 @@ import org.eclipse.jgit.lib.MutableObjectId;
 import org.eclipse.jgit.lib.ObjectChecker;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectInserter;
+import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.Repository;
@@ -181,11 +182,15 @@ class WalkFetchConnection extends BaseFetchConnection {
        /** Inserter to write objects onto {@link #local}. */
        private final ObjectInserter inserter;
 
+       /** Inserter to read objects from {@link #local}. */
+       private final ObjectReader reader;
+
        WalkFetchConnection(final WalkTransport t, final WalkRemoteObjectDatabase w) {
                Transport wt = (Transport)t;
                local = wt.local;
                objCheck = wt.isCheckFetchedObjects() ? new ObjectChecker() : null;
                inserter = local.newObjectInserter();
+               reader = local.newObjectReader();
 
                remotes = new ArrayList<WalkRemoteObjectDatabase>();
                remotes.add(w);
@@ -202,9 +207,9 @@ class WalkFetchConnection extends BaseFetchConnection {
                fetchErrors = new HashMap<ObjectId, List<Throwable>>();
                packLocks = new ArrayList<PackLock>(4);
 
-               revWalk = new RevWalk(local);
+               revWalk = new RevWalk(reader);
                revWalk.setRetainBody(false);
-               treeWalk = new TreeWalk(local);
+               treeWalk = new TreeWalk(reader);
                COMPLETE = revWalk.newFlag("COMPLETE");
                IN_WORK_QUEUE = revWalk.newFlag("IN_WORK_QUEUE");
                LOCALLY_SEEN = revWalk.newFlag("LOCALLY_SEEN");
@@ -243,6 +248,7 @@ class WalkFetchConnection extends BaseFetchConnection {
        @Override
        public void close() {
                inserter.release();
+               reader.release();
                for (final RemotePack p : unfetchedPacks) {
                        if (p.tmpIdx != null)
                                p.tmpIdx.delete();
@@ -314,10 +320,17 @@ class WalkFetchConnection extends BaseFetchConnection {
        }
 
        private void processBlob(final RevObject obj) throws TransportException {
-               if (!local.hasObject(obj))
-                       throw new TransportException(MessageFormat.format(JGitText.get().cannotReadBlob, obj.name()),
-                                       new MissingObjectException(obj, Constants.TYPE_BLOB));
-               obj.add(COMPLETE);
+               try {
+                       if (reader.has(obj, Constants.OBJ_BLOB))
+                               obj.add(COMPLETE);
+                       else
+                               throw new TransportException(MessageFormat.format(JGitText
+                                               .get().cannotReadBlob, obj.name()),
+                                               new MissingObjectException(obj, Constants.TYPE_BLOB));
+               } catch (IOException error) {
+                       throw new TransportException(MessageFormat.format(
+                                       JGitText.get().cannotReadBlob, obj.name()), error);
+               }
        }
 
        private void processTree(final RevObject obj) throws TransportException {
@@ -374,7 +387,7 @@ class WalkFetchConnection extends BaseFetchConnection {
 
        private void downloadObject(final ProgressMonitor pm, final AnyObjectId id)
                        throws TransportException {
-               if (local.hasObject(id))
+               if (alreadyHave(id))
                        return;
 
                for (;;) {
@@ -461,6 +474,15 @@ class WalkFetchConnection extends BaseFetchConnection {
                }
        }
 
+       private boolean alreadyHave(final AnyObjectId id) throws TransportException {
+               try {
+                       return reader.has(id);
+               } catch (IOException error) {
+                       throw new TransportException(MessageFormat.format(
+                                       JGitText.get().cannotReadObject, id.name()), error);
+               }
+       }
+
        private boolean downloadPackedObject(final ProgressMonitor monitor,
                        final AnyObjectId id) throws TransportException {
                // Search for the object in a remote pack whose index we have,
@@ -522,7 +544,7 @@ class WalkFetchConnection extends BaseFetchConnection {
                                packItr.remove();
                        }
 
-                       if (!local.hasObject(id)) {
+                       if (!alreadyHave(id)) {
                                // What the hell? This pack claimed to have
                                // the object, but after indexing we didn't
                                // actually find it in the pack.