diff-parseopt: restore -U (no argument) behavior
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Wed, 29 May 2019 09:11:15 +0000 (16:11 +0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 29 May 2019 18:04:32 +0000 (11:04 -0700)
Before d473e2e0e8 (diff.c: convert -U|--unified, 2019-01-27), -U and
--unified are implemented with a custom parser opt_arg() in diff.c. I
didn't check this code carefully and not realize that it's the
equivalent of PARSE_OPT_NONEG | PARSE_OPT_OPTARG.

In other words, if -U is specified without any argument, the option
should be accepted, and the default value should be used. Without
PARSE_OPT_OPTARG, parse_options() will reject this case and cause a
regression.

Reported-by: Bryan Turner <bturner@atlassian.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c
t/t4013-diff-various.sh
t/t4013/diff.diff_-U1_initial..side [new file with mode: 0644]
t/t4013/diff.diff_-U2_initial..side [new file with mode: 0644]
t/t4013/diff.diff_-U_initial..side [new file with mode: 0644]

diff --git a/diff.c b/diff.c
index 4bc9df7..0abab4a 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -4875,9 +4875,11 @@ static int diff_opt_unified(const struct option *opt,
 
        BUG_ON_OPT_NEG(unset);
 
 
        BUG_ON_OPT_NEG(unset);
 
-       options->context = strtol(arg, &s, 10);
-       if (*s)
-               return error(_("%s expects a numerical value"), "--unified");
+       if (arg) {
+               options->context = strtol(arg, &s, 10);
+               if (*s)
+                       return error(_("%s expects a numerical value"), "--unified");
+       }
        enable_patch_output(&options->output_format);
 
        return 0;
        enable_patch_output(&options->output_format);
 
        return 0;
@@ -4895,7 +4897,7 @@ static void prep_parse_options(struct diff_options *options)
                          DIFF_FORMAT_PATCH, DIFF_FORMAT_NO_OUTPUT),
                OPT_CALLBACK_F('U', "unified", options, N_("<n>"),
                               N_("generate diffs with <n> lines context"),
                          DIFF_FORMAT_PATCH, DIFF_FORMAT_NO_OUTPUT),
                OPT_CALLBACK_F('U', "unified", options, N_("<n>"),
                               N_("generate diffs with <n> lines context"),
-                              PARSE_OPT_NONEG, diff_opt_unified),
+                              PARSE_OPT_NONEG | PARSE_OPT_OPTARG, diff_opt_unified),
                OPT_BOOL('W', "function-context", &options->flags.funccontext,
                         N_("generate diffs with <n> lines context")),
                OPT_BIT_F(0, "raw", &options->output_format,
                OPT_BOOL('W', "function-context", &options->flags.funccontext,
                         N_("generate diffs with <n> lines context")),
                OPT_BIT_F(0, "raw", &options->output_format,
index 7d985ff..3c4a3df 100755 (executable)
@@ -330,6 +330,8 @@ format-patch --inline --stdout initial..master^^
 format-patch --stdout --cover-letter -n initial..master^
 
 diff --abbrev initial..side
 format-patch --stdout --cover-letter -n initial..master^
 
 diff --abbrev initial..side
+diff -U initial..side
+diff -U1 initial..side
 diff -r initial..side
 diff --stat initial..side
 diff -r --stat initial..side
 diff -r initial..side
 diff --stat initial..side
 diff -r --stat initial..side
diff --git a/t/t4013/diff.diff_-U1_initial..side b/t/t4013/diff.diff_-U1_initial..side
new file mode 100644 (file)
index 0000000..b69f8f0
--- /dev/null
@@ -0,0 +1,29 @@
+$ git diff -U1 initial..side
+diff --git a/dir/sub b/dir/sub
+index 35d242b..7289e35 100644
+--- a/dir/sub
++++ b/dir/sub
+@@ -2 +2,3 @@ A
+ B
++1
++2
+diff --git a/file0 b/file0
+index 01e79c3..f4615da 100644
+--- a/file0
++++ b/file0
+@@ -3 +3,4 @@
+ 3
++A
++B
++C
+diff --git a/file3 b/file3
+new file mode 100644
+index 0000000..7289e35
+--- /dev/null
++++ b/file3
+@@ -0,0 +1,4 @@
++A
++B
++1
++2
+$
diff --git a/t/t4013/diff.diff_-U2_initial..side b/t/t4013/diff.diff_-U2_initial..side
new file mode 100644 (file)
index 0000000..8ffe04f
--- /dev/null
@@ -0,0 +1,31 @@
+$ git diff -U2 initial..side
+diff --git a/dir/sub b/dir/sub
+index 35d242b..7289e35 100644
+--- a/dir/sub
++++ b/dir/sub
+@@ -1,2 +1,4 @@
+ A
+ B
++1
++2
+diff --git a/file0 b/file0
+index 01e79c3..f4615da 100644
+--- a/file0
++++ b/file0
+@@ -2,2 +2,5 @@
+ 2
+ 3
++A
++B
++C
+diff --git a/file3 b/file3
+new file mode 100644
+index 0000000..7289e35
+--- /dev/null
++++ b/file3
+@@ -0,0 +1,4 @@
++A
++B
++1
++2
+$
diff --git a/t/t4013/diff.diff_-U_initial..side b/t/t4013/diff.diff_-U_initial..side
new file mode 100644 (file)
index 0000000..c66c0dd
--- /dev/null
@@ -0,0 +1,32 @@
+$ git diff -U initial..side
+diff --git a/dir/sub b/dir/sub
+index 35d242b..7289e35 100644
+--- a/dir/sub
++++ b/dir/sub
+@@ -1,2 +1,4 @@
+ A
+ B
++1
++2
+diff --git a/file0 b/file0
+index 01e79c3..f4615da 100644
+--- a/file0
++++ b/file0
+@@ -1,3 +1,6 @@
+ 1
+ 2
+ 3
++A
++B
++C
+diff --git a/file3 b/file3
+new file mode 100644
+index 0000000..7289e35
+--- /dev/null
++++ b/file3
+@@ -0,0 +1,4 @@
++A
++B
++1
++2
+$