summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Niedzielski <adamsunday@gmail.com>2017-03-09 14:01:10 +0100
committerAdam Niedzielski <adamsunday@gmail.com>2017-03-09 14:01:10 +0100
commitc11c08a552cf4b21f1a1b95513788c8011b41c07 (patch)
tree6e29598f1da4036a7280902d971cb39edaf678fc
parentb31b2360044f5960d52b7b12d1c9e48cd647a3fb (diff)
downloadlibgit2-c11c08a552cf4b21f1a1b95513788c8011b41c07.tar.gz
Skip uninteresting commits in revwalk timesort iterator
Fixes #4099
-rw-r--r--src/revwalk.c9
-rw-r--r--tests/revwalk/basic.c20
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);