Merge branch 'jk/index-pack-correct-depth-fix'
[gitweb.git] / builtin / tag.c
index 7b1be85e48b67f2a2eb075f6d8366246c7938646..af3af3f64935c3f92ed3f85acd44ed2ca2a35b3f 100644 (file)
 #include "column.h"
 
 static const char * const git_tag_usage[] = {
-       "git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]",
-       "git tag -d <tagname>...",
-       "git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] "
-               "\n\t\t[<pattern>...]",
-       "git tag -v <tagname>...",
+       N_("git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]"),
+       N_("git tag -d <tagname>..."),
+       N_("git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] "
+               "\n\t\t[<pattern>...]"),
+       N_("git tag -v <tagname>..."),
        NULL
 };
 
@@ -246,19 +246,13 @@ static int do_sign(struct strbuf *buffer)
 }
 
 static const char tag_template[] =
-       N_("\n"
-       "#\n"
-       "# Write a tag message\n"
-       "# Lines starting with '#' will be ignored.\n"
-       "#\n");
+       N_("\nWrite a tag message\n"
+       "Lines starting with '%c' will be ignored.\n");
 
 static const char tag_template_nocleanup[] =
-       N_("\n"
-       "#\n"
-       "# Write a tag message\n"
-       "# Lines starting with '#' will be kept; you may remove them"
-       " yourself if you want to.\n"
-       "#\n");
+       N_("\nWrite a tag message\n"
+       "Lines starting with '%c' will be kept; you may remove them"
+       " yourself if you want to.\n");
 
 static int git_tag_config(const char *var, const char *value, void *cb)
 {
@@ -346,14 +340,18 @@ static void create_tag(const unsigned char *object, const char *tag,
                if (fd < 0)
                        die_errno(_("could not create file '%s'"), path);
 
-               if (!is_null_sha1(prev))
+               if (!is_null_sha1(prev)) {
                        write_tag_body(fd, prev);
-               else if (opt->cleanup_mode == CLEANUP_ALL)
-                       write_or_die(fd, _(tag_template),
-                                       strlen(_(tag_template)));
-               else
-                       write_or_die(fd, _(tag_template_nocleanup),
-                                       strlen(_(tag_template_nocleanup)));
+               } else {
+                       struct strbuf buf = STRBUF_INIT;
+                       strbuf_addch(&buf, '\n');
+                       if (opt->cleanup_mode == CLEANUP_ALL)
+                               strbuf_commented_addf(&buf, _(tag_template), comment_line_char);
+                       else
+                               strbuf_commented_addf(&buf, _(tag_template_nocleanup), comment_line_char);
+                       write_or_die(fd, buf.buf, buf.len);
+                       strbuf_release(&buf);
+               }
                close(fd);
 
                if (launch_editor(path, buf, NULL)) {
@@ -444,37 +442,37 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
        struct msg_arg msg = { 0, STRBUF_INIT };
        struct commit_list *with_commit = NULL;
        struct option options[] = {
-               OPT_BOOLEAN('l', "list", &list, "list tag names"),
-               { OPTION_INTEGER, 'n', NULL, &lines, "n",
-                               "print <n> lines of each tag message",
+               OPT_BOOLEAN('l', "list", &list, N_("list tag names")),
+               { OPTION_INTEGER, 'n', NULL, &lines, N_("n"),
+                               N_("print <n> lines of each tag message"),
                                PARSE_OPT_OPTARG, NULL, 1 },
-               OPT_BOOLEAN('d', "delete", &delete, "delete tags"),
-               OPT_BOOLEAN('v', "verify", &verify, "verify tags"),
+               OPT_BOOLEAN('d', "delete", &delete, N_("delete tags")),
+               OPT_BOOLEAN('v', "verify", &verify, N_("verify tags")),
 
-               OPT_GROUP("Tag creation options"),
+               OPT_GROUP(N_("Tag creation options")),
                OPT_BOOLEAN('a', "annotate", &annotate,
-                                       "annotated tag, needs a message"),
-               OPT_CALLBACK('m', "message", &msg, "message",
-                            "tag message", parse_msg_arg),
-               OPT_FILENAME('F', "file", &msgfile, "read message from file"),
-               OPT_BOOLEAN('s', "sign", &opt.sign, "annotated and GPG-signed tag"),
-               OPT_STRING(0, "cleanup", &cleanup_arg, "mode",
-                       "how to strip spaces and #comments from message"),
-               OPT_STRING('u', "local-user", &keyid, "key-id",
-                                       "use another key to sign the tag"),
-               OPT__FORCE(&force, "replace the tag if exists"),
-               OPT_COLUMN(0, "column", &colopts, "show tag list in columns"),
-
-               OPT_GROUP("Tag listing options"),
+                                       N_("annotated tag, needs a message")),
+               OPT_CALLBACK('m', "message", &msg, N_("message"),
+                            N_("tag message"), parse_msg_arg),
+               OPT_FILENAME('F', "file", &msgfile, N_("read message from file")),
+               OPT_BOOLEAN('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")),
+               OPT_STRING('u', "local-user", &keyid, N_("key id"),
+                                       N_("use another key to sign the tag")),
+               OPT__FORCE(&force, N_("replace the tag if exists")),
+               OPT_COLUMN(0, "column", &colopts, N_("show tag list in columns")),
+
+               OPT_GROUP(N_("Tag listing options")),
                {
-                       OPTION_CALLBACK, 0, "contains", &with_commit, "commit",
-                       "print only tags that contain the commit",
+                       OPTION_CALLBACK, 0, "contains", &with_commit, N_("commit"),
+                       N_("print only tags that contain the commit"),
                        PARSE_OPT_LASTARG_DEFAULT,
                        parse_opt_with_commit, (intptr_t)"HEAD",
                },
                {
-                       OPTION_CALLBACK, 0, "points-at", NULL, "object",
-                       "print only tags of the object", 0, parse_opt_points_at
+                       OPTION_CALLBACK, 0, "points-at", NULL, N_("object"),
+                       N_("print only tags of the object"), 0, parse_opt_points_at
                },
                OPT_END()
        };
@@ -584,7 +582,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
                die(_("%s: cannot lock the ref"), ref.buf);
        if (write_ref_sha1(lock, object, NULL) < 0)
                die(_("%s: cannot update the ref"), ref.buf);
-       if (force && hashcmp(prev, object))
+       if (force && !is_null_sha1(prev) && hashcmp(prev, object))
                printf(_("Updated tag '%s' (was %s)\n"), tag, find_unique_abbrev(prev, DEFAULT_ABBREV));
 
        strbuf_release(&buf);