From: "Nadav Goldstein via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Nadav Goldstein <nadav.goldstein96@gmail.com>,
Nadav Goldstein <nadav.goldstein@blazepod.co>
Subject: [PATCH] stash: added safety flag for stash clear subcommand
Date: Sun, 15 May 2022 21:18:57 +0000 [thread overview]
Message-ID: <pull.1232.git.1652649537647.gitgitgadget@gmail.com> (raw)
From: Nadav Goldstein <nadav.goldstein@blazepod.co>
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@blazepod.co>
---
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
next reply other threads:[~2022-05-15 21:19 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-15 21:18 Nadav Goldstein via GitGitGadget [this message]
2022-05-16 3:17 ` [PATCH] stash: added safety flag for stash clear subcommand Junio C Hamano
2022-05-23 6:12 ` [PATCH v2 0/2] stash clear: " Nadav Goldstein via GitGitGadget
2022-05-23 6:12 ` [PATCH v2 1/2] add-menu: added add-menu to lib objects Nadav Goldstein via GitGitGadget
2022-05-23 20:03 ` Derrick Stolee
2022-05-23 20:35 ` Junio C Hamano
2022-05-23 6:12 ` [PATCH v2 2/2] clean: refector to the interactive part of clean Nadav Goldstein via GitGitGadget
2022-05-23 19:45 ` Derrick Stolee
2022-05-23 19:33 ` [PATCH v2 0/2] stash clear: added safety flag for stash clear subcommand Derrick Stolee
2023-06-20 0:03 ` [PATCH v3] Introduced force flag to the git " Nadav Goldstein via GitGitGadget
2023-06-20 6:25 ` Junio C Hamano
2023-06-20 19:54 ` Nadav Goldstein
2023-06-20 20:46 ` Junio C Hamano
2023-06-20 21:01 ` Eric Sunshine
2023-06-20 21:42 ` Nadav Goldstein
-- strict thread matches above, loose matches on Subject: below --
2022-05-18 18:53 [PATCH] stash: added safety flag for " Nadav Goldstein
2022-05-18 20:51 ` Junio C Hamano
2022-05-18 21:05 Nadav Goldstein
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.1232.git.1652649537647.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=nadav.goldstein96@gmail.com \
--cc=nadav.goldstein@blazepod.co \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).