diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2015-04-16 19:26:40 -0500 |
---|---|---|
committer | Edward Thomson <ethomson@edwardthomson.com> | 2015-04-16 19:26:40 -0500 |
commit | c332bb70cdf02f202f783485819f65feca953550 (patch) | |
tree | 0a5b26705ab667ef919807a3df5e6a87c8801018 | |
parent | 6f80bf4afb81f9e907601398735c576da1dbadc1 (diff) | |
parent | a05416951e15a2fea4036ddf502f44504bb53faa (diff) | |
download | libgit2-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.c | 24 |
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); |