Merge branch 'rr/diffcore-pickaxe-doc'

Update the low-level diffcore documentation on -S/-G and --pickaxe-all.

* rr/diffcore-pickaxe-doc:
  diffcore-pickaxe doc: document -S and -G properly
  diffcore-pickaxe: make error messages more consistent
This commit is contained in:
Junio C Hamano 2013-06-11 13:31:04 -07:00
commit 71e120202f
3 changed files with 57 additions and 26 deletions

View File

@ -383,14 +383,36 @@ ifndef::git-format-patch[]
that matches other criteria, nothing is selected.
-S<string>::
Look for differences that introduce or remove an instance of
<string>. Note that this is different than the string simply
appearing in diff output; see the 'pickaxe' entry in
linkgit:gitdiffcore[7] for more details.
Look for differences that change the number of occurrences of
the specified string (i.e. addition/deletion) in a file.
Intended for the scripter's use.
+
It is useful when you're looking for an exact block of code (like a
struct), and want to know the history of that block since it first
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
very first version of the block.
-G<regex>::
Look for differences whose added or removed line matches
the given <regex>.
Look for differences whose patch text contains added/removed
lines that match <regex>.
+
To illustrate the difference between `-S<regex> --pickaxe-regex` and
`-G<regex>`, consider a commit with the following diff in the same
file:
+
----
+ return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
- hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);
----
+
While `git log -G"regexec\(regexp"` will show this commit, `git log
-S"regexec\(regexp" --pickaxe-regex` will not (because the number of
occurrences of that string did not change).
+
See the 'pickaxe' entry in linkgit:gitdiffcore[7] for more
information.
--pickaxe-all::
When `-S` or `-G` finds a change, show all the changes in that
@ -398,8 +420,8 @@ ifndef::git-format-patch[]
in <string>.
--pickaxe-regex::
Make the <string> not a plain string but an extended POSIX
regex to match.
Treat the <string> given to `-S` as an extended POSIX regular
expression to match.
endif::git-format-patch[]
-O<orderfile>::

View File

@ -222,26 +222,35 @@ version prefixed with '+'.
diffcore-pickaxe: For Detecting Addition/Deletion of Specified String
---------------------------------------------------------------------
This transformation is used to find filepairs that represent
changes that touch a specified string, and is controlled by the
-S option and the `--pickaxe-all` option to the 'git diff-*'
commands.
This transformation limits the set of filepairs to those that change
specified strings between the preimage and the postimage in a certain
way. -S<block of text> and -G<regular expression> options are used to
specify different ways these strings are sought.
When diffcore-pickaxe is in use, it checks if there are
filepairs whose "result" side and whose "origin" side have
different number of specified string. Such a filepair represents
"the string appeared in this changeset". It also checks for the
opposite case that loses the specified string.
"-S<block of text>" detects filepairs whose preimage and postimage
have different number of occurrences of the specified block of text.
By definition, it will not detect in-file moves. Also, when a
changeset moves a file wholesale without affecting the interesting
string, diffcore-rename kicks in as usual, and `-S` omits the filepair
(since the number of occurrences of that string didn't change in that
rename-detected filepair). When used with `--pickaxe-regex`, treat
the <block of text> as an extended POSIX regular expression to match,
instead of a literal string.
When `--pickaxe-all` is not in effect, diffcore-pickaxe leaves
only such filepairs that touch the specified string in its
output. When `--pickaxe-all` is used, diffcore-pickaxe leaves all
filepairs intact if there is such a filepair, or makes the
output empty otherwise. The latter behaviour is designed to
make reviewing of the changes in the context of the whole
"-G<regular expression>" (mnemonic: grep) detects filepairs whose
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
rename-detection considers the same file) moves, which is noise. The
implementation runs diff twice and greps, and this can be quite
expensive.
When `-S` or `-G` are used without `--pickaxe-all`, only filepairs
that match their respective criterion are kept in the output. When
`--pickaxe-all` is used, if even one filepair matches their respective
criterion in a changeset, the entire changeset is kept. This behavior
is designed to make reviewing changes in the context of the whole
changeset easier.
diffcore-order: For Sorting the Output Based on Filenames
---------------------------------------------------------

View File

@ -122,7 +122,7 @@ static void diffcore_pickaxe_grep(struct diff_options *o)
char errbuf[1024];
regerror(err, &regex, errbuf, 1024);
regfree(&regex);
die("invalid log-grep regex: %s", errbuf);
die("invalid regex: %s", errbuf);
}
pickaxe(&diff_queued_diff, o, &regex, NULL, diff_grep);
@ -246,7 +246,7 @@ static void diffcore_pickaxe_count(struct diff_options *o)
char errbuf[1024];
regerror(err, &regex, errbuf, 1024);
regfree(&regex);
die("invalid pickaxe regex: %s", errbuf);
die("invalid regex: %s", errbuf);
}
regexp = &regex;
} else {