diff mbox series

help: add prompt-yes setting for autocorrect

Message ID pull.1852.git.1736933815236.gitgitgadget@gmail.com (mailing list archive)
State New
Headers show
Series help: add prompt-yes setting for autocorrect | expand

Commit Message

Chris Howlett Jan. 15, 2025, 9:36 a.m. UTC
From: Chris Howlett <chowlett09@gmail.com>

The help.autocorrect functionality is really useful, saving frustration
when a dev fat-fingers a command, and git has a pretty good idea what
was originally intended. The config settings are a nice selection, with
"prompt" asking the user to confirm that they want to run the assumed
command.

However, with "prompt", the choice defaults to "No" - that is, hitting
return will _not_ run the command. For me at least, if git is confident
it knows which command I wanted, it's usually right, and the golden path
would be to run the command.

Therefore this patch adds "prompt-yes" as a counterpart config setting
for help.autocorrect, which does the same as "prompt", but defaults to
"Yes" - hitting return will run the assumed command.

I have not added any tests because the test suite doesn't have any tests
(that I could find) for the "prompt" behaviour - I'm assuming this is
because it's hard/impossible to simulate the interactive terminal prompt

Signed-off-by: Chris Howlett <chowlett09@gmail.com>
---
    Add prompt-yes config setting for help.autocorrect
    
    This is my first patch request to git - please do let me know if I
    should be doing something differently!

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1852%2Fasilano%2Fautocorrect-allow-prompt-default-yes-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1852/asilano/autocorrect-allow-prompt-default-yes-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1852

 Documentation/config/help.txt |  4 +++-
 help.c                        | 15 +++++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)


base-commit: fbe8d3079d4a96aeb4e4529cc93cc0043b759a05

Comments

Kristoffer Haugsbakk Jan. 15, 2025, 9:51 a.m. UTC | #1
On Wed, Jan 15, 2025, at 10:36, Chris Howlett via GitGitGadget wrote:
> From: Chris Howlett <chowlett09@gmail.com>
>
> The help.autocorrect functionality is really useful, saving frustration
> when a dev fat-fingers a command, and git has a pretty good idea what
> was originally intended. The config settings are a nice selection, with
> "prompt" asking the user to confirm that they want to run the assumed
> command.
>
> However, with "prompt", the choice defaults to "No" - that is, hitting
> return will _not_ run the command. For me at least, if git is confident
> it knows which command I wanted, it's usually right, and the golden path
> would be to run the command.
>
> Therefore this patch adds "prompt-yes" as a counterpart config setting
> for help.autocorrect, which does the same as "prompt", but defaults to
> "Yes" - hitting return will run the assumed command.
>
> I have not added any tests because the test suite doesn't have any tests
> (that I could find) for the "prompt" behaviour - I'm assuming this is
> because it's hard/impossible to simulate the interactive terminal prompt
>
> Signed-off-by: Chris Howlett <chowlett09@gmail.com>

This seems to conflict with the patch “help: interpret boolean string
values for help.autocorrect” which is in `seen`.  The latest version (I
don’t know what version is applied right now):

https://lore.kernel.org/git/pull.1869.v4.git.git.1736760824201.gitgitgadget@gmail.com/
Chris Howlett Jan. 15, 2025, 10:21 a.m. UTC | #2
On Wed, 15 Jan 2025 at 09:51, Kristoffer Haugsbakk
<kristofferhaugsbakk@fastmail.com> wrote:
>
> On Wed, Jan 15, 2025, at 10:36, Chris Howlett via GitGitGadget wrote:
> > From: Chris Howlett <chowlett09@gmail.com>
> >
> > The help.autocorrect functionality is really useful, saving frustration
> > when a dev fat-fingers a command, and git has a pretty good idea what
> > was originally intended. The config settings are a nice selection, with
> > "prompt" asking the user to confirm that they want to run the assumed
> > command.
> >
> > However, with "prompt", the choice defaults to "No" - that is, hitting
> > return will _not_ run the command. For me at least, if git is confident
> > it knows which command I wanted, it's usually right, and the golden path
> > would be to run the command.
> >
> > Therefore this patch adds "prompt-yes" as a counterpart config setting
> > for help.autocorrect, which does the same as "prompt", but defaults to
> > "Yes" - hitting return will run the assumed command.
> >
> > I have not added any tests because the test suite doesn't have any tests
> > (that I could find) for the "prompt" behaviour - I'm assuming this is
> > because it's hard/impossible to simulate the interactive terminal prompt
> >
> > Signed-off-by: Chris Howlett <chowlett09@gmail.com>
>
> This seems to conflict with the patch “help: interpret boolean string
> values for help.autocorrect” which is in `seen`.  The latest version (I
> don’t know what version is applied right now):
>
> https://lore.kernel.org/git/pull.1869.v4.git.git.1736760824201.gitgitgadget@gmail.com/

That's unsurprising, as I was inspired to add this option after
reading that committer's blog post on help.autocorrect -
https://blog.gitbutler.com/why-is-git-autocorrect-too-fast-for-formula-one-drivers/

