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;
|
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
|
|
||||||
* 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)
|
|
||||||
goto error_cleanup;
|
goto error_cleanup;
|
||||||
|
|
||||||
return commit;
|
return commit;
|
||||||
|
|
||||||
error_cleanup:
|
error_cleanup:
|
||||||
git_obj_close(&commit_obj);
|
|
||||||
free(commit);
|
free(commit);
|
||||||
|
|
||||||
return NULL;
|
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)
|
int git_commit__parse_time(time_t *commit_time, char *buffer, const char *buffer_end)
|
||||||
{
|
{
|
||||||
if (memcmp(buffer, "author ", 7) != 0)
|
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)
|
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
|
|||||||
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
|
|||||||
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;
|
|||||||
* 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)
|
|||||||
|
|
||||||
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)
|
||||||
return;
|
{
|
||||||
|
if (git_commit_parse_existing(commit) < 0)
|
||||||
|
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 {
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user