diff options
author | Junio C Hamano <gitster@pobox.com> | 2010-08-13 10:36:01 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-08-13 11:01:51 -0700 |
commit | 39f75d26e235798681394e46625716c187a4ee3e (patch) | |
tree | 013f8c704216ac73b577ace828e4e80a672e0967 /tree-diff.c | |
parent | 452c6d506b1a6dcf24d4ceaa592afc39c1c1a60e (diff) | |
download | git-39f75d26e235798681394e46625716c187a4ee3e.tar.gz |
diff --follow: do not waste cycles while recursing
The "--follow" logic is called from diff_tree_sha1() function, but the
input trees to diff_tree_sha1() are not necessarily the top-level trees
(compare_tree_entry() calls it while it recursively descends into
subtrees). When a newly created path lives in somewhere deep in the
source hierarchy, e.g. "platform/", but the rename source is in a totally
different place in the destination hierarchy, e.g. "lang-api/src/com/...",
running "try_to_find_renames()" while base is set to "platform/" is a
wasted call.
We only need to run the rename following at the very top level.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'tree-diff.c')
-rw-r--r-- | tree-diff.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/tree-diff.c b/tree-diff.c index 1fb3e94614..5b68c0864c 100644 --- a/tree-diff.c +++ b/tree-diff.c @@ -412,7 +412,7 @@ int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const cha init_tree_desc(&t1, tree1, size1); init_tree_desc(&t2, tree2, size2); retval = diff_tree(&t1, &t2, base, opt); - if (DIFF_OPT_TST(opt, FOLLOW_RENAMES) && diff_might_be_rename()) { + if (!*base && DIFF_OPT_TST(opt, FOLLOW_RENAMES) && diff_might_be_rename()) { init_tree_desc(&t1, tree1, size1); init_tree_desc(&t2, tree2, size2); try_to_follow_renames(&t1, &t2, base, opt); |