]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diff-merges: let new options enable diff without -p
authorSergey Organov <sorganov@gmail.com>
Mon, 21 Dec 2020 15:19:53 +0000 (18:19 +0300)
committerJunio C Hamano <gitster@pobox.com>
Mon, 21 Dec 2020 21:47:32 +0000 (13:47 -0800)
New options don't have any visible effect unless -p is either given or
implied, as unlike -c/-cc we don't imply -p with --diff-merges. To fix
this, this patch adds new functionality by letting new options enable
output of diffs for merge commits only.

Add 'merges_need_diff' field and set it whenever diff output for merges is
enabled by any of the new options.

Extend diff output logic accordingly, to output diffs for merges when
'merges_need_diff' is set even when no -p has been provided.

Signed-off-by: Sergey Organov <sorganov@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff-merges.c
log-tree.c
revision.h

index 6d48ac5ab93de7b11bf40e8c88b66976cdf09247..ee91ed0db40978b510f6cf3af81e4a59c16373e4 100644 (file)
@@ -10,6 +10,7 @@ static void suppress(struct rev_info *revs)
        revs->dense_combined_merges = 0;
        revs->combined_all_paths = 0;
        revs->combined_imply_patch = 0;
+       revs->merges_need_diff = 0;
 }
 
 static void set_separate(struct rev_info *revs)
@@ -51,9 +52,13 @@ static void set_dense_combined(struct rev_info *revs)
 
 static void set_diff_merges(struct rev_info *revs, const char *optarg)
 {
-       if (!strcmp(optarg, "off") || !strcmp(optarg, "none"))
+       if (!strcmp(optarg, "off") || !strcmp(optarg, "none")) {
                suppress(revs);
-       else if (!strcmp(optarg, "first-parent"))
+               /* Return early to leave revs->merges_need_diff unset */
+               return;
+       }
+
+       if (!strcmp(optarg, "first-parent"))
                set_first_parent(revs);
        else if (!strcmp(optarg, "separate"))
                set_separate(revs);
@@ -63,6 +68,9 @@ static void set_diff_merges(struct rev_info *revs, const char *optarg)
                set_dense_combined(revs);
        else
                die(_("unknown value for --diff-merges: %s"), optarg);
+
+       /* The flag is cleared by set_xxx() functions, so don't move this up */
+       revs->merges_need_diff = 1;
 }
 
 /*
@@ -129,10 +137,9 @@ void diff_merges_setup_revs(struct rev_info *revs)
                revs->first_parent_merges = 0;
        if (revs->combined_all_paths && !revs->combine_merges)
                die("--combined-all-paths makes no sense without -c or --cc");
-       if (revs->combine_merges)
+       if (revs->combined_imply_patch)
                revs->diff = 1;
-       if (revs->combined_imply_patch) {
-               /* Turn --cc/-c into -p --cc/-c when -p was not given */
+       if (revs->combined_imply_patch || revs->merges_need_diff) {
                if (!revs->diffopt.output_format)
                        revs->diffopt.output_format = DIFF_FORMAT_PATCH;
        }
index f9385b1dae6f1450fc1386499c5598c5baf1710f..9f50a81e537e626dd6f9e2d4173925b5fc3e6cc2 100644 (file)
@@ -899,15 +899,21 @@ static int log_tree_diff(struct rev_info *opt, struct commit *commit, struct log
        int showed_log;
        struct commit_list *parents;
        struct object_id *oid;
+       int is_merge;
+       int all_need_diff = opt->diff || opt->diffopt.flags.exit_with_status;
 
-       if (!opt->diff && !opt->diffopt.flags.exit_with_status)
+       if (!all_need_diff && !opt->merges_need_diff)
                return 0;
 
        parse_commit_or_die(commit);
        oid = get_commit_tree_oid(commit);
 
-       /* Root commit? */
        parents = get_saved_parents(opt, commit);
+       is_merge = parents && parents->next;
+       if (!is_merge && !all_need_diff)
+               return 0;
+
+       /* Root commit? */
        if (!parents) {
                if (opt->show_root_diff) {
                        diff_root_tree_oid(oid, "", &opt->diffopt);
@@ -916,8 +922,7 @@ static int log_tree_diff(struct rev_info *opt, struct commit *commit, struct log
                return !opt->loginfo;
        }
 
-       /* More than one parent? */
-       if (parents->next) {
+       if (is_merge) {
                if (opt->combine_merges)
                        return do_diff_combined(opt, commit);
                if (opt->separate_merges) {
index bfbae526ad6efce77fd896df6a1df0d118c49034..494d86142454a359cd32b71d29792c7629003dd8 100644 (file)
@@ -194,6 +194,7 @@ struct rev_info {
                        always_show_header:1,
                        /* Diff-merge flags */
                        explicit_diff_merges: 1,
+                       merges_need_diff: 1,
                        separate_merges: 1,
                        combine_merges:1,
                        combined_all_paths:1,