Add external API for revision sorting. The GIT_RPSORT_XXX flags have been moved to the external API, and a new method 'gitrp_sorting(...)' has been added to safely change the sorting method of a revision pool. Signed-off-by: Vicent Marti <tanoku@gmail.com> Signed-off-by: Andreas Ericsson <ae@op5.se>
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
diff --git a/src/git/revwalk.h b/src/git/revwalk.h
index 4e7e9f6..0a902f9 100644
--- a/src/git/revwalk.h
+++ b/src/git/revwalk.h
@@ -15,6 +15,35 @@
GIT_BEGIN_DECL
/**
+ * Sort the revpool contents in no particular ordering;
+ * this sorting is arbritary, implementation-specific
+ * and subject to change at any time.
+ * This is the default sorting for new revision pools.
+ */
+#define GIT_RPSORT_NONE (0)
+
+/**
+ * Sort the revpool contents in topological order
+ * (parents before children); this sorting mode
+ * can be combined with time sorting.
+ */
+#define GIT_RPSORT_TOPOLOGICAL (1 << 0)
+
+/**
+ * Sort the revpool contents by commit time;
+ * this sorting mode can be combined with
+ * topological sorting.
+ */
+#define GIT_RPSORT_TIME (1 << 1)
+
+/**
+ * Iterate through the revpool contents in reverse
+ * order; this sorting mode can be combined with
+ * any of the above.
+ */
+#define GIT_RPSORT_REVERSE (1 << 2)
+
+/**
* Allocate a new revision traversal pool.
*
* The configuration is copied during allocation. Changes
@@ -55,6 +84,13 @@ GIT_EXTERN(void) gitrp_hide(git_revpool *pool, git_commit *commit);
GIT_EXTERN(git_commit *) gitrp_next(git_revpool *pool);
/**
+ * Change the sorting mode when iterating through the
+ * revision pool's contents.
+ * @param sort_mode combination of GIT_RPSORT_XXX flags
+ */
+GIT_EXTERN(void) gitrp_sorting(git_revpool *pool, unsigned int sort_mode);
+
+/**
* Free a revwalk previously allocated.
* @param pool traversal handle to close. If NULL nothing occurs.
*/
diff --git a/src/revwalk.c b/src/revwalk.c
index 60ea5e8..eccaf6f 100644
--- a/src/revwalk.c
+++ b/src/revwalk.c
@@ -53,9 +53,18 @@ void gitrp_free(git_revpool *walk)
free(walk);
}
+void gitrp_sorting(git_revpool *pool, unsigned int sort_mode)
+{
+ if (pool->walking)
+ return;
+
+ pool->sorting = sort_mode;
+ gitrp_reset(pool);
+}
+
void gitrp_push(git_revpool *pool, git_commit *commit)
{
- if (commit->object.pool != pool)
+ if (commit->object.pool != pool || pool->walking)
return;
if (commit->seen)
@@ -78,6 +87,9 @@ void gitrp_push(git_revpool *pool, git_commit *commit)
void gitrp_hide(git_revpool *pool, git_commit *commit)
{
+ if (pool->walking)
+ return;
+
git_commit__mark_uninteresting(commit);
gitrp_push(pool, commit);
}
@@ -103,20 +115,20 @@ void gitrp__enroot(git_revpool *pool, git_commit *commit)
git_commit_list_push_back(&pool->iterator, commit);
}
-void gitrp_prepare_walk(git_revpool *pool)
+void gitrp__prepare_walk(git_revpool *pool)
{
git_commit_node *it;
for (it = pool->roots.head; it != NULL; it = it->next)
gitrp__enroot(pool, it->commit);
- if (pool->sorting & GIT_REVPOOL_SORT_TIME)
+ if (pool->sorting & GIT_RPSORT_TIME)
git_commit_list_timesort(&pool->iterator);
- if (pool->sorting & GIT_REVPOOL_SORT_TOPO)
+ if (pool->sorting & GIT_RPSORT_TOPOLOGICAL)
git_commit_list_toposort(&pool->iterator);
- if (pool->sorting & GIT_REVPOOL_SORT_REVERSE)
+ if (pool->sorting & GIT_RPSORT_REVERSE)
pool->next_commit = &git_commit_list_pop_back;
else
pool->next_commit = &git_commit_list_pop_front;
@@ -129,7 +141,7 @@ git_commit *gitrp_next(git_revpool *pool)
git_commit *next;
if (!pool->walking)
- gitrp_prepare_walk(pool);
+ gitrp__prepare_walk(pool);
while ((next = pool->next_commit(&pool->iterator)) != NULL)
{
diff --git a/src/revwalk.h b/src/revwalk.h
index 14599df..da81827 100644
--- a/src/revwalk.h
+++ b/src/revwalk.h
@@ -4,11 +4,6 @@
#include "git/common.h"
#include "git/revwalk.h"
-#define GIT_REVPOOL_SORT_NONE (0)
-#define GIT_REVPOOL_SORT_TOPO (1 << 0)
-#define GIT_REVPOOL_SORT_TIME (1 << 1)
-#define GIT_REVPOOL_SORT_REVERSE (1 << 2)
-
struct git_revpool {
git_odb *db;
@@ -22,4 +17,7 @@ struct git_revpool {
unsigned char sorting;
};
+void gitrp__prepare_walk(git_revpool *pool);
+void gitrp__enroot(git_revpool *pool, git_commit *commit);
+
#endif /* INCLUDE_revwalk_h__ */