[Bug 5798] New: annotate output is broken if the file contains multiple CR in a line

mercurial-bugs at mercurial-scm.org mercurial-bugs at mercurial-scm.org
Tue Feb 20 14:59:09 UTC 2018


https://bz.mercurial-scm.org/show_bug.cgi?id=5798

            Bug ID: 5798
           Summary: annotate output is broken if the file contains
                    multiple CR in a line
           Product: Mercurial
           Version: default branch
          Hardware: PC
                OS: Linux
            Status: UNCONFIRMED
          Severity: bug
          Priority: wish
         Component: Mercurial
          Assignee: bugzilla at mercurial-scm.org
          Reporter: hdk_2 at users.sourceforge.net
                CC: mercurial-devel at mercurial-scm.org

I found an incorrect output from hg annotate when I wrote a shell
script with multiple CR in a line, for example:

------------------------------------------------------------
echo -n Wait
sleep 1
echo -n '^M    ^M'
# Note: ^M is CR ('\r')
------------------------------------------------------------

The following bash script reproduces the bug:

------------------------------------------------------------
hg init
echo -e 'line0 \rtest\rtest' > a
echo line2 >> a
echo line3 >> a
hg add a
hg commit -m a -u a
hg annotate a | sed -n l
------------------------------------------------------------

The sed command is for looking at the CR in the output.  The output
is:

------------------------------------------------------------
0: line0 \r0: test\r0: test$
------------------------------------------------------------

The file a contains 3 lines, but the 'hg annotate a' outputs only the
first line.  The line2 and line3 are gone.  It seems that the annotate
command shows revision number 0 at every CR.

After the above command, the following command creates a next commit:

------------------------------------------------------------
echo -e 'line0 \rtest\rtest' > a
echo line1 >> a
echo line2 >> a
echo line3 >> a
hg commit -m b -u a
hg annotate a | sed -n l
------------------------------------------------------------

The command inserts the line1 between line0 and line2.  The output is:

------------------------------------------------------------
0: line0 \r1: test\r0: test$
0: line1$
------------------------------------------------------------

Interestingly, the 'hg annotate a' outputs revision 1 at the first CR,
and the new line1 as revision 0.  The line2 and line3 are still gone.

I guess that a revision number for each line is searched based on the
LF newline, but the annotate counts lines based on not only LF but CR
as a newline.  Both should use the same newline code to avoid such
broken output.  If both uses LF only, the expected output is:

------------------------------------------------------------
0: line0 \rtest\rtest$
1: line1$
0: line2$
0: line3$
------------------------------------------------------------

If both uses CR and LF for newline, the expected output is:

------------------------------------------------------------
0: line0 \r0: test\r0: test$
1: line1$
0: line2$
0: line3$
------------------------------------------------------------

-- 
You are receiving this mail because:
You are on the CC list for the bug.


More information about the Mercurial-devel mailing list