Commit 8add0153 by Vicent Marti Committed by Andreas Ericsson

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>
parent 08d5d000
......@@ -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;
......
......@@ -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
......@@ -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.
......
......@@ -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;
}
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment