On 03/27/2012 06:00 PM, Mathias Weber wrote:
The tag command does not support the --author option as the commit command. This adds the --author option to create annotated tags with a different author.
Consistency is good.
Signed-off-by: Mathias Weber<mathew.weber@xxxxxxxxx> --- builtin/tag.c | 26 +++++++++++++++++++++++--- 1 files changed, 23 insertions(+), 3 deletions(-) diff --git a/builtin/tag.c b/builtin/tag.c index fe7e5e5..416fa88 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -309,17 +309,34 @@ struct create_tag_options { static void create_tag(const unsigned char *object, const char *tag, struct strbuf *buf, struct create_tag_options *opt, - unsigned char *prev, unsigned char *result) + unsigned char *prev, unsigned char *result, + const char *force_author) { enum object_type type; char header_buf[1024]; int header_len; char *path = NULL; + char *name, *email; + const char *author_ident; type = sha1_object_info(object, NULL); if (type<= OBJ_NONE) die(_("bad object type.")); + if (force_author) { + const char *lb = strstr(force_author, "<"); + const char *rb = strchr(force_author, '>'); + + if (!lb || !rb) + die(_("malformed --author parameter")); + name = xstrndup(force_author, lb - force_author); + email = xstrndup(lb + 2, rb - (lb + 2));
This part is identical to builtin/commit.c, it would be nice to refactor it into a function.
Zbyszek
+ + author_ident = fmt_ident(name, email, getenv("GIT_AUTHOR_DATE"), + IDENT_ERROR_ON_NO_NAME); + } else + author_ident = git_committer_info(IDENT_ERROR_ON_NO_NAME); + header_len = snprintf(header_buf, sizeof(header_buf), "object %s\n" "type %s\n" @@ -328,7 +345,7 @@ static void create_tag(const unsigned char *object, const char *tag, sha1_to_hex(object), typename(type), tag, - git_committer_info(IDENT_ERROR_ON_NO_NAME)); + author_ident); if (header_len> sizeof(header_buf) - 1) die(_("tag header too big.")); @@ -438,6 +455,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix) delete = 0, verify = 0; const char *msgfile = NULL, *keyid = NULL; struct msg_arg msg = { 0, STRBUF_INIT }; + const char *force_author = NULL; struct commit_list *with_commit = NULL; struct option options[] = { OPT_BOOLEAN('l', "list",&list, "list tag names"), @@ -452,6 +470,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix) "annotated tag, needs a message"), OPT_CALLBACK('m', "message",&msg, "message", "tag message", parse_msg_arg), + OPT_STRING(0, "author",&force_author, "author", + "override author for annotated tag"), 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", @@ -556,7 +576,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix) die(_("Invalid cleanup mode %s"), cleanup_arg); if (annotate) - create_tag(object, tag,&buf,&opt, prev, object); + create_tag(object, tag,&buf,&opt, prev, object, force_author); lock = lock_any_ref_for_update(ref.buf, prev, 0); if (!lock)
-- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html