Remove ignored files from the working directory if they were stashed
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 42 43 44 45 46 47
diff --git a/src/stash.c b/src/stash.c
index b1dd87b..0c91012 100644
--- a/src/stash.c
+++ b/src/stash.c
@@ -465,7 +465,8 @@ static int ensure_there_are_changes_to_stash(
static int reset_index_and_workdir(
git_repository *repo,
git_commit *commit,
- bool remove_untracked)
+ bool remove_untracked,
+ bool remove_ignored)
{
git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
@@ -474,6 +475,9 @@ static int reset_index_and_workdir(
if (remove_untracked)
opts.checkout_strategy |= GIT_CHECKOUT_REMOVE_UNTRACKED;
+ if (remove_ignored)
+ opts.checkout_strategy |= GIT_CHECKOUT_REMOVE_IGNORED;
+
return git_checkout_tree(repo, (git_object *)commit, &opts);
}
@@ -532,7 +536,8 @@ int git_stash_save(
if ((error = reset_index_and_workdir(
repo,
((flags & GIT_STASH_KEEP_INDEX) != 0) ? i_commit : b_commit,
- (flags & GIT_STASH_INCLUDE_UNTRACKED) != 0)) < 0)
+ (flags & GIT_STASH_INCLUDE_UNTRACKED) != 0,
+ (flags & GIT_STASH_INCLUDE_IGNORED) != 0)) < 0)
goto cleanup;
cleanup:
diff --git a/tests/stash/save.c b/tests/stash/save.c
index b5a793e..f06c1fb 100644
--- a/tests/stash/save.c
+++ b/tests/stash/save.c
@@ -159,6 +159,8 @@ void test_stash_save__can_include_untracked_and_ignored_files(void)
assert_blob_oid("refs/stash^3:who", NULL);
assert_blob_oid("refs/stash^3:when", "b6ed15e81e2593d7bb6265eb4a991d29dc3e628b");
assert_blob_oid("refs/stash^3:just.ignore", "78925fb1236b98b37a35e9723033e627f97aa88b");
+
+ cl_assert(!git_path_exists("stash/just.ignore"));
}
#define MESSAGE "Look Ma! I'm on TV!"