]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fmt-merge-msg: allow merge destination to be omitted again
authorJunio C Hamano <gitster@pobox.com>
Wed, 29 Jul 2020 22:50:01 +0000 (15:50 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 30 Jul 2020 19:43:10 +0000 (12:43 -0700)
In Git 2.28, we stopped special casing 'master' when producing the
default merge message by just removing the code to squelch "into
'master'" at the end of the message.

Introduce multi-valued merge.suppressDest configuration variable
that gives a set of globs to match against the name of the branch
into which the merge is being made, to let users specify for which
branch fmt-merge-msg's output should be shortened.  When it is not
set, 'master' is used as the sole value of the variable by default.

The above move mostly reverts the pre-2.28 default in repositories
that have no relevant configuration.

Add a few tests to protect the behaviour with the new configuration
variable from future regression.

Helped-by: Linus Torvalds <torvalds@linux-foundation.org>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/fmt-merge-msg.txt
fmt-merge-msg.c
t/t6200-fmt-merge-msg.sh

index c73cfa90b70c59c14cd4984c950711bef5b3f6bf..a8e8f74d0a25e6b857358cc78864c288d8fc4cfa 100644 (file)
@@ -8,3 +8,15 @@ merge.log::
        most the specified number of one-line descriptions from the
        actual commits that are being merged.  Defaults to false, and
        true is a synonym for 20.
+
+merge.suppressDest::
+       By adding a glob that matches the names of integration
+       branches to this multi-valued configuration variable, the
+       default merge message computed for merges into these
+       integration branches will omit " into <branch name>" from
+       its title.
++
+An element with an empty value can be used to clear the list
+of globs accumulated from previous configuration entries.
+When there is no `merge.suppressDest` variable defined, the
+default value of `master` is used for backward compatibility.
index 72d32bd73b11ddf7291f5e80b7e6afb6df5fdd33..bd22e1ea8865c086dd5e0c7fa32229036c1d83f3 100644 (file)
@@ -10,6 +10,8 @@
 #include "commit-reach.h"
 
 static int use_branch_desc;
+static int suppress_dest_pattern_seen;
+static struct string_list suppress_dest_patterns = STRING_LIST_INIT_DUP;
 
 int fmt_merge_msg_config(const char *key, const char *value, void *cb)
 {
@@ -22,6 +24,14 @@ int fmt_merge_msg_config(const char *key, const char *value, void *cb)
                        merge_log_config = DEFAULT_MERGE_LOG_LEN;
        } else if (!strcmp(key, "merge.branchdesc")) {
                use_branch_desc = git_config_bool(key, value);
+       } else if (!strcmp(key, "merge.suppressdest")) {
+               if (!value)
+                       return config_error_nonbool(key);
+               if (!*value)
+                       string_list_clear(&suppress_dest_patterns, 0);
+               else
+                       string_list_append(&suppress_dest_patterns, value);
+               suppress_dest_pattern_seen = 1;
        } else {
                return git_default_config(key, value, cb);
        }
@@ -403,6 +413,24 @@ static void shortlog(const char *name,
        string_list_clear(&subjects, 0);
 }
 
+/*
+ * See if dest_branch matches with any glob pattern on the
+ * suppress_dest_patterns list.
+ *
+ * We may want to also allow negative matches e.g. ":!glob" like we do
+ * for pathspec, but for now, let's keep it simple and stupid.
+ */
+static int dest_suppressed(const char *dest_branch)
+{
+       struct string_list_item *item;
+
+       for_each_string_list_item(item, &suppress_dest_patterns) {
+               if (!wildmatch(item->string, dest_branch, WM_PATHNAME))
+                       return 1;
+       }
+       return 0;
+}
+
 static void fmt_merge_msg_title(struct strbuf *out,
                                const char *current_branch)
 {
@@ -451,10 +479,9 @@ static void fmt_merge_msg_title(struct strbuf *out,
                        strbuf_addf(out, " of %s", srcs.items[i].string);
        }
 
-       if (!strcmp("master", current_branch))
-               strbuf_addch(out, '\n');
-       else
-               strbuf_addf(out, " into %s\n", current_branch);
+       if (!dest_suppressed(current_branch))
+               strbuf_addf(out, " into %s", current_branch);
+       strbuf_addch(out, '\n');
 }
 
 static void fmt_tag_signature(struct strbuf *tagbuf,
@@ -599,6 +626,9 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
        void *current_branch_to_free;
        struct merge_parents merge_parents;
 
+       if (!suppress_dest_pattern_seen)
+               string_list_append(&suppress_dest_patterns, "master");
+
        memset(&merge_parents, 0, sizeof(merge_parents));
 
        /* get current branch */
index e4c2a6eca43564eea71a0a633b5494dd4626544f..7d549748ef3015aade772944603e7b8efe20137b 100755 (executable)
@@ -542,4 +542,24 @@ test_expect_success 'merge-msg with "merging" an annotated tag' '
        test_cmp expected .git/MERGE_MSG
 '
 
+test_expect_success 'merge.suppressDest configuration' '
+       git checkout -B side master &&
+       git commit --allow-empty -m "One step ahead" &&
+       git checkout master &&
+       git fetch . side &&
+
+       git -c merge.suppressDest="" fmt-merge-msg <.git/FETCH_HEAD >full.1 &&
+       head -n1 full.1 >actual &&
+       grep -e "Merge branch .side. into master" actual &&
+
+       git -c merge.suppressDest="mast" fmt-merge-msg <.git/FETCH_HEAD >full.2 &&
+       head -n1 full.2 >actual &&
+       grep -e "Merge branch .side. into master$" actual &&
+
+       git -c merge.suppressDest="ma??er" fmt-merge-msg <.git/FETCH_HEAD >full.3 &&
+       head -n1 full.3 >actual &&
+       grep -e "Merge branch .side." actual &&
+       ! grep -e " into master$" actual
+'
+
 test_done