diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -2654,19 +2654,28 @@ def diffstatdata(lines): if filename: results.append((filename, adds, removes, isbinary)) + # inheader is used to track if a line is in the + # header portion of the diff. This helps properly account + # for lines that start with '--' or '++' + inheader = False + for line in lines: if line.startswith('diff'): addresult() - # set numbers to 0 anyway when starting new file + # starting a new file diff + # set numbers to 0 and reset inheader + inheader = True adds, removes, isbinary = 0, 0, False if line.startswith('diff --git a/'): filename = gitre.search(line).group(2) elif line.startswith('diff -r'): # format: "diff -r ... -r ... filename" filename = diffre.search(line).group(1) - elif line.startswith('+') and not line.startswith('+++ '): + elif line.startswith('@@'): + inheader = False + elif line.startswith('+') and not inheader: adds += 1 - elif line.startswith('-') and not line.startswith('--- '): + elif line.startswith('-') and not inheader: removes += 1 elif (line.startswith('GIT binary patch') or line.startswith('Binary file')): diff --git a/tests/test-diffstat.t b/tests/test-diffstat.t --- a/tests/test-diffstat.t +++ b/tests/test-diffstat.t @@ -105,3 +105,83 @@ diffstat within directories: $ hg diff --stat --root . -I old $ cd .. + +Files with lines beginning with '--' or '++' should be properly counted in diffstat + + $ hg up -Cr tip + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ rm dir1/new + $ rm dir2/new + $ rm "file with spaces" + $ cat > file << EOF + > line 1 + > line 2 + > line 3 + > EOF + $ hg commit -Am file + adding file + +Lines added starting with '--' should count as additions + $ cat > file << EOF + > line 1 + > -- line 2, with dashes + > line 3 + > EOF + + $ hg diff --root . + diff -r be1569354b24 file + --- a/file Thu Jan 01 00:00:00 1970 +0000 + +++ b/file * (glob) + @@ -1,3 +1,3 @@ + line 1 + -line 2 + +-- line 2, with dashes + line 3 + + $ hg diff --root . --stat + file | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +Lines changed starting with '--' should count as deletions + $ hg commit -m filev2 + $ cat > file << EOF + > line 1 + > -- line 2, with dashes, changed again + > line 3 + > EOF + + $ hg diff --root . + diff -r 160f7c034df6 file + --- a/file Thu Jan 01 00:00:00 1970 +0000 + +++ b/file * (glob) + @@ -1,3 +1,3 @@ + line 1 + --- line 2, with dashes + +-- line 2, with dashes, changed again + line 3 + + $ hg diff --root . --stat + file | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +Lines changed starting with '--' should count as deletions +and starting with '++' should count as additions + $ cat > file << EOF + > line 1 + > ++ line 2, switched dashes to plusses + > line 3 + > EOF + + $ hg diff --root . + diff -r 160f7c034df6 file + --- a/file Thu Jan 01 00:00:00 1970 +0000 + +++ b/file * (glob) + @@ -1,3 +1,3 @@ + line 1 + --- line 2, with dashes + +++ line 2, switched dashes to plusses + line 3 + + $ hg diff --root . --stat + file | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-)