I'm happy to wait for their patch to be merged, then rebase and rework
against it, if that seems the most sensible option? Presumably I'll
have to monitor the mailing list to learn when that happens? This is
my first patch to git, so I'm not sure of process.
Kristoffer Haugsbakk Jan. 15, 2025, 5:40 p.m. UTC | #3
On Wed, Jan 15, 2025, at 11:21, Chris Howlett wrote:
> On Wed, 15 Jan 2025 at 09:51, Kristoffer Haugsbakk
> > [snip]
>
> That's unsurprising, as I was inspired to add this option after
> reading that committer's blog post on help.autocorrect -
> https://blog.gitbutler.com/why-is-git-autocorrect-too-fast-for-formula-one-drivers/
>
> I'm happy to wait for their patch to be merged, then rebase and rework
> against it, if that seems the most sensible option? Presumably I'll
> have to monitor the mailing list to learn when that happens? This is
> my first patch to git, so I'm not sure of process.

You can keep an eye on the “What's cooking” emails.[1]  The latest
one mentions this other topic as branch `sc/help-autocorrect-one`
(that’s Scott Chacon’s initals followed by the topic name).

If you want to wait for that one to get merged:

• Wait until you see such an email with this “status” under it:

       Will merge to 'master'.

  Which means that it will be merged to `master` soon.

(Or maybe run

    git branch --remote --contains=origin/sc/help-autocorrect-one \
    | grep master

from time to time (I don’t know, I’ve never had to do that).)

Or else you could build on top of it.  That’s more advanced though.
Not something I’ve done myself.[2]

† 1: Latest: https://lore.kernel.org/git/xmqqzfjt2qye.fsf@gitster.g/
† 2: See `Documentation/SubmittingPatches under “select few topic
    branches that are” for how to depend on in-flight topics
diff mbox series

Patch

diff --git a/Documentation/config/help.txt b/Documentation/config/help.txt
index 610701f9a37..50ce57892cb 100644
--- a/Documentation/config/help.txt
+++ b/Documentation/config/help.txt
@@ -16,7 +16,9 @@  help.autoCorrect::
 deciseconds (0.1 sec).
 	 - "immediate": run the suggested command immediately.
 	 - "prompt": show the suggestion and prompt for confirmation to run
-the command.
+the command. The default choice at the prompt is "No"
+	 - "prompt-yes": show the suggestion and prompt for confirmation to run
+the command. The default choice at the prompt is "Yes"
 	 - "never": don't run or show any suggested command.
 
 help.htmlPath::
diff --git a/help.c b/help.c
index 5483ea8fd29..6a28011cb50 100644
--- a/help.c
+++ b/help.c
@@ -552,6 +552,7 @@  struct help_unknown_cmd_config {
 	struct cmdnames aliases;
 };
 
+#define AUTOCORRECT_PROMPT_YES (-4)
 #define AUTOCORRECT_PROMPT (-3)
 #define AUTOCORRECT_NEVER (-2)
 #define AUTOCORRECT_IMMEDIATELY (-1)
@@ -572,6 +573,8 @@  static int git_unknown_cmd_config(const char *var, const char *value,
 			cfg->autocorrect = AUTOCORRECT_IMMEDIATELY;
 		} else if (!strcmp(value, "prompt")) {
 			cfg->autocorrect = AUTOCORRECT_PROMPT;
+		} else if (!strcmp(value, "prompt-yes")) {
+			cfg->autocorrect = AUTOCORRECT_PROMPT_YES;
 		} else {
 			int v = git_config_int(var, value, ctx->kvi);
 			cfg->autocorrect = (v < 0)
@@ -629,6 +632,9 @@  char *help_unknown_cmd(const char *cmd)
 	if ((cfg.autocorrect == AUTOCORRECT_PROMPT) && (!isatty(0) || !isatty(2)))
 		cfg.autocorrect = AUTOCORRECT_NEVER;
 
+	if ((cfg.autocorrect == AUTOCORRECT_PROMPT_YES) && (!isatty(0) || !isatty(2)))
+		cfg.autocorrect = AUTOCORRECT_IMMEDIATELY;
+
 	if (cfg.autocorrect == AUTOCORRECT_NEVER) {
 		fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
 		exit(1);
@@ -716,6 +722,15 @@  char *help_unknown_cmd(const char *cmd)
 			if (!(starts_with(answer, "y") ||
 			      starts_with(answer, "Y")))
 				exit(1);
+		} else if (cfg.autocorrect == AUTOCORRECT_PROMPT_YES) {
+			char *answer;
+			struct strbuf msg = STRBUF_INIT;
+			strbuf_addf(&msg, _("Run '%s' instead [Y/n]? "), assumed);
+			answer = git_prompt(msg.buf, PROMPT_ECHO);
+			strbuf_release(&msg);
+			if (starts_with(answer, "n") ||
+			      starts_with(answer, "N"))
+				exit(1);
 		} else {
 			fprintf_ln(stderr,
 				   _("Continuing in %0.1f seconds, "