diff-files: careful when inspecting work tree items
This fixes the same breakage in diff-files. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
948dd346fd
commit
f58dbf23c3
17
diff-lib.c
17
diff-lib.c
@ -362,10 +362,12 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
|
||||
int silent_on_removed = option & DIFF_SILENT_ON_REMOVED;
|
||||
unsigned ce_option = ((option & DIFF_RACY_IS_MODIFIED)
|
||||
? CE_MATCH_RACY_IS_DIRTY : 0);
|
||||
char symcache[PATH_MAX];
|
||||
|
||||
if (diff_unmerged_stage < 0)
|
||||
diff_unmerged_stage = 2;
|
||||
entries = active_nr;
|
||||
symcache[0] = '\0';
|
||||
for (i = 0; i < entries; i++) {
|
||||
struct stat st;
|
||||
unsigned int oldmode, newmode;
|
||||
@ -397,16 +399,17 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
|
||||
memset(&(dpath->parent[0]), 0,
|
||||
sizeof(struct combine_diff_parent)*5);
|
||||
|
||||
if (lstat(ce->name, &st) < 0) {
|
||||
if (errno != ENOENT && errno != ENOTDIR) {
|
||||
changed = check_work_tree_entity(ce, &st, symcache);
|
||||
if (!changed)
|
||||
dpath->mode = ce_mode_from_stat(ce, st.st_mode);
|
||||
else {
|
||||
if (changed < 0) {
|
||||
perror(ce->name);
|
||||
continue;
|
||||
}
|
||||
if (silent_on_removed)
|
||||
continue;
|
||||
}
|
||||
else
|
||||
dpath->mode = ce_mode_from_stat(ce, st.st_mode);
|
||||
|
||||
while (i < entries) {
|
||||
struct cache_entry *nce = active_cache[i];
|
||||
@ -459,8 +462,10 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
|
||||
|
||||
if (ce_uptodate(ce))
|
||||
continue;
|
||||
if (lstat(ce->name, &st) < 0) {
|
||||
if (errno != ENOENT && errno != ENOTDIR) {
|
||||
|
||||
changed = check_work_tree_entity(ce, &st, symcache);
|
||||
if (changed) {
|
||||
if (changed < 0) {
|
||||
perror(ce->name);
|
||||
continue;
|
||||
}
|
||||
|
@ -104,7 +104,7 @@ test_expect_success modify '
|
||||
} >expect-final
|
||||
'
|
||||
|
||||
test_expect_failure diff-files '
|
||||
test_expect_success diff-files '
|
||||
git diff-files --raw >actual &&
|
||||
diff -u expect-files actual
|
||||
'
|
||||
@ -114,7 +114,7 @@ test_expect_success diff-index '
|
||||
diff -u expect-index actual
|
||||
'
|
||||
|
||||
test_expect_failure 'add -u' '
|
||||
test_expect_success 'add -u' '
|
||||
rm -f ".git/saved-index" &&
|
||||
cp -p ".git/index" ".git/saved-index" &&
|
||||
git add -u &&
|
||||
@ -122,7 +122,7 @@ test_expect_failure 'add -u' '
|
||||
diff -u expect-final actual
|
||||
'
|
||||
|
||||
test_expect_failure 'commit -a' '
|
||||
test_expect_success 'commit -a' '
|
||||
if test -f ".git/saved-index"
|
||||
then
|
||||
rm -f ".git/index" &&
|
||||
|
Loading…
Reference in New Issue
Block a user