summaryrefslogtreecommitdiff
path: root/read-cache.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2007-04-13 09:24:13 -0700
committerJunio C Hamano <junkio@cox.net>2007-04-14 03:14:12 -0700
commita8ee75bc7a2ddbb10e0a4303b21bb5c300f98cc2 (patch)
tree775e5554444449e6d4797546794c653abcdcf217 /read-cache.c
parentab22aed3b7517c6390cb622b368bfcf503b7a37a (diff)
downloadgit-a8ee75bc7a2ddbb10e0a4303b21bb5c300f98cc2.tar.gz
Fix gitlink index entry filesystem matching
The code to match up index entries with the filesystem was stupidly broken. We shouldn't compare the filesystem stat() information with S_IFDIRLNK, since that's purely a git-internal value, and not what the filesystem uses (on the filesystem, it's just a regular directory). Also, don't bother to make the stat() time comparisons etc for DIRLNK entries in ce_match_stat_basic(), since we do an exact match for these things, and the hints in the stat data simply doesn't matter. This fixes "git status" with submodules that haven't been checked out in the supermodule. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'read-cache.c')
-rw-r--r--read-cache.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/read-cache.c b/read-cache.c
index e4c628f927..d2f332a622 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -120,9 +120,9 @@ static int ce_modified_check_fs(struct cache_entry *ce, struct stat *st)
if (ce_compare_link(ce, xsize_t(st->st_size)))
return DATA_CHANGED;
break;
- case S_IFDIRLNK:
- /* No need to do anything, we did the exact compare in "match_stat_basic" */
- break;
+ case S_IFDIR:
+ if (S_ISDIRLNK(ntohl(ce->ce_mode)))
+ return 0;
default:
return TYPE_CHANGED;
}
@@ -153,7 +153,7 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)
changed |= TYPE_CHANGED;
else if (ce_compare_gitlink(ce))
changed |= DATA_CHANGED;
- break;
+ return changed;
default:
die("internal error: ce_mode is %o", ntohl(ce->ce_mode));
}