From patchwork Sun Feb 9 13:16:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "i.Dark_Templar" X-Patchwork-Id: 11372085 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B05A5186E for ; Sun, 9 Feb 2020 13:26:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 999152081E for ; Sun, 9 Feb 2020 13:26:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727678AbgBIN0h (ORCPT ); Sun, 9 Feb 2020 08:26:37 -0500 Received: from h4.fbrelay.privateemail.com ([131.153.2.45]:59976 "EHLO h4.fbrelay.privateemail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727514AbgBIN0g (ORCPT ); Sun, 9 Feb 2020 08:26:36 -0500 X-Greylist: delayed 431 seconds by postgrey-1.27 at vger.kernel.org; Sun, 09 Feb 2020 08:26:35 EST Received: from MTA-07-4.privateemail.com (mta-07.privateemail.com [198.54.127.57]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by h3.fbrelay.privateemail.com (Postfix) with ESMTPS id 5A93F80182 for ; Sun, 9 Feb 2020 08:19:25 -0500 (EST) Received: from MTA-07.privateemail.com (localhost [127.0.0.1]) by MTA-07.privateemail.com (Postfix) with ESMTP id 35F8F60045; Sun, 9 Feb 2020 08:19:24 -0500 (EST) Received: from localhost.localdomain (unknown [10.20.151.209]) by MTA-07.privateemail.com (Postfix) with ESMTPA id 5177460034; Sun, 9 Feb 2020 13:19:23 +0000 (UTC) From: "i.Dark_Templar" To: git@vger.kernel.org Cc: "i.Dark_Templar" Subject: [RFC PATCH 1/3] git-merge: add option to format default message using multiple lines Date: Sun, 9 Feb 2020 16:16:21 +0300 Message-Id: <20200209131623.5827-2-darktemplar@dark-templar-archives.net> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200209131623.5827-1-darktemplar@dark-templar-archives.net> References: <20200209131623.5827-1-darktemplar@dark-templar-archives.net> MIME-Version: 1.0 X-Virus-Scanned: ClamAV using ClamSMTP Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org If a lot of objects is merged at once, default commit message could become one very long line, which might be inconvenient to read. This change implements an option to change default autogenerated message so it'd take multiple lines, but each line wouldn't be long. An artificial example. Original merge commit message: Merge branch 'branch_with_some_long_name_1', remote-tracking branch 'clone/remote_branch_with_some_name', tags 'some_tag' and 'some_other_tag'; commit 'ae46a39cead2b42282abce725e90b561c06e94ba'; commit '33d0281e0eeb2a5e9907ebedc230e28c46865092' into merge7 Multiline merge commit message: Merge into merge8: branch 'branch_with_some_long_name_1' remote-tracking branch 'clone/remote_branch_with_some_name' tag 'some_tag' tag 'some_other_tag' commit 'ae46a39cead2b42282abce725e90b561c06e94ba' commit '33d0281e0eeb2a5e9907ebedc230e28c46865092' Signed-off-by: i.Dark_Templar --- Documentation/config/fmt-merge-msg.txt | 6 +++ builtin/fmt-merge-msg.c | 66 +++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/Documentation/config/fmt-merge-msg.txt b/Documentation/config/fmt-merge-msg.txt index c73cfa90b7..8c12540fa7 100644 --- a/Documentation/config/fmt-merge-msg.txt +++ b/Documentation/config/fmt-merge-msg.txt @@ -8,3 +8,9 @@ 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.multilineMessage:: + Make default merge commit message multiline. Every merged object + will be written using new line. This should ensure that + commit message wouldn't become one very long line when + there are a lot of merged objects. diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c index 05a92c59d8..93d44b59d9 100644 --- a/builtin/fmt-merge-msg.c +++ b/builtin/fmt-merge-msg.c @@ -20,6 +20,7 @@ static const char * const fmt_merge_msg_usage[] = { }; static int use_branch_desc; +static int use_multiline_default_message = 0; int fmt_merge_msg_config(const char *key, const char *value, void *cb) { @@ -32,6 +33,8 @@ 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.multilinemessage")) { + use_multiline_default_message = git_config_bool(key, value); } else { return git_default_config(key, value, cb); } @@ -467,6 +470,61 @@ static void fmt_merge_msg_title(struct strbuf *out, strbuf_addf(out, " into %s\n", current_branch); } +static void fmt_merge_msg_title_multiline(struct strbuf *out, + const char *current_branch) +{ + int i = 0; + int j = 0; + + if (!strcmp("master", current_branch)) + strbuf_addstr(out, "Merge:\n"); + else + strbuf_addf(out, "Merge into %s:\n", current_branch); + + for (i = 0; i < srcs.nr; i++) { + struct src_data *src_data = srcs.items[i].util; + int add_origin = 0; + + if (src_data->head_status == 1) { + strbuf_addf(out, "%s\n", srcs.items[i].string); + continue; + } + + add_origin = strcmp(".", srcs.items[i].string); + + if (src_data->head_status == 3) { + if (!add_origin) + strbuf_addstr(out, "HEAD\n"); + else + strbuf_addf(out, "HEAD of %s\n", srcs.items[i].string); + } + for (j = 0; j < src_data->branch.nr; j++) { + if (!add_origin) + strbuf_addf(out, "branch %s\n", src_data->branch.items[j].string); + else + strbuf_addf(out, "branch %s of %s\n", src_data->branch.items[j].string, srcs.items[i].string); + } + for (j = 0; j < src_data->r_branch.nr; j++) { + if (!add_origin) + strbuf_addf(out, "remote-tracking branch %s\n", src_data->r_branch.items[j].string); + else + strbuf_addf(out, "remote-tracking branch %s of %s\n", src_data->r_branch.items[j].string, srcs.items[i].string); + } + for (j = 0; j < src_data->tag.nr; j++) { + if (!add_origin) + strbuf_addf(out, "tag %s\n", src_data->tag.items[j].string); + else + strbuf_addf(out, "tag %s of %s\n", src_data->tag.items[j].string, srcs.items[i].string); + } + for (j = 0; j < src_data->generic.nr; j++) { + if (!add_origin) + strbuf_addf(out, "commit %s\n", src_data->generic.items[j].string); + else + strbuf_addf(out, "commit %s of %s\n", src_data->generic.items[j].string, srcs.items[i].string); + } + } +} + static void fmt_tag_signature(struct strbuf *tagbuf, struct strbuf *sig, const char *buf, @@ -634,8 +692,12 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out, die("error in line %d: %.*s", i, len, p); } - if (opts->add_title && srcs.nr) - fmt_merge_msg_title(out, current_branch); + if (opts->add_title && srcs.nr) { + if (!use_multiline_default_message) + fmt_merge_msg_title(out, current_branch); + else + fmt_merge_msg_title_multiline(out, current_branch); + } if (origins.nr) fmt_merge_msg_sigs(out); From patchwork Sun Feb 9 13:16:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "i.Dark_Templar" X-Patchwork-Id: 11372087 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 86A6F17F0 for ; Sun, 9 Feb 2020 13:33:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6FCE520715 for ; Sun, 9 Feb 2020 13:33:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727692AbgBINcV (ORCPT ); Sun, 9 Feb 2020 08:32:21 -0500 Received: from h2.fbrelay.privateemail.com ([131.153.2.43]:55332 "EHLO h2.fbrelay.privateemail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727654AbgBINcV (ORCPT ); Sun, 9 Feb 2020 08:32:21 -0500 Received: from MTA-07-4.privateemail.com (mta-07.privateemail.com [198.54.127.57]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by h1.fbrelay.privateemail.com (Postfix) with ESMTPS id 812B7800D5 for ; Sun, 9 Feb 2020 08:19:26 -0500 (EST) Received: from MTA-07.privateemail.com (localhost [127.0.0.1]) by MTA-07.privateemail.com (Postfix) with ESMTP id 76E7C60034; Sun, 9 Feb 2020 08:19:25 -0500 (EST) Received: from localhost.localdomain (unknown [10.20.151.209]) by MTA-07.privateemail.com (Postfix) with ESMTPA id 949B160043; Sun, 9 Feb 2020 13:19:24 +0000 (UTC) From: "i.Dark_Templar" To: git@vger.kernel.org Cc: "i.Dark_Templar" Subject: [RFC PATCH 2/3] Add merge commit message type autoselect logic Date: Sun, 9 Feb 2020 16:16:22 +0300 Message-Id: <20200209131623.5827-3-darktemplar@dark-templar-archives.net> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200209131623.5827-1-darktemplar@dark-templar-archives.net> References: <20200209131623.5827-1-darktemplar@dark-templar-archives.net> MIME-Version: 1.0 X-Virus-Scanned: ClamAV using ClamSMTP Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Signed-off-by: i.Dark_Templar --- Documentation/config/fmt-merge-msg.txt | 17 ++++-- builtin/fmt-merge-msg.c | 71 ++++++++++++++++++++++++-- 2 files changed, 78 insertions(+), 10 deletions(-) diff --git a/Documentation/config/fmt-merge-msg.txt b/Documentation/config/fmt-merge-msg.txt index 8c12540fa7..3829095222 100644 --- a/Documentation/config/fmt-merge-msg.txt +++ b/Documentation/config/fmt-merge-msg.txt @@ -9,8 +9,15 @@ merge.log:: actual commits that are being merged. Defaults to false, and true is a synonym for 20. -merge.multilineMessage:: - Make default merge commit message multiline. Every merged object - will be written using new line. This should ensure that - commit message wouldn't become one very long line when - there are a lot of merged objects. +merge.messageType:: + Configure default merge commit message type. `original` is used + if no value or an invalid value is set. + + + * `original` keeps old merge commit message format which takes only one line. + * `multiline` switches merge commit message to multiline mode. Every merged object + will be written using new line. This should ensure that commit message + wouldn't become one very long line when there are a lot of merged objects. + * `autoselect`, as it's name implies, selects one of following types + using arbitrary logic. Currently it selects `original` mode for merge + with only one additional object, otherwise switching to `multiline` mode, + but this behaviour may be changed in future without any notice. diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c index 93d44b59d9..0bc6ce5b05 100644 --- a/builtin/fmt-merge-msg.c +++ b/builtin/fmt-merge-msg.c @@ -14,13 +14,20 @@ #include "repository.h" #include "commit-reach.h" +enum message_format { + MESSAGE_FORMAT_ORIGINAL = 0, + MESSAGE_FORMAT_MULTILINE = 1, + MESSAGE_FORMAT_AUTOSELECT = 2, + MESSAGE_FORMAT_DEFAULT = MESSAGE_FORMAT_ORIGINAL +}; + static const char * const fmt_merge_msg_usage[] = { N_("git fmt-merge-msg [-m ] [--log[=] | --no-log] [--file ]"), NULL }; static int use_branch_desc; -static int use_multiline_default_message = 0; +static enum message_format default_message_format = MESSAGE_FORMAT_DEFAULT; int fmt_merge_msg_config(const char *key, const char *value, void *cb) { @@ -33,8 +40,16 @@ 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.multilinemessage")) { - use_multiline_default_message = git_config_bool(key, value); + } else if (!strcmp(key, "merge.messagetype")) { + if (!value) + return config_error_nonbool(key); + + if (!strcmp(value, "autoselect")) + default_message_format = MESSAGE_FORMAT_AUTOSELECT; + else if (!strcmp(value, "original")) + default_message_format = MESSAGE_FORMAT_ORIGINAL; + else if (!strcmp(value, "multiline")) + default_message_format = MESSAGE_FORMAT_MULTILINE; } else { return git_default_config(key, value, cb); } @@ -525,6 +540,43 @@ static void fmt_merge_msg_title_multiline(struct strbuf *out, } } +static void fmt_merge_msg_title_autoselect(struct strbuf *out, + const char *current_branch) +{ + int i = 0; + int j = 0; + int objects_count = 0; + + for (i = 0; i < srcs.nr; i++) { + struct src_data *src_data = srcs.items[i].util; + + if (src_data->head_status == 1) { + ++objects_count; + continue; + } + if (src_data->head_status == 3) { + ++objects_count; + } + for (j = 0; j < src_data->branch.nr; j++) { + ++objects_count; + } + for (j = 0; j < src_data->r_branch.nr; j++) { + ++objects_count; + } + for (j = 0; j < src_data->tag.nr; j++) { + ++objects_count; + } + for (j = 0; j < src_data->generic.nr; j++) { + ++objects_count; + } + } + + if (objects_count > 1) + fmt_merge_msg_title_multiline(out, current_branch); + else + fmt_merge_msg_title(out, current_branch); +} + static void fmt_tag_signature(struct strbuf *tagbuf, struct strbuf *sig, const char *buf, @@ -693,10 +745,19 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out, } if (opts->add_title && srcs.nr) { - if (!use_multiline_default_message) + switch (default_message_format) { + case MESSAGE_FORMAT_ORIGINAL: fmt_merge_msg_title(out, current_branch); - else + break; + case MESSAGE_FORMAT_MULTILINE: fmt_merge_msg_title_multiline(out, current_branch); + break; + case MESSAGE_FORMAT_AUTOSELECT: + fmt_merge_msg_title_autoselect(out, current_branch); + break; + default: + BUG("merge.messagetype value is not properly processed: %d", (int) default_message_format); + } } if (origins.nr) From patchwork Sun Feb 9 13:16:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "i.Dark_Templar" X-Patchwork-Id: 11372083 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9020317EF for ; Sun, 9 Feb 2020 13:26:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 788352081E for ; Sun, 9 Feb 2020 13:26:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727661AbgBIN0g (ORCPT ); Sun, 9 Feb 2020 08:26:36 -0500 Received: from h4.fbrelay.privateemail.com ([131.153.2.45]:39011 "EHLO h4.fbrelay.privateemail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727626AbgBIN0f (ORCPT ); Sun, 9 Feb 2020 08:26:35 -0500 Received: from MTA-07-4.privateemail.com (mta-07.privateemail.com [198.54.127.57]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by h3.fbrelay.privateemail.com (Postfix) with ESMTPS id DF48A8020C for ; Sun, 9 Feb 2020 08:19:27 -0500 (EST) Received: from MTA-07.privateemail.com (localhost [127.0.0.1]) by MTA-07.privateemail.com (Postfix) with ESMTP id BEFF160034; Sun, 9 Feb 2020 08:19:26 -0500 (EST) Received: from localhost.localdomain (unknown [10.20.151.209]) by MTA-07.privateemail.com (Postfix) with ESMTPA id D66D560043; Sun, 9 Feb 2020 13:19:25 +0000 (UTC) From: "i.Dark_Templar" To: git@vger.kernel.org Cc: "i.Dark_Templar" Subject: [RFC PATCH 3/3] Enable merge commit message type autoselect logic by default Date: Sun, 9 Feb 2020 16:16:23 +0300 Message-Id: <20200209131623.5827-4-darktemplar@dark-templar-archives.net> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200209131623.5827-1-darktemplar@dark-templar-archives.net> References: <20200209131623.5827-1-darktemplar@dark-templar-archives.net> MIME-Version: 1.0 X-Virus-Scanned: ClamAV using ClamSMTP Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Signed-off-by: i.Dark_Templar --- Documentation/config/fmt-merge-msg.txt | 2 +- builtin/fmt-merge-msg.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/config/fmt-merge-msg.txt b/Documentation/config/fmt-merge-msg.txt index 3829095222..acd998cca8 100644 --- a/Documentation/config/fmt-merge-msg.txt +++ b/Documentation/config/fmt-merge-msg.txt @@ -10,7 +10,7 @@ merge.log:: true is a synonym for 20. merge.messageType:: - Configure default merge commit message type. `original` is used + Configure default merge commit message type. `autoselect` is used if no value or an invalid value is set. + * `original` keeps old merge commit message format which takes only one line. diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c index 0bc6ce5b05..8fa39030d3 100644 --- a/builtin/fmt-merge-msg.c +++ b/builtin/fmt-merge-msg.c @@ -18,7 +18,7 @@ enum message_format { MESSAGE_FORMAT_ORIGINAL = 0, MESSAGE_FORMAT_MULTILINE = 1, MESSAGE_FORMAT_AUTOSELECT = 2, - MESSAGE_FORMAT_DEFAULT = MESSAGE_FORMAT_ORIGINAL + MESSAGE_FORMAT_DEFAULT = MESSAGE_FORMAT_AUTOSELECT }; static const char * const fmt_merge_msg_usage[] = {