summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commit.c28
-rw-r--r--commit.h21
2 files changed, 49 insertions, 0 deletions
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
@@ -58,6 +58,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.
*/
void free_commit_buffer(struct commit *);