From a5a5a04863036678919705979b9c0f3579fa3710 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Wed, 1 Oct 2008 14:28:26 -0500 Subject: [PATCH] xdiff-interface.c: strip newline (and cr) from line before pattern matching POSIX doth sayeth: "In the regular expression processing described in IEEE Std 1003.1-2001, the is regarded as an ordinary character and both a period and a non-matching list can match one. ... Those utilities (like grep) that do not allow s to match are responsible for eliminating any from strings before matching against the RE." Thus far git has not been removing the trailing newline from strings matched against regular expression patterns. This has the effect that (quoting Jonathan del Strother) "... a line containing just 'FUNCNAME' (terminated by a newline) will be matched by the pattern '^(FUNCNAME.$)' but not '^(FUNCNAME$)'", and more simply not '^FUNCNAME$'. Signed-off-by: Brandon Casey Signed-off-by: Shawn O. Pearce --- xdiff-interface.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/xdiff-interface.c b/xdiff-interface.c index 8bab82ed7..f3f6db329 100644 --- a/xdiff-interface.c +++ b/xdiff-interface.c @@ -191,12 +191,22 @@ struct ff_regs { static long ff_regexp(const char *line, long len, char *buffer, long buffer_size, void *priv) { - char *line_buffer = xstrndup(line, len); /* make NUL terminated */ + char *line_buffer; struct ff_regs *regs = priv; regmatch_t pmatch[2]; int i; int result = -1; + /* Exclude terminating newline (and cr) from matching */ + if (len > 0 && line[len-1] == '\n') { + if (len > 1 && line[len-2] == '\r') + len -= 2; + else + len--; + } + + line_buffer = xstrndup(line, len); /* make NUL terminated */ + for (i = 0; i < regs->nr; i++) { struct ff_reg *reg = regs->array + i; if (!regexec(®->re, line_buffer, 2, pmatch, 0)) { -- 2.30.2