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 c8de3de83..9a3fa8060 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())