diff options
author | Vicent Marti <tanoku@gmail.com> | 2010-05-21 02:35:40 +0200 |
---|---|---|
committer | Andreas Ericsson <ae@op5.se> | 2010-06-02 10:32:06 +0200 |
commit | 8add01539268300564482f854412cfe9839e980c (patch) | |
tree | c620f25d7fb92598b819001c8265d0d324275546 /src | |
parent | 08d5d00056a7237bf6c60f85a6e72b7549cf9133 (diff) | |
download | libgit2-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.c | 68 | ||||
-rw-r--r-- | src/commit.h | 2 | ||||
-rw-r--r-- | src/git/commit.h | 14 | ||||
-rw-r--r-- | src/revwalk.c | 25 | ||||
-rw-r--r-- | src/revwalk.h | 1 |
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; |