From: Nadav Goldstein <nadav.goldstein@xxxxxxxxxxx> Introduced a flag (git stash clear -i) when when used, instead of silently clearing the stash, will present a confirmation to the user regarding the action which he's about to perform. Took the inspiration from rm -rf -i flag. This flag also outputs extra logs (abort/success) to let the user know more "interactively" what is happening with the stash (hence the flag name). Signed-off-by: Nadav Goldstein <nadav.goldstein@xxxxxxxxxxx> --- stash clear: added safety flag for stash clear subcommand Added a flag to git stash clear (-i|--interactive), which prompts the user to confirm he indeed wants to clear the stash, otherwise it will abort. I found it useful as a frequent stash clear user which means my terminal always have it in recent commands, which could mean accidental erase of work. This flag ensures accidental fires won't clear hard work :) I also thought it would be better to do it opt in, to not change the way the command works in prod, only add to it. Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1232%2Fnadav96%2Fclear-stash-prompt-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1232/nadav96/clear-stash-prompt-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/1232 Documentation/git-stash.txt | 9 +++++++-- builtin/stash.c | 21 +++++++++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt index 6e15f475257..a7ab5379779 100644 --- a/Documentation/git-stash.txt +++ b/Documentation/git-stash.txt @@ -17,7 +17,7 @@ SYNOPSIS [-u|--include-untracked] [-a|--all] [-m|--message <message>] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>...]] -'git stash' clear +'git stash' clear [-i|--interactive] 'git stash' create [<message>] 'git stash' store [-m|--message <message>] [-q|--quiet] <commit> @@ -127,7 +127,7 @@ the stash entry is applied on top of the commit that was HEAD at the time `git stash` was run, it restores the originally stashed state with no conflicts. -clear:: +clear [-i|--interactive]:: Remove all the stash entries. Note that those entries will then be subject to pruning, and may be impossible to recover (see 'Examples' below for a possible strategy). @@ -160,6 +160,11 @@ OPTIONS All ignored and untracked files are also stashed and then cleaned up with `git clean`. +-i:: +--interactive:: + This option is only valid for clear command, when applied, will request + a confirmation from the user before proceeding to clear the stash. + -u:: --include-untracked:: --no-include-untracked:: diff --git a/builtin/stash.c b/builtin/stash.c index 0c7b6a95882..b012d24ef38 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -26,7 +26,7 @@ static const char * const git_stash_usage[] = { N_("git stash drop [-q|--quiet] [<stash>]"), N_("git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]"), N_("git stash branch <branchname> [<stash>]"), - "git stash clear", + "git stash clear [-i|--interactive]", N_("git stash [push [-p|--patch] [-S|--staged] [-k|--[no-]keep-index] [-q|--quiet]\n" " [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n" " [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" @@ -67,7 +67,7 @@ static const char * const git_stash_branch_usage[] = { }; static const char * const git_stash_clear_usage[] = { - "git stash clear", + "git stash clear [-i|--interactive]", NULL }; @@ -215,7 +215,10 @@ static int do_clear_stash(void) static int clear_stash(int argc, const char **argv, const char *prefix) { + int is_prompt; struct option options[] = { + OPT_BOOL('i', "interactive", &is_prompt, + N_("confirm clearing stash")), OPT_END() }; @@ -226,7 +229,21 @@ static int clear_stash(int argc, const char **argv, const char *prefix) if (argc) return error(_("git stash clear with arguments is " "unimplemented")); + if (is_prompt == 1) { + char code[2]; + printf("Are you sure you want to clear your stash? [y/N]: "); + if (fgets(code, 2, stdin) != NULL) { + if (code[0] == 'y' || code[0] == 'Y') { + printf_ln(_("Clearing stash")); + return do_clear_stash(); + } + else { + printf_ln(_("Aborting clear")); + } + } + return 0; + } return do_clear_stash(); } base-commit: e8005e4871f130c4e402ddca2032c111252f070a -- gitgitgadget