Merge branch 'tb/log-G-binary'
"git log -G<regex>" looked for a hunk in the "git log -p" patch output that contained a string that matches the given pattern. Optimize this code to ignore binary files, which by default will not show any hunk that would match any pattern (unless textconv or the --text option is in effect, that is). * tb/log-G-binary: log -G: ignore binary files
This commit is contained in:
@ -524,6 +524,8 @@ struct), and want to know the history of that block since it first
|
|||||||
came into being: use the feature iteratively to feed the interesting
|
came into being: use the feature iteratively to feed the interesting
|
||||||
block in the preimage back into `-S`, and keep going until you get the
|
block in the preimage back into `-S`, and keep going until you get the
|
||||||
very first version of the block.
|
very first version of the block.
|
||||||
|
+
|
||||||
|
Binary files are searched as well.
|
||||||
|
|
||||||
-G<regex>::
|
-G<regex>::
|
||||||
Look for differences whose patch text contains added/removed
|
Look for differences whose patch text contains added/removed
|
||||||
@ -543,6 +545,9 @@ While `git log -G"regexec\(regexp"` will show this commit, `git log
|
|||||||
-S"regexec\(regexp" --pickaxe-regex` will not (because the number of
|
-S"regexec\(regexp" --pickaxe-regex` will not (because the number of
|
||||||
occurrences of that string did not change).
|
occurrences of that string did not change).
|
||||||
+
|
+
|
||||||
|
Unless `--text` is supplied patches of binary files without a textconv
|
||||||
|
filter will be ignored.
|
||||||
|
+
|
||||||
See the 'pickaxe' entry in linkgit:gitdiffcore[7] for more
|
See the 'pickaxe' entry in linkgit:gitdiffcore[7] for more
|
||||||
information.
|
information.
|
||||||
|
|
||||||
|
@ -242,7 +242,8 @@ textual diff has an added or a deleted line that matches the given
|
|||||||
regular expression. This means that it will detect in-file (or what
|
regular expression. This means that it will detect in-file (or what
|
||||||
rename-detection considers the same file) moves, which is noise. The
|
rename-detection considers the same file) moves, which is noise. The
|
||||||
implementation runs diff twice and greps, and this can be quite
|
implementation runs diff twice and greps, and this can be quite
|
||||||
expensive.
|
expensive. To speed things up binary files without textconv filters
|
||||||
|
will be ignored.
|
||||||
|
|
||||||
When `-S` or `-G` are used without `--pickaxe-all`, only filepairs
|
When `-S` or `-G` are used without `--pickaxe-all`, only filepairs
|
||||||
that match their respective criterion are kept in the output. When
|
that match their respective criterion are kept in the output. When
|
||||||
|
@ -154,6 +154,12 @@ static int pickaxe_match(struct diff_filepair *p, struct diff_options *o,
|
|||||||
if (textconv_one == textconv_two && diff_unmodified_pair(p))
|
if (textconv_one == textconv_two && diff_unmodified_pair(p))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if ((o->pickaxe_opts & DIFF_PICKAXE_KIND_G) &&
|
||||||
|
!o->flags.text &&
|
||||||
|
((!textconv_one && diff_filespec_is_binary(o->repo, p->one)) ||
|
||||||
|
(!textconv_two && diff_filespec_is_binary(o->repo, p->two))))
|
||||||
|
return 0;
|
||||||
|
|
||||||
mf1.size = fill_textconv(o->repo, textconv_one, p->one, &mf1.ptr);
|
mf1.size = fill_textconv(o->repo, textconv_one, p->one, &mf1.ptr);
|
||||||
mf2.size = fill_textconv(o->repo, textconv_two, p->two, &mf2.ptr);
|
mf2.size = fill_textconv(o->repo, textconv_two, p->two, &mf2.ptr);
|
||||||
|
|
||||||
|
@ -106,4 +106,39 @@ test_expect_success 'log -S --no-textconv (missing textconv tool)' '
|
|||||||
rm .gitattributes
|
rm .gitattributes
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'setup log -[GS] binary & --text' '
|
||||||
|
git checkout --orphan GS-binary-and-text &&
|
||||||
|
git read-tree --empty &&
|
||||||
|
printf "a\na\0a\n" >data.bin &&
|
||||||
|
git add data.bin &&
|
||||||
|
git commit -m "create binary file" data.bin &&
|
||||||
|
printf "a\na\0a\n" >>data.bin &&
|
||||||
|
git commit -m "modify binary file" data.bin &&
|
||||||
|
git rm data.bin &&
|
||||||
|
git commit -m "delete binary file" data.bin &&
|
||||||
|
git log >full-log
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'log -G ignores binary files' '
|
||||||
|
git log -Ga >log &&
|
||||||
|
test_must_be_empty log
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'log -G looks into binary files with -a' '
|
||||||
|
git log -a -Ga >log &&
|
||||||
|
test_cmp log full-log
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'log -G looks into binary files with textconv filter' '
|
||||||
|
test_when_finished "rm .gitattributes" &&
|
||||||
|
echo "* diff=bin" >.gitattributes &&
|
||||||
|
git -c diff.bin.textconv=cat log -Ga >log &&
|
||||||
|
test_cmp log full-log
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'log -S looks into binary files' '
|
||||||
|
git log -Sa >log &&
|
||||||
|
test_cmp log full-log
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Reference in New Issue
Block a user