revwalk: keep a single list of user inputs The old separation was due to the old merge-base finding, so it's no longer necessary.
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
diff --git a/src/revwalk.c b/src/revwalk.c
index 84034f5..8a5a846 100644
--- a/src/revwalk.c
+++ b/src/revwalk.c
@@ -116,6 +116,7 @@ static int push_commit(git_revwalk *walk, const git_oid *oid, int uninteresting,
int error;
git_object *obj, *oobj;
git_commit_list_node *commit;
+ git_commit_list *list;
if ((error = git_object_lookup(&oobj, walk->repo, oid, GIT_OBJ_ANY)) < 0)
return error;
@@ -142,13 +143,14 @@ static int push_commit(git_revwalk *walk, const git_oid *oid, int uninteresting,
return -1; /* error already reported by failed lookup */
commit->uninteresting = uninteresting;
- if (walk->one == NULL && !uninteresting) {
- walk->one = commit;
- } else {
- if (git_vector_insert(&walk->twos, commit) < 0)
- return -1;
+ list = walk->user_input;
+ if (git_commit_list_insert(commit, &list) == NULL) {
+ giterr_set_oom();
+ return -1;
}
+ walk->user_input = list;
+
return 0;
}
@@ -369,27 +371,25 @@ static int revwalk_next_reverse(git_commit_list_node **object_out, git_revwalk *
static int prepare_walk(git_revwalk *walk)
{
- int error;
- unsigned int i;
- git_commit_list_node *next, *two;
+ int error, interesting = 0;
+ git_commit_list *list;
+ git_commit_list_node *next;
+
+ for (list = walk->user_input; list; list = list->next) {
+ interesting += !list->item->uninteresting;
+ if (process_commit(walk, list->item, list->item->uninteresting) < 0)
+ return -1;
+ }
+
/*
- * If walk->one is NULL, there were no positive references,
- * so we know that the walk is already over.
+ * If there were no pushes, we know that the walk is already over.
*/
- if (walk->one == NULL) {
+ if (!interesting) {
giterr_clear();
return GIT_ITEROVER;
}
- if (process_commit(walk, walk->one, walk->one->uninteresting) < 0)
- return -1;
-
- git_vector_foreach(&walk->twos, i, two) {
- if (process_commit(walk, two, two->uninteresting) < 0)
- return -1;
- }
-
if (walk->sorting & GIT_SORT_TOPOLOGICAL) {
unsigned short i;
@@ -440,7 +440,6 @@ int git_revwalk_new(git_revwalk **revwalk_out, git_repository *repo)
if (git_pqueue_init(
&walk->iterator_time, 0, 8, git_commit_list_time_cmp) < 0 ||
- git_vector_init(&walk->twos, 4, NULL) < 0 ||
git_pool_init(&walk->commit_pool, 1,
git_pool__suggest_items_per_page(COMMIT_ALLOC) * COMMIT_ALLOC) < 0)
return -1;
@@ -470,7 +469,6 @@ void git_revwalk_free(git_revwalk *walk)
git_oidmap_free(walk->commits);
git_pool_clear(&walk->commit_pool);
git_pqueue_free(&walk->iterator_time);
- git_vector_free(&walk->twos);
git__free(walk);
}
@@ -547,10 +545,8 @@ void git_revwalk_reset(git_revwalk *walk)
git_commit_list_free(&walk->iterator_topo);
git_commit_list_free(&walk->iterator_rand);
git_commit_list_free(&walk->iterator_reverse);
+ git_commit_list_free(&walk->user_input);
walk->walking = 0;
-
- walk->one = NULL;
- git_vector_clear(&walk->twos);
}
int git_revwalk_add_hide_cb(
diff --git a/src/revwalk.h b/src/revwalk.h
index d81f97c..05a7a42 100644
--- a/src/revwalk.h
+++ b/src/revwalk.h
@@ -35,9 +35,8 @@ struct git_revwalk {
first_parent: 1;
unsigned int sorting;
- /* merge base calculation */
- git_commit_list_node *one;
- git_vector twos;
+ /* the pushes and hides */
+ git_commit_list *user_input;
/* hide callback */
git_revwalk_hide_cb hide_cb;