diff: parse separate options --stat-width n, --stat-name-width n
authorMatthieu Moy <Matthieu.Moy@imag.fr>
Thu, 5 Aug 2010 08:22:54 +0000 (10:22 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 6 Aug 2010 16:14:36 +0000 (09:14 -0700)
Part of a campaign for unstuck forms of options.

[jn: with some refactoring]

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c

diff --git a/diff.c b/diff.c
index a08a56a9360856e02fdfa2f4742a359311f0a95e..e98d59b80ca76f1bb5caa303c57f23e3dc2e3b07 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -3035,16 +3035,34 @@ static int stat_opt(struct diff_options *options, const char **av)
        char *end;
        int width = options->stat_width;
        int name_width = options->stat_name_width;
+       int argcount = 1;
 
        arg += strlen("--stat");
        end = (char *)arg;
 
        switch (*arg) {
        case '-':
-               if (!prefixcmp(arg, "-width="))
-                       width = strtoul(arg + 7, &end, 10);
-               else if (!prefixcmp(arg, "-name-width="))
-                       name_width = strtoul(arg + 12, &end, 10);
+               if (!prefixcmp(arg, "-width")) {
+                       arg += strlen("-width");
+                       if (*arg == '=')
+                               width = strtoul(arg + 1, &end, 10);
+                       else if (!*arg && !av[1])
+                               die("Option '--stat-width' requires a value");
+                       else if (!*arg) {
+                               width = strtoul(av[1], &end, 10);
+                               argcount = 2;
+                       }
+               } else if (!prefixcmp(arg, "-name-width")) {
+                       arg += strlen("-name-width");
+                       if (*arg == '=')
+                               name_width = strtoul(arg + 1, &end, 10);
+                       else if (!*arg && !av[1])
+                               die("Option '--stat-name-width' requires a value");
+                       else if (!*arg) {
+                               name_width = strtoul(av[1], &end, 10);
+                               argcount = 2;
+                       }
+               }
                break;
        case '=':
                width = strtoul(arg+1, &end, 10);
@@ -3058,7 +3076,7 @@ static int stat_opt(struct diff_options *options, const char **av)
        options->output_format |= DIFF_FORMAT_DIFFSTAT;
        options->stat_name_width = name_width;
        options->stat_width = width;
-       return 1;
+       return argcount;
 }
 
 int diff_opt_parse(struct diff_options *options, const char **av, int ac)