diff --git a/commit.c b/commit.c index fc8b4e287d..b6b0e0d6fb 100644 --- a/commit.c +++ b/commit.c @@ -250,6 +250,34 @@ void set_commit_buffer(struct commit *commit, void *buffer) commit->buffer = buffer; } +const void *get_cached_commit_buffer(const struct commit *commit) +{ + return commit->buffer; +} + +const void *get_commit_buffer(const struct commit *commit) +{ + const void *ret = get_cached_commit_buffer(commit); + if (!ret) { + enum object_type type; + unsigned long size; + ret = read_sha1_file(commit->object.sha1, &type, &size); + if (!ret) + die("cannot read commit object %s", + sha1_to_hex(commit->object.sha1)); + if (type != OBJ_COMMIT) + die("expected commit for %s, got %s", + sha1_to_hex(commit->object.sha1), typename(type)); + } + return ret; +} + +void unuse_commit_buffer(const struct commit *commit, const void *buffer) +{ + if (commit->buffer != buffer) + free((void *)buffer); +} + void free_commit_buffer(struct commit *commit) { free(commit->buffer); diff --git a/commit.h b/commit.h index cc89128894..259c0aec75 100644 --- a/commit.h +++ b/commit.h @@ -57,6 +57,27 @@ void parse_commit_or_die(struct commit *item); */ void set_commit_buffer(struct commit *, void *buffer); +/* + * Get any cached object buffer associated with the commit. Returns NULL + * if none. The resulting memory should not be freed. + */ +const void *get_cached_commit_buffer(const struct commit *); + +/* + * Get the commit's object contents, either from cache or by reading the object + * from disk. The resulting memory should not be modified, and must be given + * to unuse_commit_buffer when the caller is done. + */ +const void *get_commit_buffer(const struct commit *); + +/* + * Tell the commit subsytem that we are done with a particular commit buffer. + * The commit and buffer should be the input and return value, respectively, + * from an earlier call to get_commit_buffer. The buffer may or may not be + * freed by this call; callers should not access the memory afterwards. + */ +void unuse_commit_buffer(const struct commit *, const void *buffer); + /* * Free any cached object buffer associated with the commit. */