]> source.dussan.org Git - jgit.git/commitdiff
Update CachedObjectDirectory when inserting objects 60/1760/1
authorShawn O. Pearce <spearce@spearce.org>
Mon, 18 Oct 2010 06:10:47 +0000 (23:10 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Mon, 18 Oct 2010 06:10:47 +0000 (23:10 -0700)
If an ObjectInserter is created from a CachedObjectDirectory, we need
to ensure the cache is updated whenever a new loose object is actually
added to the loose objects directory, otherwise a future read from an
ObjectReader on the CachedObjectDirectory might not be able to open
the newly created object.

We mostly had the infrastructure in place to implement this due to the
injection of unpacked large deltas, but we didn't have a way to pass
the ObjectId from ObjectDirectoryInserter to CachedObjectDirectory,
because the inserter was using the underlying ObjectDirectory and not
the CachedObjectDirectory.  Redirecting to CachedObjectDirectory
ensures the cache is updated.

Change-Id: I1f7bdfacc7ad77ebdb885f655e549cc570652225
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/CachedObjectDirectory.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileObjectDatabase.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectory.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryInserter.java

index 9bad71d8d70985712723207969d8b72fe5124447..9e137be8ba05b88788677076e2cfb9330126ae90 100644 (file)
@@ -50,6 +50,7 @@ import java.util.Set;
 
 import org.eclipse.jgit.lib.AbbreviatedObjectId;
 import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectDatabase;
 import org.eclipse.jgit.lib.ObjectId;
@@ -111,11 +112,6 @@ class CachedObjectDirectory extends FileObjectDatabase {
                // Don't close anything.
        }
 
-       @Override
-       public ObjectDirectoryInserter newInserter() {
-               return wrapped.newInserter();
-       }
-
        @Override
        public ObjectDatabase newCachedDatabase() {
                return this;
@@ -131,6 +127,11 @@ class CachedObjectDirectory extends FileObjectDatabase {
                return wrapped.getDirectory();
        }
 
+       @Override
+       Config getConfig() {
+               return wrapped.getConfig();
+       }
+
        @Override
        AlternateHandle[] myAlternates() {
                if (alts == null) {
index 8bd3751010e76e746b6206a579a683c40da14bde..4e9f5e9823228d537cdc55ae48b3a09c0edebcc3 100644 (file)
@@ -49,6 +49,7 @@ import java.util.Set;
 
 import org.eclipse.jgit.lib.AbbreviatedObjectId;
 import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.lib.ObjectDatabase;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectLoader;
@@ -67,7 +68,9 @@ abstract class FileObjectDatabase extends ObjectDatabase {
        }
 
        @Override
-       public abstract ObjectDirectoryInserter newInserter();
+       public ObjectDirectoryInserter newInserter() {
+               return new ObjectDirectoryInserter(this, getConfig());
+       }
 
        /**
         * Does the requested object exist in this database?
@@ -83,6 +86,23 @@ abstract class FileObjectDatabase extends ObjectDatabase {
                return hasObjectImpl1(objectId) || hasObjectImpl2(objectId.name());
        }
 
+       /**
+        * Compute the location of a loose object file.
+        *
+        * @param objectId
+        *            identity of the loose object to map to the directory.
+        * @return location of the object, if it were to exist as a loose object.
+        */
+       File fileFor(final AnyObjectId objectId) {
+               return fileFor(objectId.name());
+       }
+
+       File fileFor(final String objectName) {
+               final String d = objectName.substring(0, 2);
+               final String f = objectName.substring(2);
+               return new File(new File(getDirectory(), d), f);
+       }
+
        final boolean hasObjectImpl1(final AnyObjectId objectId) {
                if (hasObject1(objectId))
                        return true;
@@ -110,6 +130,8 @@ abstract class FileObjectDatabase extends ObjectDatabase {
        abstract void resolve(Set<ObjectId> matches, AbbreviatedObjectId id)
                        throws IOException;
 
+       abstract Config getConfig();
+
        /**
         * Open an object from this database.
         * <p>
index e7ccba0820fb38344c23bc16f259dccef1049c17..86e19f4c5d8037ca31a9f49a15432b9c1058cbbf 100644 (file)
@@ -204,14 +204,9 @@ public class ObjectDirectory extends FileObjectDatabase {
         *            identity of the loose object to map to the directory.
         * @return location of the object, if it were to exist as a loose object.
         */
+       @Override
        public File fileFor(final AnyObjectId objectId) {
-               return fileFor(objectId.name());
-       }
-
-       private File fileFor(final String objectName) {
-               final String d = objectName.substring(0, 2);
-               final String f = objectName.substring(2);
-               return new File(new File(objects, d), f);
+               return super.fileFor(objectId);
        }
 
        /**
@@ -515,6 +510,10 @@ public class ObjectDirectory extends FileObjectDatabase {
                return false;
        }
 
+       Config getConfig() {
+               return config;
+       }
+
        private void insertPack(final PackFile pf) {
                PackList o, n;
                do {
index 074ebb9617486c90590670ee122142b6574d47c8..16cb8aa35cd5d0a7e1b8a7ef4435fce0eb516016 100644 (file)
@@ -66,13 +66,13 @@ import org.eclipse.jgit.lib.ObjectInserter;
 
 /** Creates loose objects in a {@link ObjectDirectory}. */
 class ObjectDirectoryInserter extends ObjectInserter {
-       private final ObjectDirectory db;
+       private final FileObjectDatabase db;
 
        private final Config config;
 
        private Deflater deflate;
 
-       ObjectDirectoryInserter(final ObjectDirectory dest, final Config cfg) {
+       ObjectDirectoryInserter(final FileObjectDatabase dest, final Config cfg) {
                db = dest;
                config = cfg;
        }