summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2015-04-16 19:26:40 -0500
committerEdward Thomson <ethomson@edwardthomson.com>2015-04-16 19:26:40 -0500
commitc332bb70cdf02f202f783485819f65feca953550 (patch)
tree0a5b26705ab667ef919807a3df5e6a87c8801018
parent6f80bf4afb81f9e907601398735c576da1dbadc1 (diff)
parenta05416951e15a2fea4036ddf502f44504bb53faa (diff)
downloadlibgit2-c332bb70cdf02f202f783485819f65feca953550.tar.gz
Merge pull request #3042 from libgit2/cmn/odd-slowdown
revwalk: detect when we're out of interesting commits
-rw-r--r--src/revwalk.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/revwalk.c b/src/revwalk.c
index 9d0fafddf..6acc5d034 100644
--- a/src/revwalk.c
+++ b/src/revwalk.c
@@ -41,11 +41,31 @@ git_commit_list_node *git_revwalk__commit_lookup(
return commit;
}
+typedef git_array_t(git_commit_list_node*) commit_list_node_array;
+
+static bool interesting_arr(commit_list_node_array arr)
+{
+ git_commit_list_node **n;
+ size_t i = 0, size;
+
+ size = git_array_size(arr);
+ for (i = 0; i < size; i++) {
+ n = git_array_get(arr, i);
+ if (!*n)
+ break;
+
+ if (!(*n)->uninteresting)
+ return true;
+ }
+
+ return false;
+}
+
static int mark_uninteresting(git_revwalk *walk, git_commit_list_node *commit)
{
int error;
unsigned short i;
- git_array_t(git_commit_list_node *) pending = GIT_ARRAY_INIT;
+ commit_list_node_array pending = GIT_ARRAY_INIT;
git_commit_list_node **tmp;
assert(commit);
@@ -66,7 +86,7 @@ static int mark_uninteresting(git_revwalk *walk, git_commit_list_node *commit)
tmp = git_array_pop(pending);
commit = tmp ? *tmp : NULL;
- } while (commit != NULL);
+ } while (commit != NULL && !interesting_arr(pending));
git_array_clear(pending);