1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-10 01:26:31 +02:00

format-patch: --rfc honors what --subject-prefix sets

Rather than replacing the configured subject prefix (either through the
git config or command line) entirely with "RFC PATCH", this change
prepends RFC to whatever subject prefix was already in use.

This is useful, for example, when a user is working on a repository that
has a subject prefix considered to disambiguate patches:

	git config format.subjectPrefix 'PATCH my-project'

Prior to this change, formatting patches with --rfc would lose the
'my-project' information.

The data flow for the subject-prefix was that rev.subject_prefix
were to be kept the authoritative version of the subject prefix even
while parsing command line options, and sprefix variable was used as
a temporary area to futz with it.  Now, the parsing code has been
refactored to build the subject prefix into the sprefix variable and
assigns its value at the end to rev.subject_prefix, which makes the
flow easier to grasp.

Signed-off-by: Drew DeVault <sir@cmpwn.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Drew DeVault 2023-08-30 08:43:33 +02:00 committed by Junio C Hamano
parent 5dc72c0fbc
commit e0d7db7423
3 changed files with 49 additions and 24 deletions

View File

@ -217,9 +217,15 @@ populated with placeholder text.
--subject-prefix=<subject prefix>::
Instead of the standard '[PATCH]' prefix in the subject
line, instead use '[<subject prefix>]'. This
allows for useful naming of a patch series, and can be
combined with the `--numbered` option.
line, instead use '[<subject prefix>]'. This can be used
to name a patch series, and can be combined with the
`--numbered` option.
+
The configuration variable `format.subjectPrefix` may also be used
to configure a subject prefix to apply to a given repository for
all patches. This is often useful on mailing lists which receive
patches for several repositories and can be used to disambiguate
the patches (with a value of e.g. "PATCH my-project").
--filename-max-length=<n>::
Instead of the standard 64 bytes, chomp the generated output
@ -229,9 +235,9 @@ populated with placeholder text.
variable, or 64 if unconfigured.
--rfc::
Alias for `--subject-prefix="RFC PATCH"`. RFC means "Request For
Comments"; use this when sending an experimental patch for
discussion rather than application.
Prepends "RFC" to the subject prefix (producing "RFC PATCH" by
default). RFC means "Request For Comments"; use this when sending
an experimental patch for discussion rather than application.
-v <n>::
--reroll-count=<n>::

View File

@ -1468,17 +1468,14 @@ static int subject_prefix = 0;
static int subject_prefix_callback(const struct option *opt, const char *arg,
int unset)
{
BUG_ON_OPT_NEG(unset);
subject_prefix = 1;
((struct rev_info *)opt->value)->subject_prefix = arg;
return 0;
}
struct strbuf *sprefix;
static int rfc_callback(const struct option *opt, const char *arg, int unset)
{
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
return subject_prefix_callback(opt, "RFC PATCH", unset);
sprefix = opt->value;
subject_prefix = 1;
strbuf_reset(sprefix);
strbuf_addstr(sprefix, arg);
return 0;
}
static int numbered_cmdline_opt = 0;
@ -1907,6 +1904,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
struct strbuf rdiff_title = STRBUF_INIT;
struct strbuf sprefix = STRBUF_INIT;
int creation_factor = -1;
int rfc = 0;
const struct option builtin_format_patch_options[] = {
OPT_CALLBACK_F('n', "numbered", &numbered, NULL,
@ -1930,13 +1928,11 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
N_("mark the series as Nth re-roll")),
OPT_INTEGER(0, "filename-max-length", &fmt_patch_name_max,
N_("max length of output filename")),
OPT_CALLBACK_F(0, "rfc", &rev, NULL,
N_("use [RFC PATCH] instead of [PATCH]"),
PARSE_OPT_NOARG | PARSE_OPT_NONEG, rfc_callback),
OPT_BOOL(0, "rfc", &rfc, N_("use [RFC PATCH] instead of [PATCH]")),
OPT_STRING(0, "cover-from-description", &cover_from_description_arg,
N_("cover-from-description-mode"),
N_("generate parts of a cover letter based on a branch's description")),
OPT_CALLBACK_F(0, "subject-prefix", &rev, N_("prefix"),
OPT_CALLBACK_F(0, "subject-prefix", &sprefix, N_("prefix"),
N_("use [<prefix>] instead of [PATCH]"),
PARSE_OPT_NONEG, subject_prefix_callback),
OPT_CALLBACK_F('o', "output-directory", &output_directory,
@ -2016,11 +2012,11 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
rev.max_parents = 1;
rev.diffopt.flags.recursive = 1;
rev.diffopt.no_free = 1;
rev.subject_prefix = fmt_patch_subject_prefix;
memset(&s_r_opt, 0, sizeof(s_r_opt));
s_r_opt.def = "HEAD";
s_r_opt.revarg_opt = REVARG_COMMITTISH;
strbuf_addstr(&sprefix, fmt_patch_subject_prefix);
if (format_no_prefix)
diff_set_noprefix(&rev.diffopt);
@ -2048,13 +2044,16 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
if (cover_from_description_arg)
cover_from_description_mode = parse_cover_from_description(cover_from_description_arg);
if (rfc)
strbuf_insertstr(&sprefix, 0, "RFC ");
if (reroll_count) {
strbuf_addf(&sprefix, "%s v%s",
rev.subject_prefix, reroll_count);
strbuf_addf(&sprefix, " v%s", reroll_count);
rev.reroll_count = reroll_count;
rev.subject_prefix = sprefix.buf;
}
rev.subject_prefix = sprefix.buf;
for (i = 0; i < extra_hdr.nr; i++) {
strbuf_addstr(&buf, extra_hdr.items[i].string);
strbuf_addch(&buf, '\n');

View File

@ -1373,7 +1373,27 @@ test_expect_success '--rfc' '
Subject: [RFC PATCH 1/1] header with . in it
EOF
git format-patch -n -1 --stdout --rfc >patch &&
grep ^Subject: patch >actual &&
grep "^Subject:" patch >actual &&
test_cmp expect actual
'
test_expect_success '--rfc does not overwrite prefix' '
cat >expect <<-\EOF &&
Subject: [RFC PATCH foobar 1/1] header with . in it
EOF
git -c format.subjectPrefix="PATCH foobar" \
format-patch -n -1 --stdout --rfc >patch &&
grep "^Subject:" patch >actual &&
test_cmp expect actual
'
test_expect_success '--rfc is argument order independent' '
cat >expect <<-\EOF &&
Subject: [RFC PATCH foobar 1/1] header with . in it
EOF
git format-patch -n -1 --stdout --rfc \
--subject-prefix="PATCH foobar" >patch &&
grep "^Subject:" patch >actual &&
test_cmp expect actual
'