Commit c332bb70 by Edward Thomson

Merge pull request #3042 from libgit2/cmn/odd-slowdown

revwalk: detect when we're out of interesting commits
parents 6f80bf4a a0541695
...@@ -41,11 +41,31 @@ git_commit_list_node *git_revwalk__commit_lookup( ...@@ -41,11 +41,31 @@ git_commit_list_node *git_revwalk__commit_lookup(
return commit; 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) static int mark_uninteresting(git_revwalk *walk, git_commit_list_node *commit)
{ {
int error; int error;
unsigned short i; 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; git_commit_list_node **tmp;
assert(commit); assert(commit);
...@@ -66,7 +86,7 @@ static int mark_uninteresting(git_revwalk *walk, git_commit_list_node *commit) ...@@ -66,7 +86,7 @@ static int mark_uninteresting(git_revwalk *walk, git_commit_list_node *commit)
tmp = git_array_pop(pending); tmp = git_array_pop(pending);
commit = tmp ? *tmp : NULL; commit = tmp ? *tmp : NULL;
} while (commit != NULL); } while (commit != NULL && !interesting_arr(pending));
git_array_clear(pending); git_array_clear(pending);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment