fmt-merge-msg: allow merge destination to be omitted again

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>
This commit is contained in:
Junio C Hamano 2020-07-29 15:50:01 -07:00
parent 21531927e4
commit 6e6029a82a
3 changed files with 66 additions and 4 deletions

View 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.

View 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 */

View File

@ -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