From 40721f6b1297f2a48aeb5c9a3ac095767b1153bf Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Sat, 10 Jul 2010 11:50:16 -0700 Subject: [PATCH] Changed revpool's object table to support arbitrary objects git_revpool_object now has a type identifier for each object type in a revpool (commits, trees, blobs, etc). Trees can now be stored in the revision pool. git_revpool_tableit now supports filtering objects by their type when iterating through the object table. Signed-off-by: Vicent Marti --- src/commit.c | 11 +++++++++-- src/commit.h | 1 + src/revobject.c | 11 +++++++++++ src/revobject.h | 3 +++ src/revwalk.c | 30 +++++++++++++++++++++--------- src/revwalk.h | 4 +++- 6 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/commit.c b/src/commit.c index 58abd58a7..11f76e30c 100644 --- a/src/commit.c +++ b/src/commit.c @@ -34,6 +34,12 @@ printf("Oid: %s | In degree: %d | Time: %u\n", oid, commit->in_degree, commit->commit_time);\ } +void git_commit__free(git_commit *commit) +{ + git_commit_list_clear(&commit->parents, 0); + free(commit); +} + const git_oid *git_commit_id(git_commit *c) { return &c->object.id; @@ -104,7 +110,7 @@ git_commit *git_commit_lookup(git_revpool *pool, const git_oid *id) if (pool == NULL) return NULL; - commit = (git_commit *)git_revpool_table_lookup(pool->commits, id); + commit = (git_commit *)git_revpool_table_lookup(pool->objects, id); if (commit != NULL) return commit; @@ -118,8 +124,9 @@ git_commit *git_commit_lookup(git_revpool *pool, const git_oid *id) /* Initialize parent object */ git_oid_cpy(&commit->object.id, id); commit->object.pool = pool; + commit->object.type = GIT_OBJ_COMMIT; - git_revpool_table_insert(pool->commits, (git_revpool_object *)commit); + git_revpool_table_insert(pool->objects, (git_revpool_object *)commit); return commit; } diff --git a/src/commit.h b/src/commit.h index 760529d87..50acd0c53 100644 --- a/src/commit.h +++ b/src/commit.h @@ -36,6 +36,7 @@ struct git_commit { flags:26; }; +void git_commit__free(git_commit *c); int git_commit__parse_oid(git_oid *oid, char **buffer_out, const char *buffer_end, const char *header); 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); diff --git a/src/revobject.c b/src/revobject.c index 32d5e6464..47d75e047 100644 --- a/src/revobject.c +++ b/src/revobject.c @@ -197,3 +197,14 @@ git_revpool_object *git_revpool_tableit_next(git_revpool_tableit *it) return next->object; } + +git_revpool_object *git_revpool_tableit_nextfilter(git_revpool_tableit *it, git_otype type) +{ + git_revpool_object *obj; + + do { + obj = git_revpool_tableit_next(it); + } while (obj != NULL && obj->type != type); + + return obj; +} diff --git a/src/revobject.h b/src/revobject.h index ccbb507cc..d76d8a639 100644 --- a/src/revobject.h +++ b/src/revobject.h @@ -3,10 +3,12 @@ #include "git/common.h" #include "git/oid.h" +#include "git/odb.h" struct git_revpool_object { git_oid id; git_revpool *pool; + git_otype type; }; struct git_revpool_node { @@ -44,6 +46,7 @@ void git_revpool_table_free(git_revpool_table *table); git_revpool_object *git_revpool_tableit_next(git_revpool_tableit *it); +git_revpool_object *git_revpool_tableit_nextfilter(git_revpool_tableit *it, git_otype type); void git_revpool_tableit_init(git_revpool_table *table, git_revpool_tableit *it); #endif diff --git a/src/revwalk.c b/src/revwalk.c index 431007a7f..d23f6863f 100644 --- a/src/revwalk.c +++ b/src/revwalk.c @@ -37,7 +37,7 @@ git_revpool *gitrp_alloc(git_odb *db) memset(walk, 0x0, sizeof(git_revpool)); - walk->commits = git_revpool_table_create(default_table_size); + walk->objects = git_revpool_table_create(default_table_size); walk->db = db; return walk; @@ -45,20 +45,29 @@ git_revpool *gitrp_alloc(git_odb *db) void gitrp_free(git_revpool *walk) { - git_commit *commit; + git_revpool_object *obj; git_revpool_tableit it; git_commit_list_clear(&(walk->iterator), 0); git_commit_list_clear(&(walk->roots), 0); - git_revpool_tableit_init(walk->commits, &it); + git_revpool_tableit_init(walk->objects, &it); - while ((commit = (git_commit *)git_revpool_tableit_next(&it)) != NULL) { - git_commit_list_clear(&commit->parents, 0); - free(commit); + while ((obj = git_revpool_tableit_next(&it)) != NULL) { + switch (obj->type) { + + case GIT_OBJ_COMMIT: + git_commit__free((git_commit *)obj); + break; + + + default: + free(obj); + break; + } } - git_revpool_table_free(walk->commits); + git_revpool_table_free(walk->objects); free(walk); } @@ -182,9 +191,12 @@ void gitrp_reset(git_revpool *pool) git_commit *commit; git_revpool_tableit it; - git_revpool_tableit_init(pool->commits, &it); + git_revpool_tableit_init(pool->objects, &it); + + while ((commit = + (git_commit *)git_revpool_tableit_nextfilter( + &it, GIT_OBJ_COMMIT)) != NULL) { - while ((commit = (git_commit *)git_revpool_tableit_next(&it)) != NULL) { commit->seen = 0; commit->topo_delay = 0; commit->in_degree = 0; diff --git a/src/revwalk.h b/src/revwalk.h index f7c4cf4a4..270eb8c6b 100644 --- a/src/revwalk.h +++ b/src/revwalk.h @@ -4,6 +4,8 @@ #include "git/common.h" #include "git/revwalk.h" +#include "commit.h" + struct git_revpool { git_odb *db; @@ -11,7 +13,7 @@ struct git_revpool { git_commit *(*next_commit)(git_commit_list *); git_commit_list roots; - git_revpool_table *commits; + git_revpool_table *objects; unsigned walking:1; unsigned int sorting;