X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=diff.c;h=3a1e6ce619baca3d209adf0c21fb8de197e7e0ac;hb=8f2b72a93666afe63ab39b279bbd4088bd5463ca;hp=46e8529a649d493b4f5a6a4ddb80912290ac8a2e;hpb=cbdda024049947366804d60bdc5e5fc3ab3ee3a5;p=git.git diff --git a/diff.c b/diff.c index 46e8529a..3a1e6ce6 100644 --- 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);