From 7b4a16e2c8869ba18264d0c44996880c8f9bb095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Mon, 28 Mar 2011 13:59:48 +0200 Subject: [PATCH] Add git_tag_create_frombuffer API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Expose the tag parsing capabilities already present in the library. Exporting this function makes it possible to implement the mktag command without duplicating this functionality. Signed-off-by: Carlos Martín Nieto --- include/git2/tag.h | 14 ++++++++++++++ src/tag.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/include/git2/tag.h b/include/git2/tag.h index ee92cd5c2..c47e3412c 100644 --- a/include/git2/tag.h +++ b/include/git2/tag.h @@ -188,6 +188,20 @@ GIT_EXTERN(int) git_tag_create_o( const git_signature *tagger, const char *message); +/** + * Create a new tag in the repository from a buffer + * + * @param oid Pointer where to store the OID of the newly created tag + * + * @param repo Repository where to store the tag + * + * @param buffer Raw tag data + */ +GIT_EXTERN(int) git_tag_create_frombuffer( + git_oid *oid, + git_repository *repo, + const char *buffer); + /** @} */ GIT_END_DECL #endif diff --git a/src/tag.c b/src/tag.c index d90e2de82..a68857763 100644 --- a/src/tag.c +++ b/src/tag.c @@ -241,6 +241,43 @@ int git_tag_create( return error; } +int git_tag_create_frombuffer(git_oid *oid, git_repository *repo, const char *buffer) +{ + git_tag tag; + int error; + char *buf; + git_object *obj; + + assert(oid && buffer); + + memset(&tag, 0, sizeof(tag)); + + buf = strdup(buffer); + if(buf == NULL) + return GIT_ENOMEM; + + if((error = parse_tag_buffer(&tag, buf, buf + strlen(buf))) < 0) + goto exit_freebuf; + + error = git_object_lookup(&obj, repo, &tag.target, tag.type); + if(error < 0) + goto exit_freetag; + + error = git_tag_create_o(oid, repo, tag.tag_name, obj, + tag.tagger, tag.message); + + git_object_close(obj); + + exit_freetag: + git_signature_free(tag.tagger); + free(tag.tag_name); + free(tag.message); + exit_freebuf: + free(buf); + + return error; +} + int git_tag__parse(git_tag *tag, git_odb_object *obj) {