summaryrefslogtreecommitdiff
path: root/diffcore-pickaxe.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2013-04-04 20:40:31 -0700
committerJunio C Hamano <gitster@pobox.com>2013-04-05 10:31:09 -0700
commitebb722625805a0e98b5b8c062b79abd8eca1f639 (patch)
treee71c3c0434b492701e87caea73af464ba45d909a /diffcore-pickaxe.c
parenta8f6109428b868611c0a59e6894e2b6b38c34e1b (diff)
downloadgit-ebb722625805a0e98b5b8c062b79abd8eca1f639.tar.gz
diffcore-pickaxe: port optimization from has_changes() to diff_grep()
These two functions are called in the same codeflow to implement "log -S<block>" and "log -G<pattern>", respectively, but the latter lacked two obvious optimizations the former implemented, namely: - When a pickaxe limit is not given at all, they should return without wasting any cycle; - When both sides of the filepair are the same, and the same textconv conversion apply to them, return early, as there will be no interesting differences between the two anyway. Also release the filespec data once the processing is done (this is not about leaking memory--it is about releasing data we finished looking at as early as possible). Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'diffcore-pickaxe.c')
-rw-r--r--diffcore-pickaxe.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c
index 26ddf00aa3..bfaababbe5 100644
--- a/diffcore-pickaxe.c
+++ b/diffcore-pickaxe.c
@@ -83,7 +83,7 @@ static int diff_grep(struct diff_filepair *p, struct diff_options *o,
mmfile_t mf1, mf2;
int hit;
- if (diff_unmodified_pair(p))
+ if (!o->pickaxe[0])
return 0;
if (DIFF_OPT_TST(o, ALLOW_TEXTCONV)) {
@@ -91,6 +91,9 @@ static int diff_grep(struct diff_filepair *p, struct diff_options *o,
textconv_two = get_textconv(p->two);
}
+ if (textconv_one == textconv_two && diff_unmodified_pair(p))
+ return 0;
+
mf1.size = fill_textconv(textconv_one, p->one, &mf1.ptr);
mf2.size = fill_textconv(textconv_two, p->two, &mf2.ptr);
@@ -125,6 +128,8 @@ static int diff_grep(struct diff_filepair *p, struct diff_options *o,
free(mf1.ptr);
if (textconv_two)
free(mf2.ptr);
+ diff_free_filespec_data(p->one);
+ diff_free_filespec_data(p->two);
return hit;
}