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 <tanoku@gmail.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
diff --git a/src/commit.c b/src/commit.c
index 58abd58..11f76e3 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 760529d..50acd0c 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 32d5e64..47d75e0 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 ccbb507..d76d8a6 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 431007a..d23f686 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 ((obj = git_revpool_tableit_next(&it)) != NULL) {
+ switch (obj->type) {
+
+ case GIT_OBJ_COMMIT:
+ git_commit__free((git_commit *)obj);
+ break;
- while ((commit = (git_commit *)git_revpool_tableit_next(&it)) != NULL) {
- git_commit_list_clear(&commit->parents, 0);
- free(commit);
+
+ 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 f7c4cf4..270eb8c 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;