Follow-up patch taking welcome feedback from Patrick and JCH. Since git-tag --list --format="%(trailers)" can interpret trailers from annotated tag messages, it seems natural to support --trailer when writing a new tag message. git-commit accomplishes this by taking --trailer arguments and passing them to git interpret-trailer. This patch series refactors that logic and uses it to implement --trailer on git-tag. Also Included are updates to the i18n files, since the git-tag patch changes some strings that are subject to translation. If I am out of my lane here, please feel free to separate or leave out the i18n patch. John Passaro (3): builtin/commit.c: refactor --trailer logic builtin/tag.c: add --trailer arg po: update git-tag translations Documentation/git-tag.txt | 18 +++++- builtin/commit.c | 20 +------ builtin/tag.c | 41 +++++++++++--- po/bg.po | 2 + po/ca.po | 4 +- po/de.po | 2 + po/el.po | 9 ++- po/es.po | 14 +++-- po/fr.po | 2 + po/id.po | 2 + po/it.po | 6 +- po/ko.po | 10 ++-- po/pl.po | 6 +- po/ru.po | 1 + po/sv.po | 2 + po/tr.po | 2 + po/uk.po | 2 + po/vi.po | 2 + po/zh_CN.po | 2 + po/zh_TW.po | 2 + t/t7004-tag.sh | 114 ++++++++++++++++++++++++++++++++++++++ trailer.c | 12 ++++ trailer.h | 8 +++ 23 files changed, 237 insertions(+), 46 deletions(-) base-commit: 786a3e4b8d754d2b14b1208b98eeb0a554ef19a8 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1723%2Fjpassaro%2Fjp%2Ftag-trailer-arg-v3 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1723/jpassaro/jp/tag-trailer-arg-v3 Pull-Request: https://github.com/gitgitgadget/git/pull/1723 Range-diff vs v2: -: ----------- > 1: 0c9517f434a builtin/commit.c: refactor --trailer logic 1: d4beb7cd67e ! 2: 5b6239167b8 builtin/tag.c: add --trailer arg @@ Metadata ## Commit message ## builtin/tag.c: add --trailer arg - Teach git-tag to accept --trailer option to add trailers to annotated - tag messages, like git-commit. Move the code that git-commit uses for - trailers to the trailer.h API, so it can be re-used for git-tag. + git-tag currently supports interpreting trailers from an annotated tag + message, using --list --format="%(trailers)". There is no ergonomic way + to add trailers to an annotated tag message. + + In a previous patch, we refactored git-commit's implementation of its + --trailer arg to the trailer.h API. Let's use that new function to teach + git-tag the same --trailer argument, emulating as much of git-commit's + behavior as much as possible. Signed-off-by: John Passaro <john.a.passaro@xxxxxxxxx> + Helped-by: Patrick Steinhardt <ps@xxxxxx> ## Documentation/git-tag.txt ## @@ Documentation/git-tag.txt: SYNOPSIS @@ Documentation/git-tag.txt: This option is only applicable when listing tags with --edit:: The message taken from file with `-F` and command line with - ## builtin/commit.c ## -@@ - #include "commit-reach.h" - #include "commit-graph.h" - #include "pretty.h" -+#include "trailer.h" - - static const char * const builtin_commit_usage[] = { - N_("git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]\n" -@@ builtin/commit.c: 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", "--no-divider", -- git_path_commit_editmsg(), NULL); -- strvec_pushv(&run_trailer.args, trailer_args.v); -- run_trailer.git_cmd = 1; -- if (run_command(&run_trailer)) -+ if (amend_file_with_trailers(git_path_commit_editmsg(), &trailer_args)) - die(_("unable to pass trailers to --trailers")); - strvec_clear(&trailer_args); - } - ## builtin/tag.c ## @@ #include "date.h" @@ builtin/tag.c: static void create_tag(const struct object_id *object, const char } } -@@ builtin/tag.c: struct msg_arg { - struct strbuf buf; - }; - -+static int opt_pass_trailer(const struct option *opt, const char *arg, int unset) -+{ -+ BUG_ON_OPT_NEG(unset); -+ -+ strvec_pushl(opt->value, "--trailer", arg, NULL); -+ return 0; -+} -+ - static int parse_msg_arg(const struct option *opt, const char *arg, int unset) - { - struct msg_arg *msg = opt->value; @@ builtin/tag.c: int cmd_tag(int argc, const char **argv, const char *prefix) struct ref_sorting *sorting; struct string_list sorting_options = STRING_LIST_INIT_DUP; @@ builtin/tag.c: int cmd_tag(int argc, const char **argv, const char *prefix) OPT_CALLBACK_F('m', "message", &msg, N_("message"), N_("tag message"), PARSE_OPT_NONEG, parse_msg_arg), OPT_FILENAME('F', "file", &msgfile, N_("read message from file")), -+ OPT_CALLBACK_F(0, "trailer", &trailer_args, N_("trailer"), N_("add custom trailer(s)"), -+ PARSE_OPT_NONEG, opt_pass_trailer), ++ OPT_PASSTHRU_ARGV(0, "trailer", &trailer_args, N_("trailer"), ++ N_("add custom trailer(s)"), PARSE_OPT_NONEG), OPT_BOOL('e', "edit", &edit_flag, N_("force edit of tag message")), OPT_BOOL('s', "sign", &opt.sign, N_("annotated and GPG-signed tag")), OPT_CLEANUP(&cleanup_arg), @@ t/t7004-tag.sh: test_expect_success 'git tag --format with ahead-behind' ' refs/tags/tag-zero-lines 0 1 ! EOF git tag -l --format="%(refname) %(ahead-behind:HEAD) !" >actual 2>err && - - ## trailer.c ## -@@ - #include "commit.h" - #include "trailer.h" - #include "list.h" -+#include "run-command.h" - /* - * Copyright (c) 2013, 2014 Christian Couder <chriscool@xxxxxxxxxxxxx> - */ -@@ trailer.c: void trailer_iterator_release(struct trailer_iterator *iter) - strbuf_release(&iter->val); - strbuf_release(&iter->key); - } -+ -+int amend_file_with_trailers(const char *path, struct strvec const* trailer_args) { -+ struct child_process run_trailer = CHILD_PROCESS_INIT; -+ -+ run_trailer.git_cmd = 1; -+ strvec_pushl(&run_trailer.args, "interpret-trailers", -+ "--in-place", "--no-divider", -+ path, NULL); -+ strvec_pushv(&run_trailer.args, trailer_args->v); -+ return run_command(&run_trailer); -+} - - ## trailer.h ## -@@ - - #include "list.h" - #include "strbuf.h" -+#include "strvec.h" - - enum trailer_where { - WHERE_DEFAULT, -@@ trailer.h: int trailer_iterator_advance(struct trailer_iterator *iter); - */ - void trailer_iterator_release(struct trailer_iterator *iter); - -+/* -+ * Augment a file to add trailers to it by running git-interpret-trailers. -+ * This calls run_command() and its return value is the same (i.e. 0 for -+ * success, various non-zero for other errors). See run-command.h. -+ */ -+int amend_file_with_trailers(const char *path, struct strvec const* trailer_args); -+ - #endif /* TRAILER_H */ -: ----------- > 3: d5335e30b0b po: update git-tag translations -- gitgitgadget