Please ignore !

v3 with the nits fixed was picked by Junio

Le 07/02/2018 à 17:55, Nicolas Morey-Chaisemartin a écrit :
> Add a --edit option whichs allows modifying the messages provided by -m or -F,
> the same way git commit --edit does.
>
> Signed-off-by: Nicolas Morey-Chaisemartin <nmoreychaisemar...@suse.com>
> ---
>
> Fixes since v3 ( 
> https://public-inbox.org/git/88e7c122-599f-4ab1-6d65-c75f7a3ae...@suse.com/ ):
>  * Replace tab by space in t/t7004-tag.sh
>
>
>  Documentation/git-tag.txt |  8 +++++++-
>  builtin/tag.c             | 11 +++++++++--
>  t/t7004-tag.sh            | 30 ++++++++++++++++++++++++++++++
>  3 files changed, 46 insertions(+), 3 deletions(-)
>
> diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
> index 956fc019f984..1d17101bac39 100644
> --- a/Documentation/git-tag.txt
> +++ b/Documentation/git-tag.txt
> @@ -9,7 +9,7 @@ git-tag - Create, list, delete or verify a tag object signed 
> with GPG
>  SYNOPSIS
>  --------
>  [verse]
> -'git tag' [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>]
> +'git tag' [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>] [-e]
>       <tagname> [<commit> | <object>]
>  'git tag' -d <tagname>...
>  'git tag' [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]
> @@ -167,6 +167,12 @@ This option is only applicable when listing tags without 
> annotation lines.
>       Implies `-a` if none of `-a`, `-s`, or `-u <keyid>`
>       is given.
>  
> +-e::
> +--edit::
> +     The message taken from file with `-F` and command line with
> +     `-m` are usually used as the tag message unmodified.
> +     This option lets you further edit the message taken from these sources.
> +
>  --cleanup=<mode>::
>       This option sets how the tag message is cleaned up.
>       The  '<mode>' can be one of 'verbatim', 'whitespace' and 'strip'.  The
> diff --git a/builtin/tag.c b/builtin/tag.c
> index a7e6a5b0f234..ce5cac3dd23f 100644
> --- a/builtin/tag.c
> +++ b/builtin/tag.c
> @@ -194,6 +194,7 @@ static int build_tag_object(struct strbuf *buf, int sign, 
> struct object_id *resu
>  
>  struct create_tag_options {
>       unsigned int message_given:1;
> +     unsigned int use_editor:1;
>       unsigned int sign;
>       enum {
>               CLEANUP_NONE,
> @@ -224,7 +225,7 @@ static void create_tag(const struct object_id *object, 
> const char *tag,
>                   tag,
>                   git_committer_info(IDENT_STRICT));
>  
> -     if (!opt->message_given) {
> +     if (!opt->message_given || opt->use_editor) {
>               int fd;
>  
>               /* write the template message before editing: */
> @@ -233,7 +234,10 @@ static void create_tag(const struct object_id *object, 
> const char *tag,
>               if (fd < 0)
>                       die_errno(_("could not create file '%s'"), path);
>  
> -             if (!is_null_oid(prev)) {
> +             if (opt->message_given) {
> +                     write_or_die(fd, buf->buf, buf->len);
> +                     strbuf_reset(buf);
> +             } else if (!is_null_oid(prev)) {
>                       write_tag_body(fd, prev);
>               } else {
>                       struct strbuf buf = STRBUF_INIT;
> @@ -372,6 +376,7 @@ int cmd_tag(int argc, const char **argv, const char 
> *prefix)
>       static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
>       struct ref_format format = REF_FORMAT_INIT;
>       int icase = 0;
> +     int edit_flag = 0;
>       struct option options[] = {
>               OPT_CMDMODE('l', "list", &cmdmode, N_("list tag names"), 'l'),
>               { OPTION_INTEGER, 'n', NULL, &filter.lines, N_("n"),
> @@ -386,6 +391,7 @@ int cmd_tag(int argc, const char **argv, const char 
> *prefix)
>               OPT_CALLBACK('m', "message", &msg, N_("message"),
>                            N_("tag message"), parse_msg_arg),
>               OPT_FILENAME('F', "file", &msgfile, N_("read message from 
> file")),
> +             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_STRING(0, "cleanup", &cleanup_arg, N_("mode"),
>                       N_("how to strip spaces and #comments from message")),
> @@ -524,6 +530,7 @@ int cmd_tag(int argc, const char **argv, const char 
> *prefix)
>               die(_("tag '%s' already exists"), tag);
>  
>       opt.message_given = msg.given || msgfile;
> +     opt.use_editor = edit_flag;
>  
>       if (!cleanup_arg || !strcmp(cleanup_arg, "strip"))
>               opt.cleanup_mode = CLEANUP_ALL;
> diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
> index a9af2de9960b..0630f2dee24b 100755
> --- a/t/t7004-tag.sh
> +++ b/t/t7004-tag.sh
> @@ -452,6 +452,21 @@ test_expect_success \
>       test_cmp expect actual
>  '
>  
> +get_tag_header annotated-tag-edit $commit commit $time >expect
> +echo "An edited message" >>expect
> +test_expect_success 'set up editor' '
> +     write_script fakeeditor <<-\EOF
> +     sed -e "s/A message/An edited message/g" <"$1" >"$1-"
> +     mv "$1-" "$1"
> +     EOF
> +'
> +test_expect_success \
> +     'creating an annotated tag with -m message --edit should succeed' '
> +     EDITOR=./fakeeditor git tag -m "A message" --edit annotated-tag-edit &&
> +     get_tag_msg annotated-tag-edit >actual &&
> +     test_cmp expect actual
> +'
> +
>  cat >msgfile <<EOF
>  Another message
>  in a file.
> @@ -465,6 +480,21 @@ test_expect_success \
>       test_cmp expect actual
>  '
>  
> +get_tag_header file-annotated-tag-edit $commit commit $time >expect
> +sed -e "s/Another message/Another edited message/g" msgfile >>expect
> +test_expect_success 'set up editor' '
> +     write_script fakeeditor <<-\EOF
> +     sed -e "s/Another message/Another edited message/g" <"$1" >"$1-"
> +     mv "$1-" "$1"
> +     EOF
> +'
> +test_expect_success \
> +     'creating an annotated tag with -F messagefile --edit should succeed' '
> +     EDITOR=./fakeeditor git tag -F msgfile --edit file-annotated-tag-edit &&
> +     get_tag_msg file-annotated-tag-edit >actual &&
> +     test_cmp expect actual
> +'
> +
>  cat >inputmsg <<EOF
>  A message from the
>  standard input

Reply via email to