summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2011-04-02 12:28:35 +0300
committerVicent Marti <tanoku@gmail.com>2011-04-02 12:28:35 +0300
commitd8ad64d3669182d368120a9b8db1147421498e22 (patch)
tree07558263d7df5d10b64fe4d994e844f59b4fa554 /src
parentccfce5f30fd1e906625594fad98e079b1cfe03d3 (diff)
parent7b4a16e2c8869ba18264d0c44996880c8f9bb095 (diff)
downloadlibgit2-d8ad64d3669182d368120a9b8db1147421498e22.tar.gz
Merge branch 'parse-tag-buffer' of https://github.com/carlosmn/libgit2 into development
Diffstat (limited to 'src')
-rw-r--r--src/tag.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/tag.c b/src/tag.c
index 7baababbf..a68857763 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -142,7 +142,7 @@ static int parse_tag_buffer(git_tag *tag, char *buffer, const char *buffer_end)
tag->tagger = git__malloc(sizeof(git_signature));
if ((error = git_signature__parse(tag->tagger, &buffer, buffer_end, "tagger ")) != 0)
- return error;
+ goto cleanup;
text_len = buffer_end - ++buffer;
@@ -151,6 +151,14 @@ static int parse_tag_buffer(git_tag *tag, char *buffer, const char *buffer_end)
tag->message[text_len] = '\0';
return GIT_SUCCESS;
+
+ cleanup:
+ if(tag->tag_name)
+ free(tag->tag_name);
+ if(tag->tagger)
+ git_signature_free(tag->tagger);
+
+ return error;
}
int git_tag_create_o(
@@ -233,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)
{