Patchwork [Bug,4146] New: `hg diff -b` behaves differently than `diff -b`

login
register
mail settings
Submitter mercurial-bugs@selenic.com
Date Jan. 15, 2014, 6:44 a.m.
Message ID <bug-4146-285@http.bz.selenic.com/>
Download mbox | patch
Permalink /patch/3331/
State Superseded
Headers show

Comments

mercurial-bugs@selenic.com - Jan. 15, 2014, 6:44 a.m.
http://bz.selenic.com/show_bug.cgi?id=4146

          Priority: normal
            Bug ID: 4146
                CC: mercurial-devel@selenic.com
          Assignee: bugzilla@selenic.com
           Summary: `hg diff -b` behaves differently than `diff -b`
          Severity: bug
    Classification: Unclassified
                OS: Linux
          Reporter: g.gherdovich@gmail.com
          Hardware: All
            Status: UNCONFIRMED
           Version: 2.7.2
         Component: Mercurial
           Product: Mercurial

When comparing two versions of a file with `hg diff -b`,
and the two versions are identical except for the newline at the end
(missing in one of the two), mercurial still asserts that
the last line is removed [-] and added [+].

GNU diff, instead, will say that the two files are identical
(provided the `-b` flag).

I wander if this is the desired behaviour for `hg diff`
or if it should follow what `diff -u` does.

To be more clear (here I use both "-b" and "-w" flags, just in case):

$ diff -b foo1 foo2
$ diff -w foo1 foo2
$ 
===================================================

Also: if somebody can explain me the differnce between the flags
"-b" (ignore changes in the amount of white space) and
"-w" (ignore white space when comparing lines).
I must be missing something obvious, but I cannot think of an example
which will pass one diff and not the other.

F.A.Q.: "What are you trying to do?"

I am writing a tool that works like `hg annotate` but on
"conflicted files", the ones containing the >>>>> <<<<<< markers
after `hg merge --tool=internal:merge`.
For each line in a conflicted region I want to know what is
the last revision that touched it (so that I know who to call to resolve the
merge).
For that, I run `hg annotate` on both sides of the merge and
then map the annotation on the conflicted file using `hg diff`.
If a line that never moved is marked as added & removed
because of the missing newline (added by the merge tool),
my strategy gets confused. I hoped that `hg diff -b` could fix that but...

Patch

===================================================
$ python -c "f=open('foo','w'); f.write('foo')"
$ hg init ; hg add foo ; hg commit -m foo
$ python -c "f=open('foo','w'); f.write('foo\n')"

$ hg diff foo
diff -r 9d171fe0bed2 foo
--- a/foo    Wed Jan 15 07:14:45 2014 +0100
+++ b/foo    Wed Jan 15 07:15:13 2014 +0100
@@ -1,1 +1,1 @@ 
-foo
\ No newline at end of file
+foo

$ hg diff -b foo
diff -r 9d171fe0bed2 foo
--- a/foo    Wed Jan 15 07:14:45 2014 +0100
+++ b/foo    Wed Jan 15 07:15:31 2014 +0100
@@ -1,1 +1,1 @@ 
-foo
\ No newline at end of file
+foo

$ hg diff -w foo
diff -r 9d171fe0bed2 foo
--- a/foo    Wed Jan 15 07:14:45 2014 +0100
+++ b/foo    Wed Jan 15 07:15:41 2014 +0100
@@ -1,1 +1,1 @@ 
-foo
\ No newline at end of file
+foo
===================================================

you can see that the line is signaled as removed and added.

GNU diff on the other hand:

===================================================
$ python -c "f=open('foo1','w'); f.write('foo')"
$ python -c "f=open('foo2','w'); f.write('foo\n')"
$ diff -u foo1 foo2
--- foo1    2014-01-15 07:18:48.856967899 +0100
+++ foo2    2014-01-15 07:19:03.328967757 +0100
@@ -1 +1 @@ 
-foo
\ No newline at end of file
+foo