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
This commit is contained in:
Christian Halstrick 2016-08-07 18:59:49 +01:00 committed by Andrey Loskutov
parent b8260b5e79
commit da9eef85e7
1 changed files with 13 additions and 3 deletions

View File

@ -268,7 +268,9 @@ public byte[] idBuffer() {
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 MetadataDiff compareMetadata(DirCacheEntry entry) {
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 boolean isModified(DirCacheEntry entry, boolean forceContentCheck,
// 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())