* [PATCH 0/3] [GSOC] commit: add own-identity option
@ 2021-03-19 12:06 ZheNing Hu via GitGitGadget
2021-03-19 12:06 ` [PATCH 1/3] [GSOC] commit: add --trailer option ZheNing Hu via GitGitGadget
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: ZheNing Hu via GitGitGadget @ 2021-03-19 12:06 UTC (permalink / raw)
To: git
Cc: Bradley M. Kuhn, Junio C Hamano, Brandon Casey, Shourya Shukla,
Christian Couder, Rafael Silva,
Đoàn Trần Công Danh, ZheNing Hu
This patch series is the basis for commit --trailer in #901 and provides
--own-identity option for --trailer.
Junio's suggestion is that we can provide --trailer="@SomeOne" in the later
stages to support filling multiple identities which obtain from git log.
ZheNing Hu (3):
[GSOC] commit: add --trailer option
[GSOC] interpret-trailers: add own-identity option
[GSOC] commit: add own-identity option
Documentation/git-commit.txt | 24 ++
Documentation/git-interpret-trailers.txt | 13 +
builtin/commit.c | 30 ++
builtin/interpret-trailers.c | 6 +-
t/t7501-commit-basic-functionality.sh | 91 ++++++
t/t7502-commit-porcelain.sh | 355 +++++++++++++++++++++++
t/t7513-interpret-trailers.sh | 12 +
trailer.c | 18 +-
trailer.h | 3 +-
9 files changed, 547 insertions(+), 5 deletions(-)
base-commit: 13d7ab6b5d7929825b626f050b62a11241ea4945
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-909%2Fadlternative%2Ftrailer_own_identity_option-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-909/adlternative/trailer_own_identity_option-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/909
--
gitgitgadget
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/3] [GSOC] commit: add --trailer option
2021-03-19 12:06 [PATCH 0/3] [GSOC] commit: add own-identity option ZheNing Hu via GitGitGadget
@ 2021-03-19 12:06 ` ZheNing Hu via GitGitGadget
2021-03-19 12:06 ` [PATCH 2/3] [GSOC] interpret-trailers: add own-identity option ZheNing Hu via GitGitGadget
2021-03-19 12:06 ` [PATCH 3/3] [GSOC] commit: " ZheNing Hu via GitGitGadget
2 siblings, 0 replies; 4+ messages in thread
From: ZheNing Hu via GitGitGadget @ 2021-03-19 12:06 UTC (permalink / raw)
To: git
Cc: Bradley M. Kuhn, Junio C Hamano, Brandon Casey, Shourya Shukla,
Christian Couder, Rafael Silva,
Đoàn Trần Công Danh, ZheNing Hu, ZheNing Hu
From: ZheNing Hu <adlternative@gmail.com>
Historically, Git has supported the 'Signed-off-by' commit trailer
using the '--signoff' and the '-s' option from the command line.
But users may need to provide other trailer information from the
command line such as "Helped-by", "Reported-by", "Mentored-by",
Now implement a new `--trailer <token>[(=|:)<value>]` option to pass
other trailers to `interpret-trailers` and insert them into commit
messages.
Signed-off-by: ZheNing Hu <adlternative@gmail.com>
---
Documentation/git-commit.txt | 11 +-
builtin/commit.c | 22 +++
t/t7502-commit-porcelain.sh | 335 +++++++++++++++++++++++++++++++++++
3 files changed, 367 insertions(+), 1 deletion(-)
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index 17150fa7eabe..2ba2fe0dd10e 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.txt
@@ -14,7 +14,8 @@ SYNOPSIS
[--allow-empty-message] [--no-verify] [-e] [--author=<author>]
[--date=<date>] [--cleanup=<mode>] [--[no-]status]
[-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]
- [-S[<keyid>]] [--] [<pathspec>...]
+ [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]
+ [--] [<pathspec>...]
DESCRIPTION
-----------
@@ -166,6 +167,14 @@ The `-m` option is mutually exclusive with `-c`, `-C`, and `-F`.
include::signoff-option.txt[]
+--trailer <token>[(=|:)<value>]::
+ Specify a (<token>, <value>) pair that should be applied as a
+ trailer. (e.g. `git commit --trailer "Signed-off-by:C O Mitter \
+ <committer@example.com>" --trailer "Helped-by:C O Mitter \
+ <committer@example.com>"` will add the "Signed-off-by" trailer
+ and the "Helped-by" trailer in the commit message.)
+ Use `git -c trailer.* commit --trailer` to make the appropriate
+ configuration. See linkgit:git-interpret-trailers[1] for details.
-n::
--no-verify::
This option bypasses the pre-commit and commit-msg hooks.
diff --git a/builtin/commit.c b/builtin/commit.c
index 739110c5a7f6..4b06672bd07d 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -113,6 +113,7 @@ static int config_commit_verbose = -1; /* unspecified */
static int no_post_rewrite, allow_empty_message, pathspec_file_nul;
static char *untracked_files_arg, *force_date, *ignore_submodule_arg, *ignored_arg;
static char *sign_commit, *pathspec_from_file;
+static struct strvec trailer_args = STRVEC_INIT;
/*
* The default commit message cleanup mode will remove the lines
@@ -131,6 +132,14 @@ static struct strbuf message = STRBUF_INIT;
static enum wt_status_format status_format = STATUS_FORMAT_UNSPECIFIED;
+static int opt_pass_trailer(const struct option *opt, const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+
+ strvec_pushl(&trailer_args, "--trailer", arg, NULL);
+ return 0;
+}
+
static int opt_parse_porcelain(const struct option *opt, const char *arg, int unset)
{
enum wt_status_format *value = (enum wt_status_format *)opt->value;
@@ -958,6 +967,18 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
fclose(s->fp);
+ if (trailer_args.nr) {
+ struct child_process run_trailer = CHILD_PROCESS_INIT;
+
+ strvec_pushl(&run_trailer.args, "interpret-trailers",
+ "--in-place", git_path_commit_editmsg(), NULL);
+ strvec_pushv(&run_trailer.args, trailer_args.v);
+ run_trailer.git_cmd = 1;
+ if (run_command(&run_trailer))
+ die(_("unable to pass trailers to --trailers"));
+ strvec_clear(&trailer_args);
+ }
+
/*
* Reject an attempt to record a non-merge empty commit without
* explicit --allow-empty. In the cherry-pick case, it may be
@@ -1507,6 +1528,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
OPT_STRING(0, "fixup", &fixup_message, N_("commit"), N_("use autosquash formatted message to fixup specified commit")),
OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")),
OPT_BOOL(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")),
+ OPT_CALLBACK_F(0, "trailer", NULL, N_("trailer"), N_("add custom trailer(s)"), PARSE_OPT_NONEG, opt_pass_trailer),
OPT_BOOL('s', "signoff", &signoff, N_("add a Signed-off-by trailer")),
OPT_FILENAME('t', "template", &template_file, N_("use specified template file")),
OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
diff --git a/t/t7502-commit-porcelain.sh b/t/t7502-commit-porcelain.sh
index 6396897cc818..024cf3c81b18 100755
--- a/t/t7502-commit-porcelain.sh
+++ b/t/t7502-commit-porcelain.sh
@@ -154,6 +154,341 @@ test_expect_success 'sign off' '
'
+test_expect_success 'commit --trailer without -c' '
+ echo "fun" >>file &&
+ git add file &&
+ cat >expected <<-\EOF &&
+
+ Signed-off-by: C O Mitter <committer@example.com>
+ Signed-off-by: C1 E1
+ Helped-by: C2 E2
+ Reported-by: C3 E3
+ Mentored-by: C4 E4
+ EOF
+ git commit -s --trailer "Signed-off-by:C1 E1 " \
+ --trailer "Helped-by:C2 E2 " \
+ --trailer "Reported-by:C3 E3" \
+ --trailer "Mentored-by:C4 E4" \
+ -m "hello" &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --trailer with -c and "replace" as ifexists' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Signed-off-by: C O Mitter <committer@example.com>
+ Signed-off-by: C1 E1
+ Reported-by: C3 E3
+ Mentored-by: C4 E4
+ Helped-by: C3 E3
+ EOF
+ git -c trailer.ifexists="replace" \
+ commit --trailer "Mentored-by: C4 E4" \
+ --trailer "Helped-by: C3 E3" \
+ --amend &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --trailer with -c and "add" as ifexists' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Signed-off-by: C O Mitter <committer@example.com>
+ Signed-off-by: C1 E1
+ Reported-by: C3 E3
+ Mentored-by: C4 E4
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ EOF
+ git -c trailer.ifexists="add" \
+ commit --trailer "Helped-by: C3 E3" \
+ --trailer "Helped-by: C3 E3" \
+ --amend &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --trailer with -c and "donothing" as ifexists' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Signed-off-by: C O Mitter <committer@example.com>
+ Signed-off-by: C1 E1
+ Reported-by: C3 E3
+ Mentored-by: C4 E4
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Reviewed-by: C6 E6
+ EOF
+ git -c trailer.ifexists="donothing" \
+ commit --trailer "Mentored-by: C5 E5" \
+ --trailer "Reviewed-by: C6 E6" \
+ --amend &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --trailer with -c and "addIfDifferent" as ifexists' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Signed-off-by: C O Mitter <committer@example.com>
+ Signed-off-by: C1 E1
+ Reported-by: C3 E3
+ Mentored-by: C4 E4
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Reviewed-by: C6 E6
+ Reported-by: C5 E5
+ EOF
+ git -c trailer.ifexists="addIfDifferent" \
+ commit --trailer "Reviewed-by: C6 E6" \
+ --trailer "Reported-by: C5 E5" \
+ --amend &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --trailer with -c and "addIfDifferentNeighbor" as ifexists' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Signed-off-by: C O Mitter <committer@example.com>
+ Signed-off-by: C1 E1
+ Reported-by: C3 E3
+ Mentored-by: C4 E4
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Reviewed-by: C6 E6
+ Reported-by: C5 E5
+ EOF
+ git -c trailer.ifexists="addIfDifferent" \
+ commit --trailer "Reported-by: C5 E5" \
+ --trailer "Reviewed-by: C6 E6" \
+ --amend &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --trailer with -c and "end" as where' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Signed-off-by: C O Mitter <committer@example.com>
+ Signed-off-by: C1 E1
+ Reported-by: C3 E3
+ Mentored-by: C4 E4
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Reviewed-by: C6 E6
+ Reported-by: C5 E5
+ Reported-by: C7 E7
+ EOF
+ git -c trailer.where="end" \
+ commit --trailer "Reported-by: C5 E5" \
+ --trailer "Reported-by: C7 E7" \
+ --amend &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --trailer with -c and "start" as where' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Signed-off-by: C8 E8
+ Signed-off-by: C O Mitter <committer@example.com>
+ Signed-off-by: C1 E1
+ Reported-by: C3 E3
+ Mentored-by: C4 E4
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Reviewed-by: C6 E6
+ Reported-by: C5 E5
+ Reported-by: C7 E7
+ EOF
+ git -c trailer.where="start" \
+ commit --trailer "Signed-off-by: C8 E8" \
+ --trailer "Signed-off-by: C8 E8" \
+ --amend &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --trailer with -c and "after" as where' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Signed-off-by: C8 E8
+ Signed-off-by: C O Mitter <committer@example.com>
+ Signed-off-by: C1 E1
+ Reported-by: C3 E3
+ Mentored-by: C4 E4
+ Mentored-by: C9 E9
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Reviewed-by: C6 E6
+ Reported-by: C5 E5
+ Reported-by: C7 E7
+ Reported-by: C10 E10
+ EOF
+ git -c trailer.where="after" \
+ commit --trailer "Mentored-by: C9 E9" \
+ --trailer "Reported-by: C10 E10" \
+ --amend &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --trailer with -c and "before" as where' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Signed-off-by: C8 E8
+ Signed-off-by: C O Mitter <committer@example.com>
+ Signed-off-by: C1 E1
+ Reported-by: C11 E11
+ Reported-by: C3 E3
+ Mentored-by: C4 E4
+ Mentored-by: C9 E9
+ Helped-by: C12 E12
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Reviewed-by: C6 E6
+ Reported-by: C5 E5
+ Reported-by: C7 E7
+ Reported-by: C10 E10
+ EOF
+ git -c trailer.where="before" \
+ commit --trailer "Helped-by: C12 E12" \
+ --trailer "Reported-by: C11 E11" \
+ --amend &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --trailer with -c and "donothing" as ifmissing' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Signed-off-by: C8 E8
+ Signed-off-by: C O Mitter <committer@example.com>
+ Signed-off-by: C1 E1
+ Reported-by: C11 E11
+ Reported-by: C3 E3
+ Mentored-by: C4 E4
+ Mentored-by: C9 E9
+ Helped-by: C12 E12
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Reviewed-by: C6 E6
+ Reported-by: C5 E5
+ Reported-by: C7 E7
+ Reported-by: C10 E10
+ Helped-by: C12 E12
+ EOF
+ git -c trailer.ifmissing="donothing" \
+ commit --trailer "Helped-by: C12 E12" \
+ --trailer "Based-by: C13 E13" \
+ --amend &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --trailer with -c and "add" as ifmissing' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Signed-off-by: C8 E8
+ Signed-off-by: C O Mitter <committer@example.com>
+ Signed-off-by: C1 E1
+ Reported-by: C11 E11
+ Reported-by: C3 E3
+ Mentored-by: C4 E4
+ Mentored-by: C9 E9
+ Helped-by: C12 E12
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Helped-by: C3 E3
+ Reviewed-by: C6 E6
+ Reported-by: C5 E5
+ Reported-by: C7 E7
+ Reported-by: C10 E10
+ Helped-by: C12 E12
+ Based-by: C13 E13
+ EOF
+ git -c trailer.ifmissing="add" \
+ commit --trailer "Helped-by: C12 E12" \
+ --trailer "Based-by: C13 E13" \
+ --amend &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --trailer with "=" ' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Acked-by: Peff
+ EOF
+ git -c trailer.ack.key="Acked-by" \
+ commit --trailer "ack = Peff" -m "hello" &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --trailer with -c and ":=#" as separators' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Bug #42
+ EOF
+ git -c trailer.separators=":=#" \
+ -c trailer.bug.key="Bug #" \
+ commit --trailer "bug = 42" -m "I hate bug" &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
test_expect_success 'multiple -m' '
>negative &&
--
gitgitgadget
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] [GSOC] interpret-trailers: add own-identity option
2021-03-19 12:06 [PATCH 0/3] [GSOC] commit: add own-identity option ZheNing Hu via GitGitGadget
2021-03-19 12:06 ` [PATCH 1/3] [GSOC] commit: add --trailer option ZheNing Hu via GitGitGadget
@ 2021-03-19 12:06 ` ZheNing Hu via GitGitGadget
2021-03-19 12:06 ` [PATCH 3/3] [GSOC] commit: " ZheNing Hu via GitGitGadget
2 siblings, 0 replies; 4+ messages in thread
From: ZheNing Hu via GitGitGadget @ 2021-03-19 12:06 UTC (permalink / raw)
To: git
Cc: Bradley M. Kuhn, Junio C Hamano, Brandon Casey, Shourya Shukla,
Christian Couder, Rafael Silva,
Đoàn Trần Công Danh, ZheNing Hu, ZheNing Hu
From: ZheNing Hu <adlternative@gmail.com>
`git commit --trailer="Signed-off-by: \
$(git config user.name) <$(git config user.email)>"`
is difficult for users to add their own identities,
so teach interpret-trailers a new option `--own-identity`
which allow if we're optionalise <value> in `--trailer`,
by substitute user's identity if missing. This will help
the use of `commit --trailer` as easy as `commit --signoff`.
Signed-off-by: ZheNing Hu <adlternative@gmail.com>
---
Documentation/git-interpret-trailers.txt | 13 +++++++++++++
builtin/interpret-trailers.c | 6 ++++--
t/t7513-interpret-trailers.sh | 12 ++++++++++++
trailer.c | 18 ++++++++++++++++--
trailer.h | 3 ++-
5 files changed, 47 insertions(+), 5 deletions(-)
diff --git a/Documentation/git-interpret-trailers.txt b/Documentation/git-interpret-trailers.txt
index 96ec6499f001..25f6732d9e6d 100644
--- a/Documentation/git-interpret-trailers.txt
+++ b/Documentation/git-interpret-trailers.txt
@@ -84,6 +84,19 @@ OPTIONS
trailer to the input messages. See the description of this
command.
+--own-identity::
+ Used with `--trailer`. Those trailers without value with the
+ `--own-identity` option all will add the user's own identity.
+ For example,` git interpret-trailers --trailer "A:B" --trailer \
+ "Signed-off-by" --trailer "Helped-by" --own-identity --inplace a.txt`
+ will output:
+ "
+ A:B
+ Signed-off-by: C O Mitter <committer@example.com>
+ Helped-by: C O Mitter <committer@example.com>
+ "
+ in `a.txt`.
+
--where <placement>::
--no-where::
Specify where all new trailers will be added. A setting
diff --git a/builtin/interpret-trailers.c b/builtin/interpret-trailers.c
index 84748eafc01b..be7f502a58d7 100644
--- a/builtin/interpret-trailers.c
+++ b/builtin/interpret-trailers.c
@@ -47,6 +47,7 @@ static void new_trailers_clear(struct list_head *trailers)
list_for_each_safe(pos, tmp, trailers) {
item = list_entry(pos, struct new_trailer_item, list);
list_del(pos);
+ free(item->text);
free(item);
}
}
@@ -66,7 +67,7 @@ static int option_parse_trailer(const struct option *opt,
return -1;
item = xmalloc(sizeof(*item));
- item->text = arg;
+ item->text = xstrdup(arg);
item->where = where;
item->if_exists = if_exists;
item->if_missing = if_missing;
@@ -94,7 +95,8 @@ int cmd_interpret_trailers(int argc, const char **argv, const char *prefix)
struct option options[] = {
OPT_BOOL(0, "in-place", &opts.in_place, N_("edit files in place")),
OPT_BOOL(0, "trim-empty", &opts.trim_empty, N_("trim empty trailers")),
-
+ OPT_BOOL(0, "own-identity", &opts.own_identity,
+ N_("specify the user's own identity for omitted trailers value")),
OPT_CALLBACK(0, "where", NULL, N_("action"),
N_("where to place the new trailer"), option_parse_where),
OPT_CALLBACK(0, "if-exists", NULL, N_("action"),
diff --git a/t/t7513-interpret-trailers.sh b/t/t7513-interpret-trailers.sh
index 6602790b5f4c..f82cee93bfb2 100755
--- a/t/t7513-interpret-trailers.sh
+++ b/t/t7513-interpret-trailers.sh
@@ -63,6 +63,18 @@ test_expect_success 'without config' '
test_cmp expected actual
'
+test_expect_success 'without config with --own-identity' '
+ cat >expected <<-\EOF &&
+
+ Acked-by: A B <C>
+ Helped-by: C O Mitter <committer@example.com>
+ Signed-off-by: C O Mitter <committer@example.com>
+ EOF
+ git interpret-trailers --trailer "Acked-by: A B <C>" --trailer "Helped-by" \
+ --trailer "Signed-off-by" --own-identity empty >actual &&
+ test_cmp expected actual
+'
+
test_expect_success 'without config in another order' '
sed -e "s/ Z\$/ /" >expected <<-\EOF &&
diff --git a/trailer.c b/trailer.c
index 249ed618ed8e..cd4f85e71c9a 100644
--- a/trailer.c
+++ b/trailer.c
@@ -690,8 +690,18 @@ static void add_arg_item(struct list_head *arg_head, char *tok, char *val,
list_add_tail(&new_item->list, arg_head);
}
+static void add_user_own_identity(struct new_trailer_item *item)
+{
+ struct strbuf buf = STRBUF_INIT;
+ strbuf_addstr(&buf, item->text);
+ strbuf_add(&buf, "=", 1);
+ strbuf_addstr(&buf, fmt_name(WANT_COMMITTER_IDENT));
+ free(item->text);
+ item->text = buf.buf;
+}
+
static void process_command_line_args(struct list_head *arg_head,
- struct list_head *new_trailer_head)
+ struct list_head *new_trailer_head, int own_identity)
{
struct arg_item *item;
struct strbuf tok = STRBUF_INIT;
@@ -728,6 +738,10 @@ static void process_command_line_args(struct list_head *arg_head,
error(_("empty trailer token in trailer '%.*s'"),
(int) sb.len, sb.buf);
strbuf_release(&sb);
+ } else if (separator_pos == -1 && own_identity) {
+ add_user_own_identity(tr);
+ pos = pos->prev;
+ continue;
} else {
parse_trailer(&tok, &val, &conf, tr->text,
separator_pos);
@@ -1048,7 +1062,7 @@ void process_trailers(const char *file,
if (!opts->only_input) {
LIST_HEAD(arg_head);
- process_command_line_args(&arg_head, new_trailer_head);
+ process_command_line_args(&arg_head, new_trailer_head ,opts->own_identity);
process_trailers_lists(&head, &arg_head);
}
diff --git a/trailer.h b/trailer.h
index 795d2fccfd95..235dfdfa1978 100644
--- a/trailer.h
+++ b/trailer.h
@@ -57,7 +57,7 @@ struct trailer_info {
struct new_trailer_item {
struct list_head list;
- const char *text;
+ char *text;
enum trailer_where where;
enum trailer_if_exists if_exists;
@@ -73,6 +73,7 @@ struct process_trailer_options {
int no_divider;
int key_only;
int value_only;
+ int own_identity;
const struct strbuf *separator;
const struct strbuf *key_value_separator;
int (*filter)(const struct strbuf *, void *);
--
gitgitgadget
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] [GSOC] commit: add own-identity option
2021-03-19 12:06 [PATCH 0/3] [GSOC] commit: add own-identity option ZheNing Hu via GitGitGadget
2021-03-19 12:06 ` [PATCH 1/3] [GSOC] commit: add --trailer option ZheNing Hu via GitGitGadget
2021-03-19 12:06 ` [PATCH 2/3] [GSOC] interpret-trailers: add own-identity option ZheNing Hu via GitGitGadget
@ 2021-03-19 12:06 ` ZheNing Hu via GitGitGadget
2 siblings, 0 replies; 4+ messages in thread
From: ZheNing Hu via GitGitGadget @ 2021-03-19 12:06 UTC (permalink / raw)
To: git
Cc: Bradley M. Kuhn, Junio C Hamano, Brandon Casey, Shourya Shukla,
Christian Couder, Rafael Silva,
Đoàn Trần Công Danh, ZheNing Hu, ZheNing Hu
From: ZheNing Hu <adlternative@gmail.com>
Use the newly added option `--own-identity` in
`interpret-trailers`, implement new commit option
`--own-identity` to allow user optionalise <value>
in `--trailer`, by substitute user's identity if
missing. Using the `--own-identity` option, users
can directly use `--trailer="Signed-off-by"` to
generate a signoff trailer with their own identities
in commit messages,
The effect is basically the same as the `--signoff`
option. However, users can add more useful options at
the same time. e.g. `--trailer="Helped-by" --own-identity`
can general `Helped-by: C O Mitter <committer@example.com>`,
or through appropriate configuration:
`git -c trailer.signoff.key="Signed-off-by" commit \
--trailer="signoff" --own-identity`
can also general their needs trailers with their favorite
keys and their own identities.
Signed-off-by: ZheNing Hu <adlternative@gmail.com>
---
Documentation/git-commit.txt | 19 +++++-
builtin/commit.c | 8 +++
t/t7501-commit-basic-functionality.sh | 91 +++++++++++++++++++++++++++
t/t7502-commit-porcelain.sh | 20 ++++++
4 files changed, 136 insertions(+), 2 deletions(-)
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index 2ba2fe0dd10e..69b3e694eb20 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.txt
@@ -14,8 +14,8 @@ SYNOPSIS
[--allow-empty-message] [--no-verify] [-e] [--author=<author>]
[--date=<date>] [--cleanup=<mode>] [--[no-]status]
[-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]
- [(--trailer <token>[(=|:)<value>])...] [-S[<keyid>]]
- [--] [<pathspec>...]
+ [(--trailer <token>[(=|:)<value>])... [--own-identity]]
+ [-S[<keyid>]] [--] [<pathspec>...]
DESCRIPTION
-----------
@@ -175,6 +175,21 @@ include::signoff-option.txt[]
and the "Helped-by" trailer in the commit message.)
Use `git -c trailer.* commit --trailer` to make the appropriate
configuration. See linkgit:git-interpret-trailers[1] for details.
+
+--own-identity::
+ Used with `--trailer`. Those trailers without value with the
+ `--own-identity` option all will add the user's own identity.
+ For example, `git commit --trailer \
+ "A:B" --trailer "Signed-off-by" --trailer "Helped-by" --own-identity`,
+ will output:
+ "
+ A:B
+ Signed-off-by: C O Mitter <committer@example.com>
+ Helped-by: C O Mitter <committer@example.com>
+ "
+ in commit messages.
+ See linkgit:git-interpret-trailers[1]for details.
+
-n::
--no-verify::
This option bypasses the pre-commit and commit-msg hooks.
diff --git a/builtin/commit.c b/builtin/commit.c
index 4b06672bd07d..dc2fc0dc46ff 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -114,6 +114,7 @@ static int no_post_rewrite, allow_empty_message, pathspec_file_nul;
static char *untracked_files_arg, *force_date, *ignore_submodule_arg, *ignored_arg;
static char *sign_commit, *pathspec_from_file;
static struct strvec trailer_args = STRVEC_INIT;
+static int own_identity;
/*
* The default commit message cleanup mode will remove the lines
@@ -972,6 +973,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
strvec_pushl(&run_trailer.args, "interpret-trailers",
"--in-place", git_path_commit_editmsg(), NULL);
+ if (own_identity)
+ strvec_push(&run_trailer.args, "--own-identity");
strvec_pushv(&run_trailer.args, trailer_args.v);
run_trailer.git_cmd = 1;
if (run_command(&run_trailer))
@@ -1529,6 +1532,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")),
OPT_BOOL(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")),
OPT_CALLBACK_F(0, "trailer", NULL, N_("trailer"), N_("add custom trailer(s)"), PARSE_OPT_NONEG, opt_pass_trailer),
+ OPT_BOOL(0, "own-identity", &own_identity,
+ N_("specify the user's own identity for omitted trailers value")),
OPT_BOOL('s', "signoff", &signoff, N_("add a Signed-off-by trailer")),
OPT_FILENAME('t', "template", &template_file, N_("use specified template file")),
OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
@@ -1605,6 +1610,9 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
if (verbose == -1)
verbose = (config_commit_verbose < 0) ? 0 : config_commit_verbose;
+ if (own_identity && !trailer_args.nr)
+ die(_("--own_identity requires --trailer"));
+
if (dry_run)
return dry_run_commit(argv, prefix, current_head, &s);
index_file = prepare_index(argv, prefix, current_head, 0);
diff --git a/t/t7501-commit-basic-functionality.sh b/t/t7501-commit-basic-functionality.sh
index 512ae2781fe2..7ff74cf81e75 100755
--- a/t/t7501-commit-basic-functionality.sh
+++ b/t/t7501-commit-basic-functionality.sh
@@ -423,6 +423,25 @@ test_expect_success 'sign off (1)' '
'
+test_expect_success '--trailer="signoff" (1)' '
+
+ echo 1 >>positive &&
+ git add positive &&
+ git -c trailer.signoff.key="Signed-off-by" \
+ commit --trailer="signoff" --own-identity \
+ -m "thank you" &&
+ git cat-file commit HEAD >commit &&
+ sed -e "1,/^\$/d" commit >actual &&
+ (
+ echo thank you &&
+ echo &&
+ git var GIT_COMMITTER_IDENT >ident &&
+ sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /" ident
+ ) >expected &&
+ test_cmp expected actual
+
+'
+
test_expect_success 'sign off (2)' '
echo 2 >positive &&
@@ -444,6 +463,30 @@ $existing" &&
'
+test_expect_success '--trailer="signoff" (2)' '
+
+ echo 2 >>positive &&
+ git add positive &&
+ existing="Signed-off-by: Watch This <watchthis@example.com>" &&
+ git -c trailer.signoff.key="Signed-off-by" \
+ commit --trailer="signoff" --own-identity \
+ -m "thank you
+
+$existing" &&
+ git cat-file commit HEAD >commit &&
+ sed -e "1,/^\$/d" commit >actual &&
+ (
+ echo thank you &&
+ echo &&
+ echo $existing &&
+ git var GIT_COMMITTER_IDENT >ident &&
+ sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /" ident
+ ) >expected &&
+ test_cmp expected actual
+
+'
+
+
test_expect_success 'signoff gap' '
echo 3 >positive &&
@@ -464,6 +507,29 @@ $alt" &&
test_cmp expected actual
'
+test_expect_success '--trailer="signoff" gap' '
+
+ echo 3 >>positive &&
+ git add positive &&
+ alt="Alt-RFC-822-Header: Value" &&
+ git -c trailer.signoff.key="Signed-off-by" \
+ commit --trailer="signoff" --own-identity \
+ -m "welcome
+
+$alt" &&
+ git cat-file commit HEAD >commit &&
+ sed -e "1,/^\$/d" commit >actual &&
+ (
+ echo welcome &&
+ echo &&
+ echo $alt &&
+ git var GIT_COMMITTER_IDENT >ident &&
+ sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /" ident
+ ) >expected &&
+ test_cmp expected actual
+'
+
+
test_expect_success 'signoff gap 2' '
echo 4 >positive &&
@@ -487,6 +553,31 @@ $alt" &&
test_cmp expected actual
'
+test_expect_success '--trailer="signoff" gap 2' '
+
+ echo 4 >>positive &&
+ git add positive &&
+ alt="fixed: 34" &&
+ git -c trailer.signoff.key="Signed-off-by" \
+ commit --trailer="signoff" --own-identity \
+ -m "welcome
+
+We have now
+$alt" &&
+ git cat-file commit HEAD >commit &&
+ sed -e "1,/^\$/d" commit >actual &&
+ (
+ echo welcome &&
+ echo &&
+ echo We have now &&
+ echo $alt &&
+ echo &&
+ git var GIT_COMMITTER_IDENT >ident &&
+ sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /" ident
+ ) >expected &&
+ test_cmp expected actual
+'
+
test_expect_success 'signoff respects trailer config' '
echo 5 >positive &&
diff --git a/t/t7502-commit-porcelain.sh b/t/t7502-commit-porcelain.sh
index 024cf3c81b18..6c1387c943ff 100755
--- a/t/t7502-commit-porcelain.sh
+++ b/t/t7502-commit-porcelain.sh
@@ -489,6 +489,26 @@ test_expect_success 'commit --trailer with -c and ":=#" as separators' '
test_cmp expected actual
'
+test_expect_success 'commit --trailer with -c and --own-identity' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ cat >expected <<-\EOF &&
+
+ Signed-off-by: C O Mitter <committer@example.com>
+ EOF
+ git -c trailer.signoff.key="Signed-off-by: " \
+ commit --trailer "signoff" --own-identity -m "abc" &&
+ git cat-file commit HEAD >commit.msg &&
+ sed -e "1,6d" commit.msg >actual &&
+ test_cmp expected actual
+'
+
+test_expect_success 'commit --own-identity without --trailer' '
+ echo "fun" >>file1 &&
+ git add file1 &&
+ test_must_fail git -c commit --own-identity -m "abc"
+'
+
test_expect_success 'multiple -m' '
>negative &&
--
gitgitgadget
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-03-19 12:07 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-19 12:06 [PATCH 0/3] [GSOC] commit: add own-identity option ZheNing Hu via GitGitGadget
2021-03-19 12:06 ` [PATCH 1/3] [GSOC] commit: add --trailer option ZheNing Hu via GitGitGadget
2021-03-19 12:06 ` [PATCH 2/3] [GSOC] interpret-trailers: add own-identity option ZheNing Hu via GitGitGadget
2021-03-19 12:06 ` [PATCH 3/3] [GSOC] commit: " ZheNing Hu via GitGitGadget
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 NNTP newsgroup(s).