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) ...@@ -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; git_commit *commit = NULL;
if (pool == NULL || pool->db == NULL) if ((commit = git_commit_lookup(pool, id)) == NULL)
return NULL; return NULL;
/* if (git_commit_parse_existing(commit) < 0)
* TODO: check if the commit is already cached in the goto error_cleanup;
* revpool instead of loading it from the odb
*/
if (git_odb_read(&commit_obj, pool->db, id) < 0) return commit;
error_cleanup:
free(commit);
return NULL; return NULL;
}
if (commit_obj.type != GIT_OBJ_COMMIT) int git_commit_parse_existing(git_commit *commit)
goto error_cleanup; {
git_obj commit_obj;
commit = git__malloc(sizeof(git_commit)); if (commit->parsed)
memset(commit, 0x0, sizeof(git_commit)); return 0;
git_oid_cpy(&commit->id, id); if (commit->pool == NULL || commit->pool->db == NULL)
commit->pool = pool; 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) if (git_commit__parse_buffer(commit, commit_obj.data, commit_obj.len) < 0)
goto error_cleanup; goto error_cleanup;
return commit; git_obj_close(&commit_obj);
return 0;
error_cleanup: error_cleanup:
git_obj_close(&commit_obj); git_obj_close(&commit_obj);
free(commit); 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; 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;
git_commit_list_insert(&pool->commits, commit);
return commit;
} }
int git_commit__parse_time(time_t *commit_time, char *buffer, const char *buffer_end) 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 ...@@ -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) 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; const size_t sha_len = GIT_OID_HEXSZ;
size_t header_len = strlen(header); const size_t header_len = strlen(header);
char *buffer = *buffer_out; char *buffer = *buffer_out;
......
...@@ -30,6 +30,8 @@ int git_commit__parse_oid(git_oid *oid, char **buffer_out, const char *buffer_en ...@@ -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_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_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); void git_commit_list_insert(git_commit_list **list, git_commit *commit);
#endif #endif
...@@ -17,7 +17,17 @@ GIT_BEGIN_DECL ...@@ -17,7 +17,17 @@ GIT_BEGIN_DECL
typedef struct git_commit git_commit; 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 pool the pool to use when parsing/caching the commit.
* @param id identity of the commit to locate. If the object is * @param id identity of the commit to locate. If the object is
* an annotated tag it will be peeled back to the commit. * an annotated tag it will be peeled back to the commit.
...@@ -25,7 +35,7 @@ typedef struct git_commit git_commit; ...@@ -25,7 +35,7 @@ typedef struct git_commit git_commit;
* pool's git_odb, or if the commit is present but is * pool's git_odb, or if the commit is present but is
* too malformed to be parsed successfully. * 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. * Get the id of a commit.
......
...@@ -41,31 +41,42 @@ git_revpool *gitrp_alloc(git_odb *db) ...@@ -41,31 +41,42 @@ git_revpool *gitrp_alloc(git_odb *db)
void gitrp_free(git_revpool *walk) void gitrp_free(git_revpool *walk)
{ {
git_commit_list *list;
list = walk->commits;
while (list)
{
free(list->commit);
list = list->next;
}
free(walk); free(walk);
} }
void gitrp_push(git_revpool *pool, git_commit *commit) void gitrp_push(git_revpool *pool, git_commit *commit)
{ {
if (commit->pool != pool)
return;
if ((commit->flags & GIT_COMMIT_SEEN) != 0) if ((commit->flags & GIT_COMMIT_SEEN) != 0)
return; return;
/* FIXME:
* Unparsed commit objects? Where do these come from?
* Do we need to handle them?
*/
if (!commit->parsed) if (!commit->parsed)
{
if (git_commit_parse_existing(commit) < 0)
return; return;
}
commit->flags |= GIT_COMMIT_SEEN; 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) void gitrp_prepare_walk(git_revpool *pool)
{ {
// TODO: sort commit list based on walk ordering // TODO: sort commit list based on walk ordering
pool->iterator = pool->commits; pool->iterator = pool->roots;
pool->walking = 1; pool->walking = 1;
} }
......
...@@ -8,6 +8,7 @@ struct git_revpool { ...@@ -8,6 +8,7 @@ struct git_revpool {
git_odb *db; git_odb *db;
git_commit_list *iterator; git_commit_list *iterator;
git_commit_list *commits; git_commit_list *commits;
git_commit_list *roots;
unsigned walking:1, unsigned walking:1,
topological_sort: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