stash: correctly stash wd modified/index deleted
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
diff --git a/src/stash.c b/src/stash.c
index cad87d1..6948536 100644
--- a/src/stash.c
+++ b/src/stash.c
@@ -313,8 +313,7 @@ static int build_workdir_tree(
if ((error = git_commit_tree(&b_tree, b_commit)) < 0)
goto cleanup;
- if ((error = git_diff_tree_to_workdir_with_index(
- &diff, repo, b_tree, &opts)) < 0)
+ if ((error = git_diff_tree_to_workdir(&diff, repo, b_tree, &opts)) < 0)
goto cleanup;
data.include_changed = true;
diff --git a/tests/stash/save.c b/tests/stash/save.c
index a5bdd0c..1433730 100644
--- a/tests/stash/save.c
+++ b/tests/stash/save.c
@@ -399,3 +399,22 @@ void test_stash_save__skip_submodules(void)
assert_status(repo, "untracked_repo/", GIT_STATUS_WT_NEW);
}
+
+void test_stash_save__deleted_in_index_modified_in_workdir(void)
+{
+ git_index *index;
+
+ git_repository_index(&index, repo);
+
+ cl_git_pass(git_index_remove_bypath(index, "who"));
+ cl_git_pass(git_index_write(index));
+
+ assert_status(repo, "who", GIT_STATUS_WT_NEW | GIT_STATUS_INDEX_DELETED);
+
+ cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT));
+
+ assert_blob_oid("stash@{0}^0:who", "a0400d4954659306a976567af43125a0b1aa8595");
+ assert_blob_oid("stash@{0}^2:who", NULL);
+
+ git_index_free(index);
+}