mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 06:20:56 +00:00
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>
This commit is contained in:
parent
08d5d00056
commit
8add015392
80
src/commit.c
80
src/commit.c
@ -51,43 +51,73 @@ 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_odb_read(&commit_obj, pool->db, id) < 0)
|
||||
return NULL;
|
||||
|
||||
if (commit_obj.type != GIT_OBJ_COMMIT)
|
||||
goto error_cleanup;
|
||||
|
||||
commit = git__malloc(sizeof(git_commit));
|
||||
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)
|
||||
if (git_commit_parse_existing(commit) < 0)
|
||||
goto error_cleanup;
|
||||
|
||||
return commit;
|
||||
|
||||
error_cleanup:
|
||||
git_obj_close(&commit_obj);
|
||||
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;
|
||||
|
||||
git_commit_list_insert(&pool->commits, commit);
|
||||
|
||||
return commit;
|
||||
}
|
||||
|
||||
int git_commit__parse_time(time_t *commit_time, char *buffer, const char *buffer_end)
|
||||
{
|
||||
if (memcmp(buffer, "author ", 7) != 0)
|
||||
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user