git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/4] diff.*.xfuncname which uses "extended" regex's for hunk header selection

From
Brandon Casey <casey@nrlssc.navy.mil>
Date
Sep 18, 2008, 00:10 UTC
Message-ID
<wgfIh_UVzwhXaVTN46Io8UDAq72MVwOkk7CobrAvp0330VRzwT2fuA@cipher.nrlssc.navy.mil>
In-Reply-To
<7v3ak06jzj.fsf@gitster.siamese.dyndns.org>

Currently, the hunk headers produced by 'diff -p' are customizable by setting the diff.*.funcname option in the config file. The 'funcname' option takes a basic regular expression. This functionality was designed using the GNU regex library which, by default, allows using backslashed versions of some extended regular expression operators, even in Basic Regular Expression mode. For example, the following characters, when backslashed, are interpreted according to the extended regular expression rules: ?, +, and |. As such, the builtin funcname patterns were created using some extended regular expression operators.

Other platforms which adhere more strictly to the POSIX spec do not interpret the backslashed extended RE operators in Basic Regular Expression mode. This causes the pattern matching for the builtin funcname patterns to fail on those platforms.

Introduce a new option 'xfuncname' which uses extended regular expressions, and advertise it _instead_ of funcname. Since most users are on GNU platforms, the majority of funcname patterns are created and tested there. Advertising only xfuncname should help to avoid the creation of non-portable patterns which work with GNU regex but not elsewhere.

Additionally, the extended regular expressions may be less ugly and complicated compared to the basic RE since many common special operators do not need to be backslashed.

For example, the GNU Basic RE:
    ^[ 	]*\\(\\(public\\|static\\).*\\)$
becomes the following Extended RE:
    ^[ 	]*((public|static).*)$
Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
---
 Documentation/gitattributes.txt |    4 ++--
 diff.c                          |    5 +++++
 t/t4018-diff-funcname.sh        |    2 +-
 3 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index 6f3551d..fa04eca 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -288,13 +288,13 @@ for paths.
 *.tex	diff=tex
 ------------------------
 
-Then, you would define "diff.tex.funcname" configuration to
+Then, you would define "diff.tex.xfuncname" configuration to
 specify a regular expression that matches a line that you would
 want to appear as the hunk header, like this:
 
 ------------------------
 [diff "tex"]
-	funcname = "^\\(\\\\\\(sub\\)*section{.*\\)$"
+	xfuncname = "^(\\\\(sub)*section{.*)$"
 ------------------------
 
 Note.  A single level of backslashes are eaten by the
diff --git a/diff.c b/diff.c
index 4363d0d..ad5e551 100644
--- a/diff.c
+++ b/diff.c
@@ -195,6 +195,11 @@ int git_diff_basic_config(const char *var, const char *value, void *cb)
 					return config_error_nonbool(var);
 				return parse_funcname_pattern(var, ep, value,
 					0);
+			} else if (!strcmp(ep, ".xfuncname")) {
+				if (!value)
+					return config_error_nonbool(var);
+				return parse_funcname_pattern(var, ep, value,
+					REG_EXTENDED);
 			}
 		}
 	}
diff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh
index 18bcd97..602d68f 100755
--- a/t/t4018-diff-funcname.sh
+++ b/t/t4018-diff-funcname.sh
@@ -58,7 +58,7 @@ test_expect_success 'last regexp must not be negated' '
 '
 
 test_expect_success 'alternation in pattern' '
-	git config diff.java.funcname "^[ 	]*\\(\\(public\\|static\\).*\\)$"
+	git config diff.java.xfuncname "^[ 	]*((public|static).*)$" &&
 	git diff --no-index Beer.java Beer-correct.java |
 	grep "^@@.*@@ public static void main("
 '
-- 
1.6.0.1.244.gdc19
Previous: Junio C HamanoNext: Brandon Casey
Message 21 of 44 in “Use compatibility regex library for OSX/Darwin”
  1. Use compatibility regex library for OSX/DarwinArjen Laarhoven, Sep 7, 2008
  2. Mike RalphsonSep 10, 2008
  3. Johannes SixtSep 10, 2008
  4. Arjen LaarhovenSep 10, 2008
  5. Mike RalphsonSep 10, 2008
  6. Mike RalphsonSep 11, 2008
  7. Use compatibility regex library also on AIXJohannes Sixt, Sep 11, 2008
  8. Arjen LaarhovenSep 11, 2008
  9. Mike RalphsonSep 11, 2008
  10. Jeff KingSep 11, 2008
  11. Junio C HamanoSep 11, 2008
  12. Brandon CaseySep 16, 2008
  13. Junio C HamanoSep 16, 2008
  14. 1/4 diff.c: return pattern entry pointer rather than just the hunk header patternBrandon Casey, Sep 18, 2008
  15. 2/4 diff.c: associate a flag with each pattern and use it for compiling regexBrandon Casey, Sep 18, 2008
  16. Junio C HamanoSep 18, 2008
  17. Andreas EricssonSep 18, 2008
  18. Junio C HamanoSep 18, 2008
  19. Andreas EricssonSep 18, 2008
  20. Junio C HamanoSep 18, 2008
  21. 3/4 diff.*.xfuncname which uses "extended" regex's for hunk header selectionBrandon Casey, Sep 18, 2008
  22. 4/4 diff.c: convert builtin funcname patterns to extended regular expressionsBrandon Casey, Sep 18, 2008
  23. 4/4 diff.c: convert builtin funcname patterns to extended regular expressionsBrandon Casey, Sep 18, 2008
  24. Andreas EricssonSep 18, 2008
  25. Junio C HamanoSep 18, 2008
  26. Johan HerlandSep 18, 2008
  27. Gustaf HendebySep 18, 2008
  28. Jonathan del StrotherSep 18, 2008
  29. Brandon CaseySep 18, 2008
  30. Jeff KingSep 16, 2008
  31. Boyd Lynn GerberSep 16, 2008
  32. Jeff KingSep 16, 2008
  33. Boyd Lynn GerberSep 16, 2008
  34. Jeff KingSep 16, 2008
  35. Boyd Lynn GerberSep 17, 2008
  36. Brandon CaseySep 17, 2008
  37. Boyd Lynn GerberSep 17, 2008
  38. Brandon CaseySep 17, 2008
  39. Boyd Lynn GerberSep 17, 2008
  40. Brandon CaseySep 17, 2008
  41. Boyd Lynn GerberSep 17, 2008
  42. Brandon CaseySep 17, 2008
  43. Boyd Lynn GerberSep 17, 2008
  44. Brandon CaseySep 19, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.