Code

diff --stat=width[,name-width]: allow custom diffstat output width.
authorLinus Torvalds <torvalds@osdl.org>
Thu, 28 Sep 2006 22:07:16 +0000 (15:07 -0700)
committerJunio C Hamano <junkio@cox.net>
Fri, 29 Sep 2006 05:27:29 +0000 (22:27 -0700)
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Documentation/diff-options.txt
diff.c

index b5d9763594b3fcb4dcc273c0118f7edbf236380d..7b7b9e8ce92db7fbb2072b75a613b073b0c5a4e6 100644 (file)
 --patch-with-raw::
        Synonym for "-p --raw".
 
---stat::
-       Generate a diffstat.
+--stat[=width[,name-width]]::
+       Generate a diffstat.  You can override the default
+       output width for 80-column terminal by "--stat=width".
+       The width of the filename part can be controlled by
+       giving another width to it separated by a comma.
 
 --summary::
        Output a condensed summary of extended header information
diff --git a/diff.c b/diff.c
index 3fd7a5220d283ef0e575cfb0d436c029977c632e..90e0844108e7e8765cbe1b5f4d6620c1fe2db115 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -1735,15 +1735,32 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
        else if (!strcmp(arg, "--patch-with-raw")) {
                options->output_format |= DIFF_FORMAT_PATCH | DIFF_FORMAT_RAW;
        }
-       else if (!strcmp(arg, "--stat"))
-               options->output_format |= DIFF_FORMAT_DIFFSTAT;
-       else if (!strncmp(arg, "--stat-width=", 13)) {
-               options->stat_width = strtoul(arg + 13, NULL, 10);
-               options->output_format |= DIFF_FORMAT_DIFFSTAT;
-       }
-       else if (!strncmp(arg, "--stat-name-width=", 18)) {
-               options->stat_name_width = strtoul(arg + 18, NULL, 10);
+       else if (!strncmp(arg, "--stat", 6)) {
+               char *end;
+               int width = options->stat_width;
+               int name_width = options->stat_name_width;
+               arg += 6;
+               end = (char *)arg;
+
+               switch (*arg) {
+               case '-':
+                       if (!strncmp(arg, "-width=", 7))
+                               width = strtoul(arg + 7, &end, 10);
+                       else if (!strncmp(arg, "-name-width=", 12))
+                               name_width = strtoul(arg + 12, &end, 10);
+                       break;
+               case '=':
+                       width = strtoul(arg+1, &end, 10);
+                       if (*end == ',')
+                               name_width = strtoul(end+1, &end, 10);
+               }
+
+               /* Important! This checks all the error cases! */
+               if (*end)
+                       return 0;
                options->output_format |= DIFF_FORMAT_DIFFSTAT;
+               options->stat_name_width = name_width;
+               options->stat_width = width;
        }
        else if (!strcmp(arg, "--check"))
                options->output_format |= DIFF_FORMAT_CHECKDIFF;