From 30b171a185a1ef788d41265f08ad1da98d72918a Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Sat, 20 Nov 2010 17:37:32 +0200 Subject: [PATCH] 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 --- src/blob.c | 35 +++++++++++------------------------ src/git/blob.h | 15 +++++++-------- 2 files changed, 18 insertions(+), 32 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); + assert(blob); - if (blob->content.data != NULL) { + if (blob->content.data != NULL) + return blob->content.data; - if (len + 1 < blob->content.len) - return GIT_ENOMEM; - - memcpy(buffer, blob->content.data, blob->content.len); - ((char *)buffer)[blob->content.len] = 0; - - } else { + if (blob->object.in_memory) + return NULL; - if (len + 1 < blob->object.source.raw.len) - return GIT_ENOMEM; + if (!blob->object.source.open && git_object__source_open((git_object *)blob) < 0) + return NULL; - if ((error = git_object__source_open((git_object *)blob)) < 0) - return error; - - memcpy(buffer, blob->object.source.raw.data, blob->object.source.raw.len); - ((char *)buffer)[blob->object.source.raw.len] = 0; - - git_object__source_close((git_object *)blob); - } - - 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); diff --git a/src/git/blob.h b/src/git/blob.h index 23afd64a9..93ced42ee 100644 --- a/src/git/blob.h +++ b/src/git/blob.h @@ -63,18 +63,17 @@ GIT_EXTERN(int) git_blob_set_rawcontent_fromfile(git_blob *blob, const char *fil GIT_EXTERN(int) git_blob_set_rawcontent(git_blob *blob, const void *buffer, size_t len); /** - * Read the raw content of a blob. + * Get a read-only buffer with the raw content of a blob. * - * A copy of the raw content is stored on the buffer passed - * to the function. If the buffer is not long enough, - * the method will fail. + * A pointer to the raw content of a blob is returned; + * this pointer is owned internally by the object and shall + * not be free'd. The pointer may be invalidated at a later + * time (e.g. when changing the contents of the blob). * * @param blob pointer to the blob - * @param buffer buffer to fill with contents - * @param len size of the buffer - * @return 0 on success; error code otherwise + * @return the pointer; NULL if the blob has no contents */ -GIT_EXTERN(int) git_blob_rawcontent(git_blob *blob, void *buffer, size_t len); +GIT_EXTERN(const char *) git_blob_rawcontent(git_blob *blob); /** * Get the size in bytes of the contents of a blob