summaryrefslogtreecommitdiff
path: root/diff.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2016-08-10 11:55:28 -0700
committerJunio C Hamano <gitster@pobox.com>2016-08-10 11:55:28 -0700
commitcee6c5b47bfa5d20fdf504fd61d200c0ee5eb777 (patch)
tree5c360d8309d55bd393234f25f2740cd2a3209940 /diff.c
parentd1d9c3cc608ca281c1bd9b40b14fa8d60cb64773 (diff)
parent06dec439a3d00fa0b3141a2d52b33d22b941976c (diff)
downloadgit-cee6c5b47bfa5d20fdf504fd61d200c0ee5eb777.tar.gz
Merge branch 'jk/diff-do-not-reuse-wtf-needs-cleaning' into maint
There is an optimization used in "git diff $treeA $treeB" to borrow an already checked-out copy in the working tree when it is known to be the same as the blob being compared, expecting that open/mmap of such a file is faster than reading it from the object store, which involves inflating and applying delta. This however kicked in even when the checked-out copy needs to go through the convert-to-git conversion (including the clean filter), which defeats the whole point of the optimization. The optimization has been disabled when the conversion is necessary. * jk/diff-do-not-reuse-wtf-needs-cleaning: diff: do not reuse worktree files that need "clean" conversion
Diffstat (limited to 'diff.c')
-rw-r--r--diff.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/diff.c b/diff.c
index fa78fc189c..abff2eec2b 100644
--- a/diff.c
+++ b/diff.c
@@ -2682,6 +2682,13 @@ static int reuse_worktree_file(const char *name, const unsigned char *sha1, int
if (!FAST_WORKING_DIRECTORY && !want_file && has_sha1_pack(sha1))
return 0;
+ /*
+ * Similarly, if we'd have to convert the file contents anyway, that
+ * makes the optimization not worthwhile.
+ */
+ if (!want_file && would_convert_to_git(name))
+ return 0;
+
len = strlen(name);
pos = cache_name_pos(name, len);
if (pos < 0)