Skip to content

Commit

Permalink
fmt-merge-msg: allow merge destination to be omitted again
Browse files Browse the repository at this point in the history
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 <[email protected]>
Helped-by: Jeff King <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
gitster committed Jul 30, 2020
1 parent 2153192 commit 6e6029a
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 4 deletions.
12 changes: 12 additions & 0 deletions Documentation/config/fmt-merge-msg.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.
38 changes: 34 additions & 4 deletions fmt-merge-msg.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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);
}
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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 */
Expand Down
20 changes: 20 additions & 0 deletions t/t6200-fmt-merge-msg.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 6e6029a

Please sign in to comment.