Commit 4fd81c537742ad3e805fc04a910e1a7c226cc904

Nika Layzell 2018-06-18T19:43:53

Clear revwalk sorting when resetting Currently we fail to clear the sorting flag for revwalks when resetting. This caused a poor interaction with the limited flag during a recent patch. This patch clears the revwalk sorting flag and causes it to no longer persist over resets.

diff --git a/src/revwalk.c b/src/revwalk.c
index 74ce8a1..072ae46 100644
--- a/src/revwalk.c
+++ b/src/revwalk.c
@@ -455,7 +455,7 @@ static int get_revision(git_commit_list_node **out, git_revwalk *walk, git_commi
 	 */
 	if (!walk->limited) {
 		if ((error = add_parents_to_list(walk, commit, list)) < 0)
-		return error;
+			return error;
 	}
 
 	*out = commit;
@@ -678,7 +678,7 @@ void git_revwalk_sorting(git_revwalk *walk, unsigned int sort_mode)
 		walk->enqueue = &revwalk_enqueue_unsorted;
 	}
 
-	if (sort_mode != GIT_SORT_NONE)
+	if (walk->sorting != GIT_SORT_NONE)
 		walk->limited = 1;
 }
 
@@ -737,6 +737,7 @@ void git_revwalk_reset(git_revwalk *walk)
 	walk->walking = 0;
 	walk->limited = 0;
 	walk->did_push = walk->did_hide = 0;
+	walk->sorting = GIT_SORT_NONE;
 }
 
 int git_revwalk_add_hide_cb(
diff --git a/tests/revwalk/basic.c b/tests/revwalk/basic.c
index 1106bf4..efb48cb 100644
--- a/tests/revwalk/basic.c
+++ b/tests/revwalk/basic.c
@@ -197,6 +197,31 @@ void test_revwalk_basic__push_head(void)
 	cl_assert_equal_i(i, 7);
 }
 
+void test_revwalk_basic__sorted_after_reset(void)
+{
+	int i = 0;
+	git_oid oid;
+
+	revwalk_basic_setup_walk(NULL);
+
+	git_oid_fromstr(&oid, commit_head);
+
+	/* push, sort, and test the walk */
+	cl_git_pass(git_revwalk_push(_walk, &oid));
+	git_revwalk_sorting(_walk, GIT_SORT_TIME);
+
+	cl_git_pass(test_walk_only(_walk, commit_sorting_time, 2));
+
+	/* reset, push, and test again - we should see all entries */
+	git_revwalk_reset(_walk);
+	cl_git_pass(git_revwalk_push(_walk, &oid));
+
+	while (git_revwalk_next(&oid, _walk) == 0)
+		i++;
+
+	cl_assert_equal_i(i, commit_count);
+}
+
 void test_revwalk_basic__push_head_hide_ref(void)
 {
 	int i = 0;