builtin-tag: accept and process multiple -m just like git-commit

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2007-11-22 23:16:51 -08:00
parent 3968658599
commit bd46c9a912
2 changed files with 32 additions and 9 deletions

View File

@ -65,7 +65,9 @@ OPTIONS
Typing "git tag" without arguments, also lists all tags. Typing "git tag" without arguments, also lists all tags.
-m <msg>:: -m <msg>::
Use the given tag message (instead of prompting) Use the given tag message (instead of prompting).
If multiple `-m` options are given, there values are
concatenated as separate paragraphs.
-F <file>:: -F <file>::
Take the tag message from the given file. Use '-' to Take the tag message from the given file. Use '-' to

View File

@ -341,6 +341,24 @@ static void create_tag(const unsigned char *object, const char *tag,
die("unable to write tag file"); die("unable to write tag file");
} }
struct msg_arg {
int given;
struct strbuf buf;
};
static int parse_msg_arg(const struct option *opt, const char *arg, int unset)
{
struct msg_arg *msg = opt->value;
if (!arg)
return -1;
if (msg->buf.len)
strbuf_addstr(&(msg->buf), "\n\n");
strbuf_addstr(&(msg->buf), arg);
msg->given = 1;
return 0;
}
int cmd_tag(int argc, const char **argv, const char *prefix) int cmd_tag(int argc, const char **argv, const char *prefix)
{ {
struct strbuf buf; struct strbuf buf;
@ -351,8 +369,9 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
int annotate = 0, sign = 0, force = 0, lines = 0, int annotate = 0, sign = 0, force = 0, lines = 0,
delete = 0, verify = 0; delete = 0, verify = 0;
char *list = NULL, *msg = NULL, *msgfile = NULL, *keyid = NULL; char *list = NULL, *msgfile = NULL, *keyid = NULL;
const char *no_pattern = "NO_PATTERN"; const char *no_pattern = "NO_PATTERN";
struct msg_arg msg = { 0, STRBUF_INIT };
struct option options[] = { struct option options[] = {
{ OPTION_STRING, 'l', NULL, &list, "pattern", "list tag names", { OPTION_STRING, 'l', NULL, &list, "pattern", "list tag names",
PARSE_OPT_OPTARG, NULL, (intptr_t) no_pattern }, PARSE_OPT_OPTARG, NULL, (intptr_t) no_pattern },
@ -365,7 +384,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
OPT_GROUP("Tag creation options"), OPT_GROUP("Tag creation options"),
OPT_BOOLEAN('a', NULL, &annotate, OPT_BOOLEAN('a', NULL, &annotate,
"annotated tag, needs a message"), "annotated tag, needs a message"),
OPT_STRING('m', NULL, &msg, "msg", "message for the tag"), OPT_CALLBACK('m', NULL, &msg, "msg",
"message for the tag", parse_msg_arg),
OPT_STRING('F', NULL, &msgfile, "file", "message in a file"), OPT_STRING('F', NULL, &msgfile, "file", "message in a file"),
OPT_BOOLEAN('s', NULL, &sign, "annotated and GPG-signed tag"), OPT_BOOLEAN('s', NULL, &sign, "annotated and GPG-signed tag"),
OPT_STRING('u', NULL, &keyid, "key-id", OPT_STRING('u', NULL, &keyid, "key-id",
@ -386,12 +406,12 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
return for_each_tag_name(argv, verify_tag); return for_each_tag_name(argv, verify_tag);
strbuf_init(&buf, 0); strbuf_init(&buf, 0);
if (msg || msgfile) { if (msg.given || msgfile) {
if (msg && msgfile) if (msg.given && msgfile)
die("only one -F or -m option is allowed."); die("only one -F or -m option is allowed.");
annotate = 1; annotate = 1;
if (msg) if (msg.given)
strbuf_addstr(&buf, msg); strbuf_addbuf(&buf, &(msg.buf));
else { else {
if (!strcmp(msgfile, "-")) { if (!strcmp(msgfile, "-")) {
if (strbuf_read(&buf, 0, 1024) < 0) if (strbuf_read(&buf, 0, 1024) < 0)
@ -429,7 +449,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
die("tag '%s' already exists", tag); die("tag '%s' already exists", tag);
if (annotate) if (annotate)
create_tag(object, tag, &buf, msg || msgfile, sign, prev, object); create_tag(object, tag, &buf, msg.given || msgfile,
sign, prev, object);
lock = lock_any_ref_for_update(ref, prev, 0); lock = lock_any_ref_for_update(ref, prev, 0);
if (!lock) if (!lock)