Commit 9ccab8dfb86bb75c8810ad490b3713c0fa052b01

nulltoken 2013-02-22T15:25:06

stash: Update the reference when dropping the topmost stash

diff --git a/src/stash.c b/src/stash.c
index 877af33..e789850 100644
--- a/src/stash.c
+++ b/src/stash.c
@@ -646,6 +646,12 @@ int git_stash_drop(
 	if (max == 1) {
 		error = git_reference_delete(stash);
 		stash = NULL;
+	} else if (index == 0) {
+		const git_reflog_entry *entry;
+
+		entry = git_reflog_entry_byindex(reflog, 0);
+
+		error = git_reference_set_target(stash, &entry->oid_cur);
 	}
 
 cleanup:
diff --git a/tests-clar/stash/drop.c b/tests-clar/stash/drop.c
index 548adda..1eb42c0 100644
--- a/tests-clar/stash/drop.c
+++ b/tests-clar/stash/drop.c
@@ -137,3 +137,36 @@ void test_stash_drop__dropping_the_last_entry_removes_the_stash(void)
 	cl_git_fail_with(
 		git_reference_lookup(&stash, repo, GIT_REFS_STASH_FILE), GIT_ENOTFOUND);
 }
+
+void retrieve_top_stash_id(git_oid *out)
+{
+	git_object *top_stash;
+
+	cl_git_pass(git_revparse_single(&top_stash, repo, "stash@{0}"));
+	cl_git_pass(git_reference_name_to_id(out, repo, GIT_REFS_STASH_FILE));
+
+	cl_assert_equal_i(true, git_oid_cmp(out, git_object_id(top_stash)) == 0);
+
+	git_object_free(top_stash);
+}
+
+void test_stash_drop__dropping_the_top_stash_updates_the_stash_reference(void)
+{
+	git_object *next_top_stash;
+	git_oid oid;
+
+	push_three_states();
+
+	retrieve_top_stash_id(&oid);
+
+	cl_git_pass(git_revparse_single(&next_top_stash, repo, "stash@{1}"));
+	cl_assert_equal_i(
+		false, git_oid_cmp(&oid, git_object_id(next_top_stash)) == 0);
+
+	cl_git_pass(git_stash_drop(repo, 0));
+
+	retrieve_top_stash_id(&oid);
+
+	cl_assert_equal_i(
+		true, git_oid_cmp(&oid, git_object_id(next_top_stash)) == 0);
+}