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

Signed-off-by: Nadav Goldstein <nadav.goldstein96@gmail.com>
This commit is contained in:
Nadav Goldstein 2023-06-16 13:17:23 +03:00
parent d7d8841f67
commit bcdb6cf977

View file

@ -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 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q
}
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);
}