diff options
author | Adam Niedzielski <adamsunday@gmail.com> | 2017-03-09 14:01:10 +0100 |
---|---|---|
committer | Adam Niedzielski <adamsunday@gmail.com> | 2017-03-09 14:01:10 +0100 |
commit | c11c08a552cf4b21f1a1b95513788c8011b41c07 (patch) | |
tree | 6e29598f1da4036a7280902d971cb39edaf678fc | |
parent | b31b2360044f5960d52b7b12d1c9e48cd647a3fb (diff) | |
download | libgit2-c11c08a552cf4b21f1a1b95513788c8011b41c07.tar.gz |
Skip uninteresting commits in revwalk timesort iterator
Fixes #4099
-rw-r--r-- | src/revwalk.c | 9 | ||||
-rw-r--r-- | tests/revwalk/basic.c | 20 |
2 files changed, 26 insertions, 3 deletions
diff --git a/src/revwalk.c b/src/revwalk.c index 6d08164ba..77fa9fd0c 100644 --- a/src/revwalk.c +++ b/src/revwalk.c @@ -231,9 +231,12 @@ static int revwalk_next_timesort(git_commit_list_node **object_out, git_revwalk { git_commit_list_node *next; - if ((next = git_pqueue_pop(&walk->iterator_time)) != NULL) { - *object_out = next; - return 0; + while ((next = git_pqueue_pop(&walk->iterator_time)) != NULL) { + /* Some commits might become uninteresting after being added to the list */ + if (!next->uninteresting) { + *object_out = next; + return 0; + } } giterr_clear(); diff --git a/tests/revwalk/basic.c b/tests/revwalk/basic.c index a38d7f406..547050c68 100644 --- a/tests/revwalk/basic.c +++ b/tests/revwalk/basic.c @@ -345,6 +345,26 @@ void test_revwalk_basic__topo_crash(void) git_revwalk_next(&oid, _walk); } +void test_revwalk_basic__from_new_to_old(void) +{ + git_oid from_oid, to_oid, oid; + int i = 0; + + revwalk_basic_setup_walk(NULL); + git_revwalk_sorting(_walk, GIT_SORT_TIME); + + cl_git_pass(git_oid_fromstr(&to_oid, "5b5b025afb0b4c913b4c338a42934a3863bf3644")); + cl_git_pass(git_oid_fromstr(&from_oid, "a4a7dce85cf63874e984719f4fdd239f5145052f")); + + cl_git_pass(git_revwalk_push(_walk, &to_oid)); + cl_git_pass(git_revwalk_hide(_walk, &from_oid)); + + while (git_revwalk_next(&oid, _walk) == 0) + i++; + + cl_assert_equal_i(i, 0); +} + void test_revwalk_basic__push_range(void) { revwalk_basic_setup_walk(NULL); |