From: Nadav Goldstein <nadav.goldstein@xxxxxxxxxxx> In this patch, we introduce a new subcommand preserve to git stash. The purpose of this subcommand is to save the current changes into the stash and then immediately re-apply those changes to the working directory. Implementation-wise, this is achieved by adding a new branch to the conditional in the cmd_stash function, where we check if argv[0] is "preserve". If it is, we push_stash with the new argument that we added to it preserve=1. In all other cases we call push_stack/do_push_stack preserve=0 Signed-off-by: Nadav Goldstein <nadav.goldstein96@xxxxxxxxx> --- Add 'preserve' subcommand to 'git stash' In this patch, we introduce a new subcommand preserve to git stash. The purpose of this subcommand is to save the current changes into the stash and then immediately re-apply those changes to the working directory. Implementation-wise, this is achieved by adding a new branch to the conditional in the cmd_stash function, where we check if argv[0] is "preserve". If it is, we push_stash with the new argument that we added to it preserve=1. In all other cases we call push_stack/do_push_stack preserve=0 If the community will approve, I will modify the patch to include help messages for the new subcommand Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1528%2Fnadav96%2Fstash_preserve-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1528/nadav96/stash_preserve-v1 Pull-Request: https://github.com/git/git/pull/1528 builtin/stash.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/builtin/stash.c b/builtin/stash.c index a7e17ffe384..88abf4cc19c 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -1498,7 +1498,7 @@ static int create_stash(int argc, const char **argv, const char *prefix UNUSED) } static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int quiet, - int keep_index, int patch_mode, int include_untracked, int only_staged) + int keep_index, int patch_mode, int include_untracked, int only_staged, int preserve) { int ret = 0; struct stash_info info = STASH_INFO_INIT; @@ -1643,7 +1643,7 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q ret = -1; goto done; } - } else { + } else if (!preserve) { struct child_process cp = CHILD_PROCESS_INIT; cp.git_cmd = 1; /* BUG: this nukes untracked files in the way */ @@ -1709,7 +1709,7 @@ done: } static int push_stash(int argc, const char **argv, const char *prefix, - int push_assumed) + int push_assumed, int preserve) { int force_assume = 0; int keep_index = -1; @@ -1780,14 +1780,19 @@ static int push_stash(int argc, const char **argv, const char *prefix, } ret = do_push_stash(&ps, stash_msg, quiet, keep_index, patch_mode, - include_untracked, only_staged); + include_untracked, only_staged, preserve); clear_pathspec(&ps); return ret; } static int push_stash_unassumed(int argc, const char **argv, const char *prefix) { - return push_stash(argc, argv, prefix, 0); + return push_stash(argc, argv, prefix, 0, 0); +} + +static int preserve_stash(int argc, const char **argv, const char *prefix) +{ + return push_stash(argc, argv, prefix, 0, 1); } static int save_stash(int argc, const char **argv, const char *prefix) @@ -1827,7 +1832,7 @@ static int save_stash(int argc, const char **argv, const char *prefix) memset(&ps, 0, sizeof(ps)); ret = do_push_stash(&ps, stash_msg, quiet, keep_index, - patch_mode, include_untracked, only_staged); + patch_mode, include_untracked, only_staged, 0); strbuf_release(&stash_msg_buf); return ret; @@ -1850,6 +1855,7 @@ int cmd_stash(int argc, const char **argv, const char *prefix) OPT_SUBCOMMAND("store", &fn, store_stash), OPT_SUBCOMMAND("create", &fn, create_stash), OPT_SUBCOMMAND("push", &fn, push_stash_unassumed), + OPT_SUBCOMMAND("preserve", &fn, preserve_stash), OPT_SUBCOMMAND_F("save", &fn, save_stash, PARSE_OPT_NOCOMPLETE), OPT_END() }; @@ -1876,5 +1882,5 @@ int cmd_stash(int argc, const char **argv, const char *prefix) /* Assume 'stash push' */ strvec_push(&args, "push"); strvec_pushv(&args, argv); - return !!push_stash(args.nr, args.v, prefix, 1); + return !!push_stash(args.nr, args.v, prefix, 1, 0); } base-commit: d7d8841f67f29e6ecbad85a11805c907d0f00d5d -- gitgitgadget