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();
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
// 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())