Code

diff-options: add --patch-with-stat
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>
Sat, 15 Apr 2006 11:41:18 +0000 (13:41 +0200)
committerJunio C Hamano <junkio@cox.net>
Sun, 16 Apr 2006 02:30:27 +0000 (19:30 -0700)
With this option, git prepends a diffstat in front of the patch.

Since I really, really do not know what a diffstat of a combined diff
("merge diff") should look like, the diffstat is not generated for these.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Documentation/diff-options.txt
diff.c
diff.h

index 447e522a7bf20f7c0c524aee169c776e6d51471c..c183dc9da0392bcfbae3e1edcd4d13f89a9923c3 100644 (file)
@@ -10,6 +10,9 @@
 --stat::
        Generate a diffstat instead of a patch.
 
+--patch-with-stat::
+       Generate patch and prepend its diffstat.
+
 -z::
        \0 line termination on output
 
diff --git a/diff.c b/diff.c
index 46e8529a649d493b4f5a6a4ddb80912290ac8a2e..b54bbfa627219b194333297829843e7200501ee4 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -1060,6 +1060,10 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
        }
        else if (!strcmp(arg, "--stat"))
                options->output_format = DIFF_FORMAT_DIFFSTAT;
+       else if (!strcmp(arg, "--patch-with-stat")) {
+               options->output_format = DIFF_FORMAT_PATCH;
+               options->with_stat = 1;
+       }
        else if (!strcmp(arg, "-z"))
                options->line_termination = 0;
        else if (!strncmp(arg, "-l", 2))
@@ -1529,7 +1533,7 @@ void diff_flush(struct diff_options *options)
        int diff_output_format = options->output_format;
        struct diffstat_t *diffstat = NULL;
 
-       if (diff_output_format == DIFF_FORMAT_DIFFSTAT) {
+       if (diff_output_format == DIFF_FORMAT_DIFFSTAT || options->with_stat) {
                diffstat = xcalloc(sizeof (struct diffstat_t), 1);
                diffstat->xm.consume = diffstat_consume;
        }
@@ -1541,6 +1545,17 @@ void diff_flush(struct diff_options *options)
                }
                putchar(options->line_termination);
        }
+       if (options->with_stat) {
+               for (i = 0; i < q->nr; i++) {
+                       struct diff_filepair *p = q->queue[i];
+                       flush_one_pair(p, DIFF_FORMAT_DIFFSTAT, options,
+                                       diffstat);
+               }
+               show_stats(diffstat);
+               free(diffstat);
+               diffstat = NULL;
+               putchar(options->line_termination);
+       }
        for (i = 0; i < q->nr; i++) {
                struct diff_filepair *p = q->queue[i];
                flush_one_pair(p, diff_output_format, options, diffstat);
diff --git a/diff.h b/diff.h
index 2f8aff2cd4bf1eb73218e1e1e3df404b99308c1d..f783baef14604678d1e638cc766bffdbdc43f691 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -25,6 +25,7 @@ struct diff_options {
        const char *pickaxe;
        unsigned recursive:1,
                 with_raw:1,
+                with_stat:1,
                 tree_in_recursive:1,
                 full_index:1;
        int break_opt;
@@ -120,6 +121,8 @@ extern void diffcore_std_no_resolve(struct diff_options *);
 "  --patch-with-raw\n" \
 "                output both a patch and the diff-raw format.\n" \
 "  --stat        show diffstat instead of patch.\n" \
+"  --patch-with-stat\n" \
+"                output a patch and prepend its diffstat.\n" \
 "  --name-only   show only names of changed files.\n" \
 "  --name-status show names and status of changed files.\n" \
 "  --full-index  show full object name on index lines.\n" \