diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsInserterTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsInserterTest.java index 11a092468..74790f72c 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsInserterTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsInserterTest.java @@ -45,6 +45,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.io.IOException; @@ -97,6 +98,7 @@ public void testReadFromInserterSmallObjects() throws IOException { assertEquals(0, db.getObjectDatabase().listPacks().size()); ObjectReader reader = ins.newReader(); + assertSame(ins, reader.getCreatedFromInserter()); assertEquals("foo", readString(reader.open(id1))); assertEquals("bar", readString(reader.open(id2))); assertEquals(0, db.getObjectDatabase().listPacks().size()); @@ -118,6 +120,7 @@ public void testReadFromInserterLargerObjects() throws IOException { assertEquals(0, db.getObjectDatabase().listPacks().size()); ObjectReader reader = ins.newReader(); + assertSame(ins, reader.getCreatedFromInserter()); assertTrue(Arrays.equals(data, readStream(reader.open(id1)))); assertEquals(0, db.getObjectDatabase().listPacks().size()); ins.flush(); @@ -136,6 +139,7 @@ public void testReadFromFallback() throws IOException { assertEquals(1, db.getObjectDatabase().listPacks().size()); ObjectReader reader = ins.newReader(); + assertSame(ins, reader.getCreatedFromInserter()); assertEquals("foo", readString(reader.open(id1))); assertEquals("bar", readString(reader.open(id2))); assertEquals(1, db.getObjectDatabase().listPacks().size()); @@ -154,6 +158,7 @@ public void testReaderResolve() throws IOException { assertFalse(abbr1.equals(abbr2)); ObjectReader reader = ins.newReader(); + assertSame(ins, reader.getCreatedFromInserter()); Collection objs; objs = reader.resolve(AbbreviatedObjectId.fromString(abbr1)); assertEquals(1, objs.size()); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java index e5ae9800f..f5673e83d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java @@ -600,6 +600,11 @@ public Set getShallowCommits() throws IOException { return ctx.getShallowCommits(); } + @Override + public ObjectInserter getCreatedFromInserter() { + return DfsInserter.this; + } + @Override public void close() { ctx.close(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java index fb411722b..9820e0ea3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java @@ -136,7 +136,7 @@ public PackParser newPackParser(InputStream in) throws IOException { @Override public ObjectReader newReader() { - return new WindowCursor(db); + return new WindowCursor(db, this); } @Override diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCursor.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCursor.java index a555e10d4..a2c0561ae 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCursor.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCursor.java @@ -53,6 +53,7 @@ import java.util.zip.DataFormatException; import java.util.zip.Inflater; +import org.eclipse.jgit.annotations.Nullable; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.errors.StoredObjectRepresentationNotAvailableException; @@ -69,6 +70,7 @@ import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.InflaterCache; import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.ObjectLoader; import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.ProgressMonitor; @@ -84,10 +86,20 @@ final class WindowCursor extends ObjectReader implements ObjectReuseAsIs { private DeltaBaseCache baseCache; + @Nullable + private final ObjectInserter createdFromInserter; + final FileObjectDatabase db; WindowCursor(FileObjectDatabase db) { this.db = db; + this.createdFromInserter = null; + } + + WindowCursor(FileObjectDatabase db, + @Nullable ObjectDirectoryInserter createdFromInserter) { + this.db = db; + this.createdFromInserter = createdFromInserter; } DeltaBaseCache getDeltaBaseCache() { @@ -329,6 +341,12 @@ int getStreamFileThreshold() { return WindowCache.getStreamFileThreshold(); } + @Override + @Nullable + public ObjectInserter getCreatedFromInserter() { + return createdFromInserter; + } + /** Release the current window cursor. */ @Override public void close() { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java index d9da65f03..4c51279d0 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java @@ -143,7 +143,18 @@ public PackParser newPackParser(InputStream in) throws IOException { } public ObjectReader newReader() { - return delegate().newReader(); + final ObjectReader dr = delegate().newReader(); + return new ObjectReader.Filter() { + @Override + protected ObjectReader delegate() { + return dr; + } + + @Override + public ObjectInserter getCreatedFromInserter() { + return ObjectInserter.Filter.this; + } + }; } public void flush() throws IOException { @@ -398,6 +409,9 @@ public abstract ObjectId insert(int objectType, long length, InputStream in) * visible to the repository. The returned reader should only be used from * the same thread as the inserter. Objects written by this inserter may not * be visible to {@code this.newReader().newReader()}. + *

+ * The returned reader should return this inserter instance from {@link + * ObjectReader#getCreatedFromInserter()}. * * @since 3.5 * @return reader for any object, including an object recently inserted by diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java index 99661a8d6..b23145d79 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectReader.java @@ -50,6 +50,7 @@ import java.util.List; import java.util.Set; +import org.eclipse.jgit.annotations.Nullable; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.internal.storage.pack.ObjectReuseAsIs; @@ -421,6 +422,17 @@ public BitmapIndex getBitmapIndex() throws IOException { return null; } + /** + * @return the {@link ObjectInserter} from which this reader was created + * using {@code inserter.newReader()}, or null if this reader was not + * created from an inserter. + * @since 4.4 + */ + @Nullable + public ObjectInserter getCreatedFromInserter() { + return null; + } + /** * Release any resources used by this reader. *

@@ -524,6 +536,12 @@ public BitmapIndex getBitmapIndex() throws IOException { return delegate().getBitmapIndex(); } + @Override + @Nullable + public ObjectInserter getCreatedFromInserter() { + return delegate().getCreatedFromInserter(); + } + @Override public void close() { delegate().close();