diff options
author | Vicent Marti <tanoku@gmail.com> | 2010-11-20 17:37:32 +0200 |
---|---|---|
committer | Vicent Marti <tanoku@gmail.com> | 2010-11-20 17:37:32 +0200 |
commit | 30b171a185a1ef788d41265f08ad1da98d72918a (patch) | |
tree | b1e2de22198c7832fc9ab9d3563259c510181fc2 /src/blob.c | |
parent | 69a09b7c6972343e321c7c0e3441fcc4b5340444 (diff) | |
download | libgit2-30b171a185a1ef788d41265f08ad1da98d72918a.tar.gz |
Change blob API to return temp refs to the content
If the user wants permanent references, he can duplicate the temporary
one manually.
Signed-off-by: Vicent Marti <tanoku@gmail.com>
Diffstat (limited to 'src/blob.c')
-rw-r--r-- | src/blob.c | 35 |
1 files changed, 11 insertions, 24 deletions
diff --git a/src/blob.c b/src/blob.c index 818f838d2..c301ae15d 100644 --- a/src/blob.c +++ b/src/blob.c @@ -30,35 +30,20 @@ #include "common.h" #include "blob.h" -int git_blob_rawcontent(git_blob *blob, void *buffer, size_t len) +const char *git_blob_rawcontent(git_blob *blob) { - int error; - - assert(blob && buffer); - - if (blob->content.data != NULL) { - - if (len + 1 < blob->content.len) - return GIT_ENOMEM; - - memcpy(buffer, blob->content.data, blob->content.len); - ((char *)buffer)[blob->content.len] = 0; + assert(blob); - } else { - - if (len + 1 < blob->object.source.raw.len) - return GIT_ENOMEM; - - if ((error = git_object__source_open((git_object *)blob)) < 0) - return error; + if (blob->content.data != NULL) + return blob->content.data; - memcpy(buffer, blob->object.source.raw.data, blob->object.source.raw.len); - ((char *)buffer)[blob->object.source.raw.len] = 0; + if (blob->object.in_memory) + return NULL; - git_object__source_close((git_object *)blob); - } + if (!blob->object.source.open && git_object__source_open((git_object *)blob) < 0) + return NULL; - return GIT_SUCCESS; + return blob->object.source.raw.data; } int git_blob_rawsize(git_blob *blob) @@ -99,6 +84,8 @@ int git_blob_set_rawcontent(git_blob *blob, const void *buffer, size_t len) blob->object.modified = 1; + git_object__source_close((git_object *)blob); + if (blob->content.data != NULL) gitfo_free_buf(&blob->content); |