]> source.dussan.org Git - jgit.git/commitdiff
Fix idOffset when the working tree iterator matches a dircache entry 31/7231/4
authorRobin Rosenberg <robin.rosenberg@dewire.com>
Wed, 15 Aug 2012 12:33:16 +0000 (14:33 +0200)
committerRobin Rosenberg <robin.rosenberg@dewire.com>
Wed, 15 Aug 2012 18:20:48 +0000 (20:20 +0200)
idOffset is not zero when idBuffer comes from blob in the dircache

Change-Id: Iff768422cba140a5d6a776e2c627b852f079c1da

org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorTest.java
org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java

index 2cdaea28de19110cc3987de655d29faad49f235a..209b2b83772b3ce76c69408c1258cd2b7344a826 100644 (file)
@@ -197,6 +197,31 @@ public class FileTreeIteratorTest extends RepositoryTestCase {
                assertEquals(expect, top.getEntryObjectId());
        }
 
+       @Test
+       public void testDirCacheMatchingId() throws Exception {
+               File f = writeTrashFile("file", "content");
+               Git git = new Git(db);
+               writeTrashFile("file", "content");
+               fsTick(f);
+               git.add().addFilepattern("file").call();
+               DirCacheEntry dce = db.readDirCache().getEntry("file");
+               TreeWalk tw = new TreeWalk(db);
+               FileTreeIterator fti = new FileTreeIterator(trash, db.getFS(), db
+                               .getConfig().get(WorkingTreeOptions.KEY));
+               tw.addTree(fti);
+               DirCacheIterator dci = new DirCacheIterator(db.readDirCache());
+               tw.addTree(dci);
+               fti.setDirCacheIterator(tw, 1);
+               while (tw.next() && !tw.getPathString().equals("file")) {
+                       //
+               }
+               assertEquals(MetadataDiff.EQUAL, fti.compareMetadata(dce));
+               ObjectId fromRaw = ObjectId.fromRaw(fti.idBuffer(), fti.idOffset());
+               assertEquals("6b584e8ece562ebffc15d38808cd6b98fc3d97ea",
+                               fromRaw.getName());
+               assertFalse(fti.isModified(dce, false));
+       }
+
        @Test
        public void testIsModifiedSymlink() throws Exception {
                File f = writeTrashFile("symlink", "content");
index ebe9f73fbdd992c7fb661259a9fc0b0a736e038d..8d0555bf959823236d0dfe44cccc4615d581f26b 100644 (file)
@@ -131,6 +131,9 @@ public abstract class WorkingTreeIterator extends AbstractTreeIterator {
        /** Cached canonical length, initialized from {@link #idBuffer()} */
        private long canonLen = -1;
 
+       /** The offset of the content id in {@link #idBuffer()} */
+       private int contentIdOffset;
+
        /**
         * Create a new iterator with no parent.
         *
@@ -234,11 +237,14 @@ public abstract class WorkingTreeIterator extends AbstractTreeIterator {
                                        DirCacheIterator.class);
                        if (i != null) {
                                DirCacheEntry ent = i.getDirCacheEntry();
-                               if (ent != null && compareMetadata(ent) == MetadataDiff.EQUAL)
-                                       return i.idBuffer();
+                               if (ent != null && compareMetadata(ent) == MetadataDiff.EQUAL) {
+                                       contentIdOffset = i.idOffset();
+                                       contentIdFromPtr = ptr;
+                                       return contentId = i.idBuffer();
+                               }
+                               contentIdOffset = 0;
                        }
                }
-
                switch (mode & FileMode.TYPE_MASK) {
                case FileMode.TYPE_FILE:
                        contentIdFromPtr = ptr;
@@ -427,7 +433,7 @@ public abstract class WorkingTreeIterator extends AbstractTreeIterator {
 
        @Override
        public int idOffset() {
-               return 0;
+               return contentIdOffset;
        }
 
        @Override