Add git-annotate(1) and git-blame(1)
[git.git] / diff.c
diff --git a/diff.c b/diff.c
index 46e8529..3a1e6ce 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -1029,6 +1029,16 @@ int diff_setup_done(struct diff_options *options)
             options->detect_rename != DIFF_DETECT_COPY) ||
            (0 <= options->rename_limit && !options->detect_rename))
                return -1;
+
+       /*
+        * These cases always need recursive; we do not drop caller-supplied
+        * recursive bits for other formats here.
+        */
+       if ((options->output_format == DIFF_FORMAT_PATCH) ||
+           (options->output_format == DIFF_FORMAT_DIFFSTAT) ||
+           (options->with_stat))
+               options->recursive = 1;
+
        if (options->detect_rename && options->rename_limit < 0)
                options->rename_limit = diff_rename_limit_default;
        if (options->setup & DIFF_SETUP_USE_CACHE) {
@@ -1060,6 +1070,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 +1543,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 +1555,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);