зеркало из https://github.com/microsoft/git.git
Merge branch 'jk/pickaxe-textconv'
Use textconv filters when searching with "log -S". * jk/pickaxe-textconv: pickaxe: use textconv for -S counting pickaxe: hoist empty needle check
This commit is contained in:
Коммит
682098b847
|
@ -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(-)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче