From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Subject: [PATCH 3/3] diffcore-pickaxe: unify setup and teardown code between log -S/-G
Date: Thu, 4 Apr 2013 21:45:26 -0700 [thread overview]
Message-ID: <1365137126-21659-3-git-send-email-gitster@pobox.com> (raw)
In-Reply-To: <1365137126-21659-1-git-send-email-gitster@pobox.com>
The logic to decide early to do nothing and prepare the data to be
inspected are the same between has_changes() and diff_grep().
Introduce pickaxe_setup() helper to share the same code.
Similarly, introduce pickaxe_finish_filepair() to clean up after
these two functions are done with a filepair.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
diffcore-pickaxe.c | 103 ++++++++++++++++++++++++++++-------------------------
1 file changed, 55 insertions(+), 48 deletions(-)
diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c
index cadb071..ac5a28d 100644
--- a/diffcore-pickaxe.c
+++ b/diffcore-pickaxe.c
@@ -48,6 +48,54 @@ static void pickaxe(struct diff_queue_struct *q, struct diff_options *o,
*q = outq;
}
+static int pickaxe_setup(struct diff_filepair *p,
+ struct diff_options *o,
+ mmfile_t *mf_one,
+ mmfile_t *mf_two,
+ unsigned *what_to_free)
+{
+ struct userdiff_driver *textconv_one = NULL;
+ struct userdiff_driver *textconv_two = NULL;
+
+ if (!o->pickaxe[0])
+ return 0;
+
+ if (DIFF_OPT_TST(o, ALLOW_TEXTCONV)) {
+ textconv_one = get_textconv(p->one);
+ textconv_two = get_textconv(p->two);
+ }
+
+ /*
+ * If we have an unmodified pair, we know that there is no
+ * interesting difference and we don't even have to load the
+ * blobs, unless textconv is in play, _and_ we are using two
+ * different textconv filters (e.g., because a pair is an
+ * exact rename with different textconv attributes for each
+ * side, which might generate different content).
+ */
+ if (textconv_one == textconv_two && diff_unmodified_pair(p))
+ return 0;
+
+ mf_one->size = fill_textconv(textconv_one, p->one, &mf_one->ptr);
+ mf_two->size = fill_textconv(textconv_two, p->two, &mf_two->ptr);
+
+ *what_to_free = (textconv_one ? 1 : 0) | (textconv_two ? 2 : 0);
+ return 1;
+}
+
+static void pickaxe_finish_filepair(struct diff_filepair *p,
+ mmfile_t *mf_one,
+ mmfile_t *mf_two,
+ unsigned what_to_free)
+{
+ if (what_to_free & 1)
+ free(mf_one->ptr);
+ if (what_to_free & 2)
+ free(mf_two->ptr);
+ diff_free_filespec_data(p->one);
+ diff_free_filespec_data(p->two);
+}
+
struct diffgrep_cb {
regex_t *regexp;
int hit;
@@ -78,25 +126,13 @@ static int diff_grep(struct diff_filepair *p, struct diff_options *o,
regex_t *regexp, kwset_t kws)
{
regmatch_t regmatch;
- struct userdiff_driver *textconv_one = NULL;
- struct userdiff_driver *textconv_two = NULL;
mmfile_t mf1, mf2;
+ unsigned what_to_free;
int hit;
- if (!o->pickaxe[0])
+ if (!pickaxe_setup(p, o, &mf1, &mf2, &what_to_free))
return 0;
- if (DIFF_OPT_TST(o, ALLOW_TEXTCONV)) {
- textconv_one = get_textconv(p->one);
- 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);
-
if (!DIFF_FILE_VALID(p->one)) {
if (!DIFF_FILE_VALID(p->two))
hit = 0; /* ignore unmerged */
@@ -125,12 +161,8 @@ static int diff_grep(struct diff_filepair *p, struct diff_options *o,
&xpp, &xecfg);
hit = ecbdata.hit;
}
- if (textconv_one)
- free(mf1.ptr);
- if (textconv_two)
- free(mf2.ptr);
- diff_free_filespec_data(p->one);
- diff_free_filespec_data(p->two);
+
+ pickaxe_finish_filepair(p, &mf1, &mf2, what_to_free);
return hit;
}
@@ -201,32 +233,13 @@ static unsigned int contains(mmfile_t *mf, struct diff_options *o,
static int has_changes(struct diff_filepair *p, struct diff_options *o,
regex_t *regexp, kwset_t kws)
{
- struct userdiff_driver *textconv_one = NULL;
- struct userdiff_driver *textconv_two = NULL;
mmfile_t mf1, mf2;
+ unsigned what_to_free;
int ret;
- if (!o->pickaxe[0])
- return 0;
-
- if (DIFF_OPT_TST(o, ALLOW_TEXTCONV)) {
- textconv_one = get_textconv(p->one);
- textconv_two = get_textconv(p->two);
- }
-
- /*
- * If we have an unmodified pair, we know that the count will be the
- * same and don't even have to load the blobs. Unless textconv is in
- * play, _and_ we are using two different textconv filters (e.g.,
- * because a pair is an exact rename with different textconv attributes
- * for each side, which might generate different content).
- */
- if (textconv_one == textconv_two && diff_unmodified_pair(p))
+ if (!pickaxe_setup(p, o, &mf1, &mf2, &what_to_free))
return 0;
- mf1.size = fill_textconv(textconv_one, p->one, &mf1.ptr);
- mf2.size = fill_textconv(textconv_two, p->two, &mf2.ptr);
-
if (!DIFF_FILE_VALID(p->one)) {
if (!DIFF_FILE_VALID(p->two))
ret = 0; /* ignore unmerged */
@@ -240,13 +253,7 @@ static int has_changes(struct diff_filepair *p, struct diff_options *o,
ret = contains(&mf1, o, regexp, kws) !=
contains(&mf2, o, regexp, kws);
- if (textconv_one)
- free(mf1.ptr);
- if (textconv_two)
- free(mf2.ptr);
- diff_free_filespec_data(p->one);
- diff_free_filespec_data(p->two);
-
+ pickaxe_finish_filepair(p, &mf1, &mf2, what_to_free);
return ret;
}
--
1.8.2-588-gbf1c992
next prev parent reply other threads:[~2013-04-05 4:46 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-04 8:34 [BUG] git log -S not respecting --no-textconv Matthieu Moy
2013-04-04 16:03 ` [PATCH 1/2] diffcore-pickaxe: respect --no-textconv Simon Ruderich
2013-04-04 17:03 ` Matthieu Moy
2013-04-04 17:43 ` Jeff King
2013-04-04 17:45 ` Junio C Hamano
2013-04-04 17:51 ` Jeff King
2013-04-04 18:10 ` Junio C Hamano
2013-04-04 20:20 ` [PATCH v2 1/3] diffcore-pickaxe: remove unnecessary call to get_textconv() Simon Ruderich
2013-04-04 20:48 ` Junio C Hamano
2013-04-04 21:10 ` Junio C Hamano
2013-04-04 21:11 ` Jeff King
2013-04-04 22:51 ` Junio C Hamano
2013-04-05 13:20 ` Simon Ruderich
2013-04-04 20:21 ` [PATCH v2 2/3] diffcore-pickaxe: remove fill_one() Simon Ruderich
2013-04-05 0:08 ` Jeff King
2013-04-05 4:43 ` Junio C Hamano
2013-04-05 4:45 ` [PATCH 1/3] diffcore-pickaxe: port optimization from has_changes() to diff_grep() Junio C Hamano
2013-04-05 4:45 ` [PATCH 2/3] diffcore-pickaxe: fix leaks in "log -S<block>" and "log -G<pattern>" Junio C Hamano
2013-04-05 4:45 ` Junio C Hamano [this message]
2013-04-05 5:28 ` [PATCH 3/3] diffcore-pickaxe: unify setup and teardown code between log -S/-G Jeff King
2013-04-05 5:43 ` Junio C Hamano
2013-04-05 5:45 ` Jeff King
2013-04-05 16:44 ` Junio C Hamano
2013-04-04 20:21 ` [PATCH v2 3/3] diffcore-pickaxe: respect --no-textconv Simon Ruderich
2013-04-05 7:40 ` Matthieu Moy
2013-04-05 13:16 ` [PATCH v3 " Simon Ruderich
2013-04-05 17:31 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1365137126-21659-3-git-send-email-gitster@pobox.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.