Skip to content

Commit

Permalink
xdiff-interface.c: strip newline (and cr) from line before pattern ma…
Browse files Browse the repository at this point in the history
…tching

POSIX doth sayeth:

   "In the regular expression processing described in IEEE Std 1003.1-2001,
    the <newline> 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 <newline>s to match are responsible for eliminating any
    <newline> 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 <casey@nrlssc.navy.mil>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
  • Loading branch information
Brandon Casey authored and Junio C Hamano committed Oct 16, 2008
1 parent b19d288 commit 563d5a2
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 2 deletions.
2 changes: 1 addition & 1 deletion t/t4018-diff-funcname.sh
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ test_expect_success 'last regexp must not be negated' '
grep "fatal: Last expression must not be negated:"
'

test_expect_failure 'pattern which matches to end of line' '
test_expect_success 'pattern which matches to end of line' '
git config diff.java.funcname "Beer$" &&
git diff --no-index Beer.java Beer-correct.java |
grep "^@@.*@@ Beer"
Expand Down
12 changes: 11 additions & 1 deletion xdiff-interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,11 +179,21 @@ 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 result = 0, i;

/* 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 (reg->negate ^ !!regexec(&reg->re,
Expand Down

0 comments on commit 563d5a2

Please sign in to comment.