]> source.dussan.org Git - jgit.git/commitdiff
Don't check lastModified, length on folders for submodules 86/78586/4
authorChristian Halstrick <christian.halstrick@sap.com>
Sun, 7 Aug 2016 17:59:49 +0000 (18:59 +0100)
committerAndrey Loskutov <loskutov@gmx.de>
Wed, 24 Aug 2016 07:05:41 +0000 (09:05 +0200)
The metadata comparison of submodules is not reliable because of the
last modified timestamp and directory length.

Bug: 498759
Change-Id: If5db69ef3868e475ac477d3e8a7750b268799b0c

org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java

index c8de3de83c0caedd895bae8e6fc24f70fd01fe2e..9a3fa8060bf8d37a02fc8bb997c79c8794327673 100644 (file)
@@ -268,7 +268,9 @@ public abstract class WorkingTreeIterator extends AbstractTreeIterator {
                                                        DirCacheIterator.class);
                        if (i != null) {
                                DirCacheEntry ent = i.getDirCacheEntry();
-                               if (ent != null && compareMetadata(ent) == MetadataDiff.EQUAL) {
+                               if (ent != null && compareMetadata(ent) == MetadataDiff.EQUAL
+                                               && ((ent.getFileMode().getBits()
+                                                               & FileMode.TYPE_MASK) != FileMode.TYPE_GITLINK)) {
                                        contentIdOffset = i.idOffset();
                                        contentIdFromPtr = ptr;
                                        return contentId = i.idBuffer();
@@ -843,10 +845,15 @@ public abstract class WorkingTreeIterator extends AbstractTreeIterator {
                if (entry.isUpdateNeeded())
                        return MetadataDiff.DIFFER_BY_METADATA;
 
-               if (!entry.isSmudged() && entry.getLength() != (int) getEntryLength())
+               if (isModeDifferent(entry.getRawMode()))
                        return MetadataDiff.DIFFER_BY_METADATA;
 
-               if (isModeDifferent(entry.getRawMode()))
+               // Don't check for length or lastmodified on folders
+               int type = mode & FileMode.TYPE_MASK;
+               if (type == FileMode.TYPE_TREE || type == FileMode.TYPE_GITLINK)
+                       return MetadataDiff.EQUAL;
+
+               if (!entry.isSmudged() && entry.getLength() != (int) getEntryLength())
                        return MetadataDiff.DIFFER_BY_METADATA;
 
                // Git under windows only stores seconds so we round the timestamp
@@ -915,6 +922,9 @@ public abstract class WorkingTreeIterator extends AbstractTreeIterator {
                        // Lets do a content check
                        return contentCheck(entry, reader);
                case EQUAL:
+                       if (mode == FileMode.SYMLINK.getBits()) {
+                               return contentCheck(entry, reader);
+                       }
                        return false;
                case DIFFER_BY_METADATA:
                        if (mode == FileMode.SYMLINK.getBits())