Commit e5d1faefab1bb51f3d0fff2d5e2cfe4fe96a9c22

Vicent Marti 2010-05-25T19:48:13

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>

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__ */