Merge branch 'jk/pickaxe-textconv' into maint

"git log -p -S<string>" now looks for the <string> after applying
the textconv filter (if defined); earlier it inspected the contents
of the blobs without filtering.
This commit is contained in:
Junio C Hamano 2012-12-18 10:50:07 -08:00
Родитель 31d66aa408 ef90ab66e8
Коммит 8e8c8817cd
2 изменённых файлов: 54 добавлений и 19 удалений

Просмотреть файл

@ -157,19 +157,15 @@ static void diffcore_pickaxe_grep(struct diff_options *o)
return; return;
} }
static unsigned int contains(struct diff_filespec *one, struct diff_options *o, static unsigned int contains(mmfile_t *mf, struct diff_options *o,
regex_t *regexp, kwset_t kws) regex_t *regexp, kwset_t kws)
{ {
unsigned int cnt; unsigned int cnt;
unsigned long sz; unsigned long sz;
const char *data; const char *data;
if (!o->pickaxe[0])
return 0;
if (diff_populate_filespec(one, 0))
return 0;
sz = one->size; sz = mf->size;
data = one->data; data = mf->ptr;
cnt = 0; cnt = 0;
if (regexp) { if (regexp) {
@ -199,26 +195,53 @@ static unsigned int contains(struct diff_filespec *one, struct diff_options *o,
cnt++; cnt++;
} }
} }
diff_free_filespec_data(one);
return cnt; return cnt;
} }
static int has_changes(struct diff_filepair *p, struct diff_options *o, static int has_changes(struct diff_filepair *p, struct diff_options *o,
regex_t *regexp, kwset_t kws) regex_t *regexp, kwset_t kws)
{ {
if (!DIFF_FILE_VALID(p->one)) { struct userdiff_driver *textconv_one = get_textconv(p->one);
if (!DIFF_FILE_VALID(p->two)) struct userdiff_driver *textconv_two = get_textconv(p->two);
return 0; /* ignore unmerged */ mmfile_t mf1, mf2;
int ret;
if (!o->pickaxe[0])
return 0;
/*
* 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))
return 0;
fill_one(p->one, &mf1, &textconv_one);
fill_one(p->two, &mf2, &textconv_two);
if (!mf1.ptr) {
if (!mf2.ptr)
ret = 0; /* ignore unmerged */
/* created */ /* created */
return contains(p->two, o, regexp, kws) != 0; ret = contains(&mf2, o, regexp, kws) != 0;
} }
if (!DIFF_FILE_VALID(p->two)) else if (!mf2.ptr) /* removed */
return contains(p->one, o, regexp, kws) != 0; ret = contains(&mf1, o, regexp, kws) != 0;
if (!diff_unmodified_pair(p)) { else
return contains(p->one, o, regexp, kws) != ret = contains(&mf1, o, regexp, kws) !=
contains(p->two, o, regexp, kws); contains(&mf2, o, regexp, kws);
}
return 0; if (textconv_one)
free(mf1.ptr);
if (textconv_two)
free(mf2.ptr);
diff_free_filespec_data(p->one);
diff_free_filespec_data(p->two);
return ret;
} }
static void diffcore_pickaxe_count(struct diff_options *o) static void diffcore_pickaxe_count(struct diff_options *o)

Просмотреть файл

@ -96,6 +96,18 @@ test_expect_success 'grep-diff (-G) operates on textconv data (modification)' '
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'pickaxe (-S) operates on textconv data (add)' '
echo one >expect &&
git log --root --format=%s -S0 >actual &&
test_cmp expect actual
'
test_expect_success 'pickaxe (-S) operates on textconv data (modification)' '
echo two >expect &&
git log --root --format=%s -S1 >actual &&
test_cmp expect actual
'
cat >expect.stat <<'EOF' cat >expect.stat <<'EOF'
file | Bin 2 -> 4 bytes file | Bin 2 -> 4 bytes
1 file changed, 0 insertions(+), 0 deletions(-) 1 file changed, 0 insertions(+), 0 deletions(-)