Merge branch 'jk/diff-files-assume-unchanged' into maint
"git diff --find-copies-harder" sometimes pretended as if the mode bits have changed for paths that are marked with assume-unchanged bit. * jk/diff-files-assume-unchanged: run_diff_files: do not look at uninitialized stat data
This commit is contained in:
commit
11aae3e1c1
33
diff-lib.c
33
diff-lib.c
@ -97,7 +97,6 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
|
|||||||
diff_unmerged_stage = 2;
|
diff_unmerged_stage = 2;
|
||||||
entries = active_nr;
|
entries = active_nr;
|
||||||
for (i = 0; i < entries; i++) {
|
for (i = 0; i < entries; i++) {
|
||||||
struct stat st;
|
|
||||||
unsigned int oldmode, newmode;
|
unsigned int oldmode, newmode;
|
||||||
struct cache_entry *ce = active_cache[i];
|
struct cache_entry *ce = active_cache[i];
|
||||||
int changed;
|
int changed;
|
||||||
@ -115,6 +114,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
|
|||||||
unsigned int wt_mode = 0;
|
unsigned int wt_mode = 0;
|
||||||
int num_compare_stages = 0;
|
int num_compare_stages = 0;
|
||||||
size_t path_len;
|
size_t path_len;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
path_len = ce_namelen(ce);
|
path_len = ce_namelen(ce);
|
||||||
|
|
||||||
@ -195,26 +195,35 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* If CE_VALID is set, don't look at workdir for file removal */
|
/* If CE_VALID is set, don't look at workdir for file removal */
|
||||||
changed = (ce->ce_flags & CE_VALID) ? 0 : check_removed(ce, &st);
|
if (ce->ce_flags & CE_VALID) {
|
||||||
if (changed) {
|
changed = 0;
|
||||||
if (changed < 0) {
|
newmode = ce->ce_mode;
|
||||||
perror(ce->name);
|
} else {
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
changed = check_removed(ce, &st);
|
||||||
|
if (changed) {
|
||||||
|
if (changed < 0) {
|
||||||
|
perror(ce->name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
diff_addremove(&revs->diffopt, '-', ce->ce_mode,
|
||||||
|
ce->sha1, !is_null_sha1(ce->sha1),
|
||||||
|
ce->name, 0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
diff_addremove(&revs->diffopt, '-', ce->ce_mode,
|
|
||||||
ce->sha1, !is_null_sha1(ce->sha1),
|
changed = match_stat_with_submodule(&revs->diffopt, ce, &st,
|
||||||
ce->name, 0);
|
ce_option, &dirty_submodule);
|
||||||
continue;
|
newmode = ce_mode_from_stat(ce, st.st_mode);
|
||||||
}
|
}
|
||||||
changed = match_stat_with_submodule(&revs->diffopt, ce, &st,
|
|
||||||
ce_option, &dirty_submodule);
|
|
||||||
if (!changed && !dirty_submodule) {
|
if (!changed && !dirty_submodule) {
|
||||||
ce_mark_uptodate(ce);
|
ce_mark_uptodate(ce);
|
||||||
if (!DIFF_OPT_TST(&revs->diffopt, FIND_COPIES_HARDER))
|
if (!DIFF_OPT_TST(&revs->diffopt, FIND_COPIES_HARDER))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
oldmode = ce->ce_mode;
|
oldmode = ce->ce_mode;
|
||||||
newmode = ce_mode_from_stat(ce, st.st_mode);
|
|
||||||
diff_change(&revs->diffopt, oldmode, newmode,
|
diff_change(&revs->diffopt, oldmode, newmode,
|
||||||
ce->sha1, (changed ? null_sha1 : ce->sha1),
|
ce->sha1, (changed ? null_sha1 : ce->sha1),
|
||||||
!is_null_sha1(ce->sha1), (changed ? 0 : !is_null_sha1(ce->sha1)),
|
!is_null_sha1(ce->sha1), (changed ? 0 : !is_null_sha1(ce->sha1)),
|
||||||
|
@ -28,4 +28,15 @@ test_expect_success 'diff-files does not examine assume-unchanged entries' '
|
|||||||
test -z "$(git diff-files -- one)"
|
test -z "$(git diff-files -- one)"
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success POSIXPERM 'find-copies-harder is not confused by mode bits' '
|
||||||
|
echo content >exec &&
|
||||||
|
chmod +x exec &&
|
||||||
|
git add exec &&
|
||||||
|
git commit -m exec &&
|
||||||
|
git update-index --assume-unchanged exec &&
|
||||||
|
>expect &&
|
||||||
|
git diff-files --find-copies-harder -- exec >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user