summaryrefslogtreecommitdiff
path: root/diff.c
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2008-02-11 16:46:20 -0800
committerLibravatar Junio C Hamano <gitster@pobox.com>2008-02-11 16:46:20 -0800
commite0197c9aae39b0f1ba6c21d1f6d0bae5de03a44d (patch)
tree8ce3be12cc0fba866845b18e977c264fbcf54792 /diff.c
parentMerge branch 'ph/describe-match' (diff)
parentlazy index hashing (diff)
downloadtgif-e0197c9aae39b0f1ba6c21d1f6d0bae5de03a44d.tar.xz
Merge branch 'lt/in-core-index'
* lt/in-core-index: lazy index hashing Create pathname-based hash-table lookup into index read-cache.c: introduce is_racy_timestamp() helper read-cache.c: fix a couple more CE_REMOVE conversion Also use unpack_trees() in do_diff_cache() Make run_diff_index() use unpack_trees(), not read_tree() Avoid running lstat(2) on the same cache entry. index: be careful when handling long names Make on-disk index representation separate from in-core one
Diffstat (limited to 'diff.c')
-rw-r--r--diff.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/diff.c b/diff.c
index 4d2e23ae1b..cd8bc4dcc3 100644
--- a/diff.c
+++ b/diff.c
@@ -1520,17 +1520,22 @@ static int reuse_worktree_file(const char *name, const unsigned char *sha1, int
if (pos < 0)
return 0;
ce = active_cache[pos];
- if ((lstat(name, &st) < 0) ||
- !S_ISREG(st.st_mode) || /* careful! */
- ce_match_stat(ce, &st, 0) ||
- hashcmp(sha1, ce->sha1))
+
+ /*
+ * This is not the sha1 we are looking for, or
+ * unreusable because it is not a regular file.
+ */
+ if (hashcmp(sha1, ce->sha1) || !S_ISREG(ce->ce_mode))
return 0;
- /* we return 1 only when we can stat, it is a regular file,
- * stat information matches, and sha1 recorded in the cache
- * matches. I.e. we know the file in the work tree really is
- * the same as the <name, sha1> pair.
+
+ /*
+ * If ce matches the file in the work tree, we can reuse it.
*/
- return 1;
+ if (ce_uptodate(ce) ||
+ (!lstat(name, &st) && !ce_match_stat(ce, &st, 0)))
+ return 1;
+
+ return 0;
}
static int populate_from_stdin(struct diff_filespec *s)