From: Denton Liu <liu.denton@gmail.com>
To: Git Mailing List <git@vger.kernel.org>
Cc: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Junio C Hamano" <gitster@pobox.com>
Subject: [PATCH v2 3/6] format-patch: make cover letter subject configurable
Date: Thu, 16 May 2019 20:27:45 -0400 [thread overview]
Message-ID: <cc7e6909f85575d107e022997fdc8ae99baaee8f.1558052674.git.liu.denton@gmail.com> (raw)
In-Reply-To: <cover.1558052674.git.liu.denton@gmail.com>
We used to populate the subject of the cover letter generated by
git-format-patch with "*** SUBJECT HERE ***". However, if a user submits
multiple patchsets, they may want to keep a consistent subject between
rerolls.
If git-format-patch is run on a branch that has
`format.<branch-name>.coverSubject` defined, make the cover letter's
subject be that value instead of the generic "*** SUBJECT HERE ***".
In addition, add the `--cover-subject` option to override this setting.
Finally, make `git branch -d` also remove any `format.<branch-name>.*`
configs, just like it currently removes all `branch.<branch-name>.*`
configs.
Signed-off-by: Denton Liu <liu.denton@gmail.com>
---
Documentation/config/format.txt | 5 ++++
Documentation/git-format-patch.txt | 12 +++++++++
builtin/branch.c | 16 +++++++++---
builtin/log.c | 41 +++++++++++++++++++++++++-----
t/t3200-branch.sh | 4 ++-
t/t4014-format-patch.sh | 20 +++++++++++++++
t/t9902-completion.sh | 5 +++-
7 files changed, 91 insertions(+), 12 deletions(-)
diff --git a/Documentation/config/format.txt b/Documentation/config/format.txt
index dc77941c48..7d2b3b7331 100644
--- a/Documentation/config/format.txt
+++ b/Documentation/config/format.txt
@@ -36,6 +36,11 @@ format.subjectPrefix::
The default for format-patch is to output files with the '[PATCH]'
subject prefix. Use this variable to change that prefix.
+format.<branch-name>.coverSubject::
+ When format-patch generates a cover letter for the given
+ <branch-name>, use the specified subject for the cover letter
+ instead of the generic template.
+
format.signature::
The default for format-patch is to output a signature containing
the Git version number. Use this variable to change that default.
diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt
index 7b71d4e2ed..a43f317877 100644
--- a/Documentation/git-format-patch.txt
+++ b/Documentation/git-format-patch.txt
@@ -19,6 +19,7 @@ SYNOPSIS
[--start-number <n>] [--numbered-files]
[--in-reply-to=<Message-Id>] [--suffix=.<sfx>]
[--ignore-if-in-upstream]
+ [--cover-subject=<subject>]
[--rfc] [--subject-prefix=<Subject-Prefix>]
[(--reroll-count|-v) <n>]
[--to=<email>] [--cc=<email>]
@@ -170,6 +171,10 @@ will want to ensure that threading is disabled for `git send-email`.
patches being generated, and any patch that matches is
ignored.
+--cover-subject=<subject>::
+ Instead of using the default "*** SUBJECT HERE ***" subject for
+ the cover letter, use the given <subject>.
+
--subject-prefix=<Subject-Prefix>::
Instead of the standard '[PATCH]' prefix in the subject
line, instead use '[<Subject-Prefix>]'. This
@@ -346,6 +351,13 @@ attachments, and sign off patches with configuration variables.
coverletter = auto
------------
+In addition, for a specific branch, you can specify a custom cover
+letter subject.
+
+------------
+[format "branch-name"]
+ coverSubject = "subject for branch-name only"
+------------
DISCUSSION
----------
diff --git a/builtin/branch.c b/builtin/branch.c
index d4359b33ac..367e1fc9bc 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -178,12 +178,22 @@ static int check_branch_commit(const char *branchname, const char *refname,
return 0;
}
+static const char *branch_specific_config[] = {
+ "branch",
+ "format",
+ NULL
+};
+
static void delete_branch_config(const char *branchname)
{
struct strbuf buf = STRBUF_INIT;
- strbuf_addf(&buf, "branch.%s", branchname);
- if (git_config_rename_section(buf.buf, NULL) < 0)
- warning(_("Update of config-file failed"));
+ int i;
+ for (i = 0; branch_specific_config[i]; i++) {
+ strbuf_addf(&buf, "%s.%s", branch_specific_config[i], branchname);
+ if (git_config_rename_section(buf.buf, NULL) < 0)
+ warning(_("Update of config-file failed"));
+ strbuf_reset(&buf);
+ }
strbuf_release(&buf);
}
diff --git a/builtin/log.c b/builtin/log.c
index e43ee12fb1..2bbe712e7c 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -1030,17 +1030,33 @@ static void show_diffstat(struct rev_info *rev,
fprintf(rev->diffopt.file, "\n");
}
+static int read_branch_subject(struct strbuf *buf, const char *branch_name)
+{
+ char *v = NULL;
+ struct strbuf name = STRBUF_INIT;
+ strbuf_addf(&name, "format.%s.coverSubject", branch_name);
+ if (git_config_get_string(name.buf, &v)) {
+ strbuf_release(&name);
+ return -1;
+ }
+ strbuf_addstr(buf, v);
+ free(v);
+ strbuf_release(&name);
+ return 0;
+}
+
static void make_cover_letter(struct rev_info *rev, int use_stdout,
struct commit *origin,
int nr, struct commit **list,
const char *branch_name,
+ const char *subject,
int quiet)
{
const char *committer;
- const char *body = "*** SUBJECT HERE ***\n\n*** BLURB HERE ***\n";
- const char *msg;
+ const char *body = "*** BLURB HERE ***";
struct shortlog log;
struct strbuf sb = STRBUF_INIT;
+ struct strbuf subject_sb = STRBUF_INIT;
int i;
const char *encoding = "UTF-8";
int need_8bit_cte = 0;
@@ -1068,17 +1084,24 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
if (!branch_name)
branch_name = find_branch_name(rev);
- msg = body;
+ if (!subject) {
+ if (branch_name && *branch_name && !read_branch_subject(&subject_sb, branch_name))
+ subject = subject_sb.buf;
+ else
+ subject = "*** SUBJECT HERE ***";
+ }
+
pp.fmt = CMIT_FMT_EMAIL;
pp.date_mode.type = DATE_RFC2822;
pp.rev = rev;
pp.print_email_subject = 1;
pp_user_info(&pp, NULL, &sb, committer, encoding);
- pp_title_line(&pp, &msg, &sb, encoding, need_8bit_cte);
- pp_remainder(&pp, &msg, &sb, 0);
+ pp_title_line(&pp, &subject, &sb, encoding, need_8bit_cte);
+ pp_remainder(&pp, &body, &sb, 0);
add_branch_description(&sb, branch_name);
fprintf(rev->diffopt.file, "%s\n", sb.buf);
+ strbuf_release(&subject_sb);
strbuf_release(&sb);
shortlog_init(&log);
@@ -1512,6 +1535,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
int no_binary_diff = 0;
int zero_commit = 0;
struct commit *origin = NULL;
+ const char *cover_subject = NULL;
const char *in_reply_to = NULL;
struct patch_ids ids;
struct strbuf buf = STRBUF_INIT;
@@ -1554,6 +1578,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
{ OPTION_CALLBACK, 0, "rfc", &rev, NULL,
N_("Use [RFC PATCH] instead of [PATCH]"),
PARSE_OPT_NOARG | PARSE_OPT_NONEG, rfc_callback },
+ OPT_STRING(0, "cover-subject", &cover_subject, N_("subject"),
+ N_("the subject for the cover letter")),
{ OPTION_CALLBACK, 0, "subject-prefix", &rev, N_("prefix"),
N_("Use [<prefix>] instead of [PATCH]"),
PARSE_OPT_NONEG, subject_prefix_callback },
@@ -1617,8 +1643,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
extra_to.strdup_strings = 1;
extra_cc.strdup_strings = 1;
init_log_defaults();
- git_config(git_format_config, NULL);
repo_init_revisions(the_repository, &rev, prefix);
+
+ git_config(git_format_config, NULL);
rev.commit_format = CMIT_FMT_EMAIL;
rev.expand_tabs_in_log_default = 0;
rev.verbose_header = 1;
@@ -1893,7 +1920,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
if (thread)
gen_message_id(&rev, "cover");
make_cover_letter(&rev, use_stdout,
- origin, nr, list, branch_name, quiet);
+ origin, nr, list, branch_name, cover_subject, quiet);
print_bases(&bases, rev.diffopt.file);
print_signature(rev.diffopt.file);
total++;
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index e9ad50b66d..dad23f7d4c 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -782,9 +782,11 @@ test_expect_success 'test tracking setup via --track but deeper' '
'
test_expect_success 'test deleting branch deletes branch config' '
+ git config format.my7.coverSubject "cover subject" &&
git branch -d my7 &&
test -z "$(git config branch.my7.remote)" &&
- test -z "$(git config branch.my7.merge)"
+ test -z "$(git config branch.my7.merge)" &&
+ test -z "$(git config format.my7.coverSubject)"
'
test_expect_success 'test deleting branch without config' '
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index 3423f974bc..9d11992e10 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -1469,6 +1469,26 @@ test_expect_success 'format patch ignores color.ui' '
test_cmp expect actual
'
+test_expect_success 'cover letter with config subject' '
+ test_config format.rebuild-1.coverSubject "config subject" &&
+ git checkout rebuild-1 &&
+ git format-patch --stdout --cover-letter master >actual &&
+ grep "Subject: \[PATCH 0/2\] config subject" actual
+'
+
+test_expect_success 'cover letter with command-line subject' '
+ git checkout rebuild-1 &&
+ git format-patch --stdout --cover-letter --cover-subject "command-line subject" master >actual &&
+ grep "Subject: \[PATCH 0/2\] command-line subject" actual
+'
+
+test_expect_success 'cover letter with command-line subject overrides config' '
+ test_config format.rebuild-1.coverSubject "config subject" &&
+ git checkout rebuild-1 &&
+ git format-patch --stdout --cover-letter --cover-subject "command-line subject" master >actual &&
+ grep "Subject: \[PATCH 0/2\] command-line subject" actual
+'
+
test_expect_success 'cover letter using branch description (1)' '
git checkout rebuild-1 &&
test_config branch.rebuild-1.description hello &&
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 43cf313a1c..a96f1662c7 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -1548,7 +1548,10 @@ test_expect_success 'complete tree filename with metacharacters' '
'
test_expect_success PERL 'send-email' '
- test_completion "git send-email --cov" "--cover-letter " &&
+ test_completion "git send-email --cov" <<-\EOF &&
+ --cover-letter Z
+ --cover-subject=Z
+ EOF
test_completion "git send-email ma" "master "
'
--
2.21.0.1049.geb646f7864
next prev parent reply other threads:[~2019-05-17 0:27 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-05 16:24 [PATCH 0/7] teach branch-specific options for format-patch Denton Liu
2019-05-05 16:24 ` [PATCH 1/7] t4014: clean up style Denton Liu
2019-05-05 16:24 ` [PATCH 2/7] Doc: add more detail for git-format-patch Denton Liu
2019-05-05 16:24 ` [PATCH 3/7] branch.c: extract read_branch_config function Denton Liu
2019-05-05 16:24 ` [PATCH 4/7] format-patch: make cover letter subject configurable Denton Liu
2019-05-05 16:24 ` [PATCH 5/7] format-patch: move extra_headers logic later Denton Liu
2019-05-05 16:24 ` [PATCH 6/7] string-list: create string_list_append_all Denton Liu
2019-05-05 16:24 ` [PATCH 7/7] format-patch: read branch-specific To: and Cc: headers Denton Liu
2019-05-07 8:56 ` [PATCH 0/7] teach branch-specific options for format-patch Junio C Hamano
2019-05-07 14:19 ` Denton Liu
2019-05-07 15:05 ` Junio C Hamano
2019-05-07 15:21 ` Denton Liu
2019-05-07 15:46 ` Ævar Arnfjörð Bjarmason
2019-05-08 1:45 ` Junio C Hamano
2019-05-31 2:00 ` [RFC PATCH] config: learn the "onbranch:" includeIf condition Denton Liu
2019-05-31 12:58 ` Johannes Schindelin
2019-05-31 13:16 ` Denton Liu
2019-05-31 17:23 ` Johannes Schindelin
2019-05-31 18:44 ` Denton Liu
2019-05-31 19:33 ` [PATCH v2] " Denton Liu
2019-05-31 20:14 ` Johannes Schindelin
2019-06-05 8:02 ` Johannes Schindelin
2019-06-05 10:08 ` Duy Nguyen
2019-06-05 21:21 ` [PATCH v3] " Denton Liu
2019-06-06 12:52 ` Johannes Schindelin
2019-05-17 0:27 ` [PATCH v2 0/6] teach branch-specific options for format-patch Denton Liu
2019-05-17 0:27 ` [PATCH v2 1/6] t4014: clean up style Denton Liu
2019-05-17 0:27 ` [PATCH v2 2/6] Doc: add more detail for git-format-patch Denton Liu
2019-05-17 0:27 ` Denton Liu [this message]
2019-05-17 0:27 ` [PATCH v2 4/6] format-patch: move extra_headers logic later Denton Liu
2019-05-17 0:27 ` [PATCH v2 5/6] string-list: create string_list_append_all Denton Liu
2019-05-17 0:27 ` [PATCH v2 6/6] format-patch: read branch-specific To: and Cc: headers Denton Liu
2019-05-17 4:12 ` [PATCH v2 0/6] teach branch-specific options for format-patch Junio C Hamano
2019-05-17 7:25 ` Denton Liu
2019-05-17 16:54 ` Denton Liu
2019-05-22 2:44 ` [PATCH v3 0/8] " Denton Liu
2019-05-22 2:44 ` [PATCH v3 1/8] t4014: clean up style Denton Liu
2019-05-22 2:44 ` [PATCH v3 2/8] Doc: add more detail for git-format-patch Denton Liu
2019-05-22 2:44 ` [PATCH v3 3/8] format-patch: infer cover letter from branch description Denton Liu
2019-05-22 2:44 ` [PATCH v3 4/8] format-patch: move extra_headers logic later Denton Liu
2019-05-22 2:44 ` [PATCH v3 5/8] string-list: create string_list_append_all Denton Liu
2019-05-22 2:44 ` [PATCH v3 6/8] format-patch: read branch-specific To: and Cc: headers Denton Liu
2019-05-22 2:44 ` [PATCH v3 7/8] format-patch: move output_directory logic later Denton Liu
2019-05-22 2:44 ` [PATCH v3 8/8] format-patch: read branch-specific output directory Denton Liu
2019-05-31 0:30 ` [PATCH v3 0/8] teach branch-specific options for format-patch Denton Liu
2019-06-14 21:56 ` [RESEND PATCH " Denton Liu
2019-06-14 21:56 ` [RESEND PATCH v3 1/8] t4014: clean up style Denton Liu
2019-06-14 21:56 ` [RESEND PATCH v3 2/8] Doc: add more detail for git-format-patch Denton Liu
2019-06-14 21:56 ` [RESEND PATCH v3 3/8] format-patch: infer cover letter from branch description Denton Liu
2019-06-14 21:56 ` [RESEND PATCH v3 4/8] format-patch: move extra_headers logic later Denton Liu
2019-06-14 21:56 ` [RESEND PATCH v3 5/8] string-list: create string_list_append_all Denton Liu
2019-06-14 21:56 ` [RESEND PATCH v3 6/8] format-patch: read branch-specific To: and Cc: headers Denton Liu
2019-06-14 21:56 ` [RESEND PATCH v3 7/8] format-patch: move output_directory logic later Denton Liu
2019-06-14 21:56 ` [RESEND PATCH v3 8/8] format-patch: read branch-specific output directory Denton Liu
2019-10-15 9:06 ` [PATCH v6 0/3] format-patch: learn --infer-cover-subject option (also t4014 cleanup) Denton Liu
2019-10-15 9:06 ` [PATCH v6 1/3] format-patch: replace erroneous and condition Denton Liu
2019-10-15 9:06 ` [PATCH v6 2/3] format-patch: use enum variables Denton Liu
2019-10-15 9:06 ` [PATCH v6 3/3] format-patch: teach --cover-from-description option Denton Liu
2019-10-16 1:28 ` [PATCH v6 0/3] format-patch: learn --infer-cover-subject option (also t4014 cleanup) Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cc7e6909f85575d107e022997fdc8ae99baaee8f.1558052674.git.liu.denton@gmail.com \
--to=liu.denton@gmail.com \
--cc=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).