commit: add own-identity option
cover commit: add own-identity option
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
Signature · 1 line
gitgitgadget
PATCH 1/3 commit: add --trailer option
From: ZheNing Hu <[email protected]>
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.
--- Documentation/git-commit.txt | 11 +- builtin/commit.c | 22 +++ t/t7502-commit-porcelain.sh | 335 +++++++++++++++++++++++++++++++++++ 3 files changed, 367 insertions(+), 1 deletion(-)
Documentation/git-commit.txt +10 -1
@@ -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 \ + <[email protected]>" --trailer "Helped-by:C O Mitter \ + <[email protected]>"` 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.
builtin/commit.c +22 -0
@@ -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")),
t/t7502-commit-porcelain.sh +335 -0
341 lines not on this page · raw message
Signature · 1 line
gitgitgadget
PATCH 2/3 interpret-trailers: add own-identity option
In reply to ZheNing Hu via GitGitGadgetFrom: ZheNing Hu <[email protected]>
`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`.
--- 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(-)
Documentation/git-interpret-trailers.txt +13 -0
@@ -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 <[email protected]> + Helped-by: C O Mitter <[email protected]> + " + in `a.txt`. + --where <placement>:: --no-where:: Specify where all new trailers will be added. A setting
builtin/interpret-trailers.c +4 -2
@@ -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"),
t/t7513-interpret-trailers.sh +12 -0
@@ -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 <[email protected]> + Signed-off-by: C O Mitter <[email protected]> + 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 &&
trailer.c +16 -2
@@ -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); }
trailer.h +2 -1
@@ -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 *);
Signature · 1 line
gitgitgadget
PATCH 3/3 commit: add own-identity option
In reply to ZheNing Hu via GitGitGadgetFrom: ZheNing Hu <[email protected]>
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 <[email protected]>, 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.
--- 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(-)
Documentation/git-commit.txt +17 -2
@@ -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 <[email protected]> + Helped-by: C O Mitter <[email protected]> + " + in commit messages. + See linkgit:git-interpret-trailers[1]for details. + -n:: --no-verify:: This option bypasses the pre-commit and commit-msg hooks.
builtin/commit.c +8 -0
@@ -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 );
t/t7501-commit-basic-functionality.sh +91 -0
115 lines not on this page · raw message
t/t7502-commit-porcelain.sh +20 -0
@@ -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 <[email protected]> + 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 &&
Signature · 1 line
gitgitgadget