Skip to content

Commit

Permalink
diff --cached: do not borrow from a work tree when a path is marked a…
Browse files Browse the repository at this point in the history
…s assume-unchanged

When the index says that the file in the work tree that corresponds to the
blob object that is used for comparison is known to be unchanged, "diff"
reads from the file and applies convert_to_git(), instead of inflating the
object, to feed the internal diff engine with, because an earlier
benchnark found that it tends to be faster to use this optimization.

However, the index can lie when the path is marked as assume-unchanged.
Disable the optimization for such paths.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Mar 22, 2009
1 parent ea02eef commit 150115a
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
10 changes: 9 additions & 1 deletion diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -1687,7 +1687,8 @@ static int reuse_worktree_file(const char *name, const unsigned char *sha1, int
struct stat st;
int pos, len;

/* We do not read the cache ourselves here, because the
/*
* We do not read the cache ourselves here, because the
* benchmark with my previous version that always reads cache
* shows that it makes things worse for diff-tree comparing
* two linux-2.6 kernel trees in an already checked out work
Expand Down Expand Up @@ -1727,6 +1728,13 @@ static int reuse_worktree_file(const char *name, const unsigned char *sha1, int
if (hashcmp(sha1, ce->sha1) || !S_ISREG(ce->ce_mode))
return 0;

/*
* If ce is marked as "assume unchanged", there is no
* guarantee that work tree matches what we are looking for.
*/
if (ce->ce_flags & CE_VALID)
return 0;

/*
* If ce matches the file in the work tree, we can reuse it.
*/
Expand Down
8 changes: 8 additions & 0 deletions t/t4020-diff-external.sh
Original file line number Diff line number Diff line change
Expand Up @@ -107,4 +107,12 @@ test_expect_success 'force diff with "diff"' '
test_cmp ../t4020/diff.NUL actual
'

test_expect_success 'diff --cached' '
git add file &&
git update-index --assume-unchanged file &&
echo second >file &&
git diff --cached >actual &&
test_cmp ../t4020/diff.NUL actual
'

test_done

0 comments on commit 150115a

Please sign in to comment.