combine-diff: show diffstat with the first parent.
authorJunio C Hamano <junkio@cox.net>
Tue, 18 Apr 2006 05:53:03 +0000 (22:53 -0700)
committerJunio C Hamano <junkio@cox.net>
Tue, 18 Apr 2006 05:53:03 +0000 (22:53 -0700)
Asking for stat (either with --stat or --patch-with-stat) gives
you diffstat for the first parent, even under combine-diff.

While the combined patch is useful to highlight the complexity
and interaction of the parts touched by all branches when
reviewing a merge commit, diffstat is a tool to assess the
extent of damage the merge brings in, and showing stat with the
first parent is more sensible than clever per-parent diffstat.

Signed-off-by: Junio C Hamano <junkio@cox.net>
combine-diff.c
index aef9006443e69f69fd5de4d5592f48baaca1a6f3..27f6f57f3ab8e94e853d67ba031437fe6491d52d 100644 (file)
@@ -831,10 +831,11 @@ void show_combined_diff(struct combine_diff_path *p,
        case DIFF_FORMAT_NAME:
                show_raw_diff(p, num_parent, rev);
                return;
-
-       default:
        case DIFF_FORMAT_PATCH:
                show_patch_diff(p, num_parent, dense, rev);
+               return;
+       default:
+               return;
        }
 }
 
@@ -847,10 +848,13 @@ void diff_tree_combined_merge(const unsigned char *sha1,
        struct commit_list *parents;
        struct combine_diff_path *p, *paths = NULL;
        int num_parent, i, num_paths;
+       int do_diffstat;
 
+       do_diffstat = (opt->output_format == DIFF_FORMAT_DIFFSTAT ||
+                      opt->with_stat);
        diffopts = *opt;
-       diffopts.output_format = DIFF_FORMAT_NO_OUTPUT;
        diffopts.with_raw = 0;
+       diffopts.with_stat = 0;
        diffopts.recursive = 1;
 
        /* count parents */
@@ -864,14 +868,24 @@ void diff_tree_combined_merge(const unsigned char *sha1,
             parents;
             parents = parents->next, i++) {
                struct commit *parent = parents->item;
+               /* show stat against the first parent even
+                * when doing combined diff.
+                */
+               if (i == 0 && do_diffstat)
+                       diffopts.output_format = DIFF_FORMAT_DIFFSTAT;
+               else
+                       diffopts.output_format = DIFF_FORMAT_NO_OUTPUT;
                diff_tree_sha1(parent->object.sha1, commit->object.sha1, "",
                               &diffopts);
                diffcore_std(&diffopts);
                paths = intersect_paths(paths, i, num_parent);
 
-               if (diffopts.with_stat && rev->loginfo)
-                       show_log(rev, rev->loginfo, "---\n");
+               if (do_diffstat && rev->loginfo)
+                       show_log(rev, rev->loginfo,
+                                opt->with_stat ? "---\n" : "\n");
                diff_flush(&diffopts);
+               if (opt->with_stat)
+                       putchar('\n');
        }
 
        /* find out surviving paths */