Re: git diff -U0 header off-by-one error when deleting no lines
- From
Junio C Hamano <gitster@pobox.com>
- Date
- May 3, 2023, 21:19 UTC
- Message-ID
- <xmqqednxp0ys.fsf@gitster.g>
- In-Reply-To
- <B097ECB7-1976-40FC-B91D-A60D648F973B@gmail.com>
Lukas Tenbrink <lukastenbrink@gmail.com> writes:
Show 9 quoted lines
> Thank you for filling out a Git bug report! > Please answer the following questions to help us understand your issue. > > What did you do before the bug happened? (Steps to reproduce your issue) > > Full reproduction: > > echo "A\nB\nC" > test1 > echo "A\nB\nC\nD\nE\nF" > test2
For many folks, the above will place one line each in these files. For portability, you'd need to do something like
printf "%s\n" A B C >test1 printf "%s\n" A B C D E F >test2
> git diff -U0 test1 test2
Show 11 quoted lines
> The actual output places the new text at line 3: > >> git diff -U0 test1 test2 > diff --git a/test1 b/test2 > index b1e6722..cead32e 100644 > --- a/test1 > +++ b/test2 > @@ -3,0 +4,3 @@ C > +D > +E > +F
I think this is very much in line with how "diff -U0" by other people do it, and any tool like "git am" that need to read "diff" output need to understand how these output work correctly; "-U0" output and ",1" that is omitted are things that have confused us tool writers forever ;-).
With -U0, you'd get
$ diff -U0 test1 test2
--- test1 2023-05-03 14:02:27.718960038 -0700
+++ test2 2023-05-03 14:02:20.094156573 -0700
@@ -3,0 +4,3 @@
+D
+E
+Fwhich has "-3,0" that says "there were 3 lines before this hunk that did not have any line before the change".
This might be unintuitive, but it is specified by POSIX.
Open
https://pubs.opengroup.org/onlinepubs/9699919799/
and look for "@@".
"@@-%s+%s@@", <file1 range>, <file2 range>
Each <range> field shall be of the form:
"%1d", <beginning line number>
or:
"%1d,1", <beginning line number>
if the range contains exactly one line, and:
"%1d,%1d", <beginning line number>, <number of lines>
otherwise.
If a range is empty, its beginning line number shall be the
number of the line just before the range, or 0 if the empty
range starts the file.So a patch that adds lines to an empty file would look like
$ diff -U0 /dev/null test1
--- /dev/null 2023-04-29 22:24:54.395999895 -0700
+++ test1 2023-05-03 14:02:27.718960038 -0700
@@ -0,0 +1,3 @@
+A
+B
+Cjust as specified. Note "-0,0" that says "there was no line before this hunk before this change".