summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2010-05-21 02:35:40 +0200
committerAndreas Ericsson <ae@op5.se>2010-06-02 10:32:06 +0200
commit8add01539268300564482f854412cfe9839e980c (patch)
treec620f25d7fb92598b819001c8265d0d324275546 /src
parent08d5d00056a7237bf6c60f85a6e72b7549cf9133 (diff)
downloadlibgit2-8add01539268300564482f854412cfe9839e980c.tar.gz
Split git_commit_lookup into separate functions.
git_commit_lookup() now creates commit references without loading them from the ODB. git_commit_parse() creates a commit reference, loads it and parses it from the ODB. Signed-off-by: Vicent Marti <tanoku@gmail.com> Signed-off-by: Andreas Ericsson <ae@op5.se>
Diffstat (limited to 'src')
-rw-r--r--src/commit.c68
-rw-r--r--src/commit.h2
-rw-r--r--src/git/commit.h14
-rw-r--r--src/revwalk.c25
-rw-r--r--src/revwalk.h1
5 files changed, 82 insertions, 28 deletions
diff --git a/src/commit.c b/src/commit.c
index 8844825b8..fa33b5202 100644
--- a/src/commit.c
+++ b/src/commit.c
@@ -51,41 +51,71 @@ void git_commit_mark_uninteresting(git_commit *commit)
}
}
-git_commit *git_commit_lookup(git_revpool *pool, const git_oid *id)
+git_commit *git_commit_parse(git_revpool *pool, const git_oid *id)
{
- git_obj commit_obj;
git_commit *commit = NULL;
- if (pool == NULL || pool->db == NULL)
+ if ((commit = git_commit_lookup(pool, id)) == NULL)
return NULL;
- /*
- * TODO: check if the commit is already cached in the
- * revpool instead of loading it from the odb
- */
+ if (git_commit_parse_existing(commit) < 0)
+ goto error_cleanup;
- if (git_odb_read(&commit_obj, pool->db, id) < 0)
- return NULL;
+ return commit;
+
+error_cleanup:
+ free(commit);
+ return NULL;
+}
+
+int git_commit_parse_existing(git_commit *commit)
+{
+ git_obj commit_obj;
+
+ if (commit->parsed)
+ return 0;
+
+ if (commit->pool == NULL || commit->pool->db == NULL)
+ return -1;
+
+ if (git_odb_read(&commit_obj, commit->pool->db, &commit->id) < 0)
+ return -1;
if (commit_obj.type != GIT_OBJ_COMMIT)
goto error_cleanup;
+ if (git_commit__parse_buffer(commit, commit_obj.data, commit_obj.len) < 0)
+ goto error_cleanup;
+
+ git_obj_close(&commit_obj);
+
+ return 0;
+
+error_cleanup:
+ git_obj_close(&commit_obj);
+ return -1;
+}
+
+git_commit *git_commit_lookup(git_revpool *pool, const git_oid *id)
+{
+ git_commit *commit = NULL;
+
+ if (pool == NULL || pool->db == NULL)
+ return NULL;
+
commit = git__malloc(sizeof(git_commit));
+
+ if (commit == NULL)
+ return NULL;
+
memset(commit, 0x0, sizeof(git_commit));
git_oid_cpy(&commit->id, id);
commit->pool = pool;
- if (git_commit__parse_buffer(commit, commit_obj.data, commit_obj.len) < 0)
- goto error_cleanup;
+ git_commit_list_insert(&pool->commits, commit);
return commit;
-
-error_cleanup:
- git_obj_close(&commit_obj);
- free(commit);
-
- return NULL;
}
int git_commit__parse_time(time_t *commit_time, char *buffer, const char *buffer_end)
@@ -111,8 +141,8 @@ int git_commit__parse_time(time_t *commit_time, char *buffer, const char *buffer
int git_commit__parse_oid(git_oid *oid, char **buffer_out, const char *buffer_end, const char *header)
{
- size_t sha_len = GIT_OID_HEXSZ;
- size_t header_len = strlen(header);
+ const size_t sha_len = GIT_OID_HEXSZ;
+ const size_t header_len = strlen(header);
char *buffer = *buffer_out;
diff --git a/src/commit.h b/src/commit.h
index 7ab2d5413..3a6b70664 100644
--- a/src/commit.h
+++ b/src/commit.h
@@ -30,6 +30,8 @@ int git_commit__parse_oid(git_oid *oid, char **buffer_out, const char *buffer_en
int git_commit__parse_buffer(git_commit *commit, void *data, size_t len);
int git_commit__parse_time(time_t *commit_time, char *buffer, const char *buffer_end);
+int git_commit_parse_existing(git_commit *commit);
+
void git_commit_list_insert(git_commit_list **list, git_commit *commit);
#endif
diff --git a/src/git/commit.h b/src/git/commit.h
index ea59a210d..1a57ba732 100644
--- a/src/git/commit.h
+++ b/src/git/commit.h
@@ -17,7 +17,17 @@ GIT_BEGIN_DECL
typedef struct git_commit git_commit;
/**
- * Lookup a commit from a revision pool, and parse it if needed.
+ * Locate a reference to a commit without loading it.
+ * @param pool the pool to use when locating the commit.
+ * @param id identity of the commit to locate. If the object is
+ * an annotated tag it will be peeled back to the commit.
+ * @return the commit; NULL if the commit could not be created
+ */
+GIT_EXTERN(git_commit *) git_commit_lookup(git_revpool *pool, const git_oid *id);
+
+/**
+ * Locate a reference to a commit, and try to load and parse it it from
+ * the commit cache or the object database.
* @param pool the pool to use when parsing/caching the commit.
* @param id identity of the commit to locate. If the object is
* an annotated tag it will be peeled back to the commit.
@@ -25,7 +35,7 @@ typedef struct git_commit git_commit;
* pool's git_odb, or if the commit is present but is
* too malformed to be parsed successfully.
*/
-GIT_EXTERN(git_commit *) git_commit_lookup(git_revpool *pool, const git_oid *id);
+GIT_EXTERN(git_commit *) git_commit_parse(git_revpool *pool, const git_oid *id);
/**
* Get the id of a commit.
diff --git a/src/revwalk.c b/src/revwalk.c
index 96f34447e..fe6f9f293 100644
--- a/src/revwalk.c
+++ b/src/revwalk.c
@@ -41,31 +41,42 @@ git_revpool *gitrp_alloc(git_odb *db)
void gitrp_free(git_revpool *walk)
{
+ git_commit_list *list;
+
+ list = walk->commits;
+ while (list)
+ {
+ free(list->commit);
+ list = list->next;
+ }
+
free(walk);
}
void gitrp_push(git_revpool *pool, git_commit *commit)
{
+ if (commit->pool != pool)
+ return;
+
if ((commit->flags & GIT_COMMIT_SEEN) != 0)
return;
- /* FIXME:
- * Unparsed commit objects? Where do these come from?
- * Do we need to handle them?
- */
if (!commit->parsed)
- return;
+ {
+ if (git_commit_parse_existing(commit) < 0)
+ return;
+ }
commit->flags |= GIT_COMMIT_SEEN;
- git_commit_list_insert(&pool->commits, commit);
+ git_commit_list_insert(&pool->roots, commit);
}
void gitrp_prepare_walk(git_revpool *pool)
{
// TODO: sort commit list based on walk ordering
- pool->iterator = pool->commits;
+ pool->iterator = pool->roots;
pool->walking = 1;
}
diff --git a/src/revwalk.h b/src/revwalk.h
index edf57b4b9..34ff3378e 100644
--- a/src/revwalk.h
+++ b/src/revwalk.h
@@ -8,6 +8,7 @@ struct git_revpool {
git_odb *db;
git_commit_list *iterator;
git_commit_list *commits;
+ git_commit_list *roots;
unsigned walking:1,
topological_sort:1;