diff options
author | Christian Halstrick <christian.halstrick@sap.com> | 2016-08-07 18:59:49 +0100 |
---|---|---|
committer | Andrey Loskutov <loskutov@gmx.de> | 2016-08-24 09:05:41 +0200 |
commit | da9eef85e7fff1c1c64c4302b897d20aff24b448 (patch) | |
tree | 0587f83a0b49ca1bdb9f50324cf173d553c13803 | |
parent | b8260b5e790c839f0071dec8067aa3c8d04022eb (diff) | |
download | jgit-da9eef85e7fff1c1c64c4302b897d20aff24b448.tar.gz jgit-da9eef85e7fff1c1c64c4302b897d20aff24b448.zip |
Don't check lastModified, length on folders for submodules
The metadata comparison of submodules is not reliable because of the
last modified timestamp and directory length.
Bug: 498759
Change-Id: If5db69ef3868e475ac477d3e8a7750b268799b0c
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java index c8de3de83c..9a3fa8060b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java @@ -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()) |