[PATCH] Add 'preserve' subcommand to 'git stash'
From: Nadav Goldstein via GitGitGadget <hidden>
Date: 2023-06-16 11:06:05
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Nadav Goldstein <redacted>
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 <redacted>
---
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