Re: [PATCH 2/2] diff: add custom regular expressions for function names
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jul 5, 2007, 05:00 UTC
- Message-ID
- <7vwsxfe96i.fsf@assigned-by-dhcp.cox.net>
- In-Reply-To
- <7vejjnhpap.fsf@assigned-by-dhcp.cox.net>
Junio C Hamano <gitster@pobox.com> writes:
Show 15 quoted lines
> Linus Torvalds <torvalds@linux-foundation.org> writes: > >> On Wed, 4 Jul 2007, Johannes Schindelin wrote: >>> >>> This patch introduces a config variable diff.functionNameRegexp >>> which replaces the default heuristics. If the pattern contains >>> a group, the match of this group is used for the hunk header >>> instead of the whole match. >> >> Umm. Shouldn't it be a path-name based attribute instead? >> >> That way you can set it to be different things for different source files >> in the same repository.. IOW, think mixed Java/C codebases. > > Absolutely. I'll take it from there.
I'll follow-up this message with two patches.
The first one is almost the same as Johannes's, but I got rid of the new global variable. The second one discards Johannes's use of a single config variable and replaces it with gitattribute access.
The second one is still a WIP; currently you can mark the path to use java convention to find hunk header with:
$ echo '*.java funcname=java' >.gitattributes
If there are useful "hunk header regexp" to make built-in, you can add them to diff_hunk_header_regexp().
We also should allow user override or define custom regexp with a configuration section, perhaps like:
[funcname]
java = ...
perl = ...
default = ...There are enough existing code in diff and convert area that use (path -> attribute -> config) mapping in a very similar way and any git hacker wannabe should be able to mimick them to implement such a support, but tonight's WIP does not have it.
*NOTE IN BIG RED LETTERS*
I do not particularly like the way multiple regexps are used in Johannes's patch, but I left it as-is, as that part of the change is orthogonal from the support to use the gitattribute mechanism, and the primary reason I got involved in this topic is to give help around the latter area.
I think using multiple regexp is cute, but if we do that, it should allow people to pick from:
public class Beer
{
int special;
public static void main(String args[])
{
... modified part is here ...with two regexp matches, say:
/^(public|private|protectd) class (.*)/ then
/^ +.* (\w*\(.*)$/and define the hunk_header format as something like:
"\[1,2]::\[2,1]"
meaning, "pick the second capture group from the match data of the first regexp, followed by double-colon, and pick the first capture group from the match data of the second regexp", to result in "Beer::main(String args[])". You should be able to pick "/package (\w+);/ then /^sub (\w+)/" in Perl code using the same idea.
I am not married to the syntax I used in the above examples, though.