Skip to content
This repository was archived by the owner on Nov 9, 2017. It is now read-only.

Commit 4144059

Browse files
committed
Merge branch 'jk/diff-files-assume-unchanged'
* jk/diff-files-assume-unchanged: run_diff_files: do not look at uninitialized stat data
2 parents 5b3a58d + 5304810 commit 4144059

File tree

2 files changed

+32
-12
lines changed

2 files changed

+32
-12
lines changed

diff-lib.c

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
9797
diff_unmerged_stage = 2;
9898
entries = active_nr;
9999
for (i = 0; i < entries; i++) {
100-
struct stat st;
101100
unsigned int oldmode, newmode;
102101
struct cache_entry *ce = active_cache[i];
103102
int changed;
@@ -115,6 +114,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
115114
unsigned int wt_mode = 0;
116115
int num_compare_stages = 0;
117116
size_t path_len;
117+
struct stat st;
118118

119119
path_len = ce_namelen(ce);
120120

@@ -195,26 +195,35 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
195195
continue;
196196

197197
/* If CE_VALID is set, don't look at workdir for file removal */
198-
changed = (ce->ce_flags & CE_VALID) ? 0 : check_removed(ce, &st);
199-
if (changed) {
200-
if (changed < 0) {
201-
perror(ce->name);
198+
if (ce->ce_flags & CE_VALID) {
199+
changed = 0;
200+
newmode = ce->ce_mode;
201+
} else {
202+
struct stat st;
203+
204+
changed = check_removed(ce, &st);
205+
if (changed) {
206+
if (changed < 0) {
207+
perror(ce->name);
208+
continue;
209+
}
210+
diff_addremove(&revs->diffopt, '-', ce->ce_mode,
211+
ce->sha1, !is_null_sha1(ce->sha1),
212+
ce->name, 0);
202213
continue;
203214
}
204-
diff_addremove(&revs->diffopt, '-', ce->ce_mode,
205-
ce->sha1, !is_null_sha1(ce->sha1),
206-
ce->name, 0);
207-
continue;
215+
216+
changed = match_stat_with_submodule(&revs->diffopt, ce, &st,
217+
ce_option, &dirty_submodule);
218+
newmode = ce_mode_from_stat(ce, st.st_mode);
208219
}
209-
changed = match_stat_with_submodule(&revs->diffopt, ce, &st,
210-
ce_option, &dirty_submodule);
220+
211221
if (!changed && !dirty_submodule) {
212222
ce_mark_uptodate(ce);
213223
if (!DIFF_OPT_TST(&revs->diffopt, FIND_COPIES_HARDER))
214224
continue;
215225
}
216226
oldmode = ce->ce_mode;
217-
newmode = ce_mode_from_stat(ce, st.st_mode);
218227
diff_change(&revs->diffopt, oldmode, newmode,
219228
ce->sha1, (changed ? null_sha1 : ce->sha1),
220229
!is_null_sha1(ce->sha1), (changed ? 0 : !is_null_sha1(ce->sha1)),

t/t4039-diff-assume-unchanged.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,15 @@ test_expect_success 'diff-files does not examine assume-unchanged entries' '
2828
test -z "$(git diff-files -- one)"
2929
'
3030

31+
test_expect_success POSIXPERM 'find-copies-harder is not confused by mode bits' '
32+
echo content >exec &&
33+
chmod +x exec &&
34+
git add exec &&
35+
git commit -m exec &&
36+
git update-index --assume-unchanged exec &&
37+
>expect &&
38+
git diff-files --find-copies-harder -- exec >actual &&
39+
test_cmp expect actual
40+
'
41+
3142
test_done

0 commit comments

Comments
 (0)