Skip to contentSkip to conversation

help.c: help.autocorrect=prompt waits for user action

PATCH Superseded Azeem Bande-Ali via GitGitGadget 5 participants 12 messages Aug 11, 2021 – Sep 8, 2021 Documentation

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 help.c: help.autocorrect=prompt waits for user action

From: Azeem Bande-Ali <[email protected]>

If help.autocorrect is set to 'prompt', the user is prompted before the suggested action is executed.

Based on original patch by David Barr
https://lore.kernel.org/git/[email protected]/

---
New config for help.autocorrect to prompt user before action

Currently the prompt setting will wait X amount of time before taking an action. Adding a new config that will instead prompt the user for a confirmation before taking the action.

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1012%2Fazeemba%2Fautoprompt-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1012/azeemba/autoprompt-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1012

 Documentation/config/help.txt | 20 +++++++++++++-------
 help.c                        | 17 ++++++++++++++++-
 2 files changed, 29 insertions(+), 8 deletions(-)
Documentation/config/help.txt +13 -7
index 783a90a0f93..d36d98dd119 100644
@@ -9,13 +9,19 @@ help.format::
 
 help.autoCorrect::
 	If git detects typos and can identify exactly one valid command similar
-	to the error, git will automatically run the intended command after
-	waiting a duration of time defined by this configuration value in
-	deciseconds (0.1 sec).  If this value is 0, the suggested corrections
-	will be shown, but not executed. If it is a negative integer, or
-	"immediate", the suggested command
-	is run immediately. If "never", suggestions are not shown at all. The
-	default value is zero.
+	to the error, git will try to suggest the correct command or even
+	run the intended command.
+	If this config value is 0, then the suggested command will be shown.
+	If it is positive, the suggested command will automatically
+	run after waiting for that many deciseconds (0.1 sec).
+	If it is "immediate", the suggested command will be
+	run immediately.
+	If it is "prompt", then the user will be shown the
+	suggestion and will be prompted for confirmation before the command
+	is run.
+	If it is "never", then no suggestion will be shown and no command
+	will be run.
+	0 is the default value for this config.
 
 help.htmlPath::
 	Specify the path where the HTML documentation resides. File system paths
help.c +16 -1
index 3c3bdec2135..079156e0421 100644
@@ -11,6 +11,7 @@
 #include "version.h"
 #include "refs.h"
 #include "parse-options.h"
+#include "prompt.h"
 
 struct category_description {
 	uint32_t category;
@@ -472,6 +473,7 @@ int is_in_cmdlist(struct cmdnames *c, const char *s)
 static int autocorrect;
 static struct cmdnames aliases;
 
+#define AUTOCORRECT_PROMPT (-3)
 #define AUTOCORRECT_NEVER (-2)
 #define AUTOCORRECT_IMMEDIATELY (-1)
 
@@ -486,6 +488,8 @@ static int git_unknown_cmd_config(const char *var, const char *value, void *cb)
 			autocorrect = AUTOCORRECT_NEVER;
 		} else if (!strcmp(value, "immediate")) {
 			autocorrect = AUTOCORRECT_IMMEDIATELY;
+		} else if (!strcmp(value, "prompt")) {
+			autocorrect = AUTOCORRECT_PROMPT;
 		} else {
 			int v = git_config_int(var, value);
 			autocorrect = (v < 0)
@@ -618,7 +622,18 @@ const char *help_unknown_cmd(const char *cmd)
 				   _("Continuing under the assumption that "
 				     "you meant '%s'."),
 				   assumed);
-		else {
+		else if (autocorrect == AUTOCORRECT_PROMPT) {
+			if (!isatty(STDIN_FILENO) | !isatty(STDERR_FILENO))
+				exit(1);
+
+			char *answer;
+			fprintf_ln(stderr, _("Assuming you meant: '%s'."),
+				   assumed);
+			answer = git_prompt(_("Continue? (y/N)"), PROMPT_ECHO);
+			if (!(starts_with(answer, "y") ||
+			      starts_with(answer, "Y")))
+				exit(1);
+		} else {
 			fprintf_ln(stderr,
 				   _("Continuing in %0.1f seconds, "
 				     "assuming that you meant '%s'."),

base-commit: 2d755dfac9aadab25c3e025b849252b8c0a61465

Signature · 1 line
gitgitgadget
#1 lore raw
Quoted 12 lines · Azeem Bande-Ali via GitGitGadget

help.autoCorrect::
If git detects typos and can identify exactly one valid command similar

Documentation/config/help.txt +3 -7
-	to the error, git will automatically run the intended command after
-	waiting a duration of time defined by this configuration value in
-	deciseconds (0.1 sec).  If this value is 0, the suggested corrections
-	will be shown, but not executed. If it is a negative integer, or
-	"immediate", the suggested command
-	is run immediately. If "never", suggestions are not shown at all. The
-	default value is zero.
+	to the error, git will try to suggest the correct command or even
+	run the intended command.
+	If this config value is 0, then the suggested command will be shown.

Documentation/config/help.txt help.format:: · line 24

Quoted 10 lines
Documentation/config/help.txt +10 -0
+	If it is positive, the suggested command will automatically
+	run after waiting for that many deciseconds (0.1 sec).
+	If it is "immediate", the suggested command will be
+	run immediately.
+	If it is "prompt", then the user will be shown the
+	suggestion and will be prompted for confirmation before the command
+	is run.
+	If it is "never", then no suggestion will be shown and no command
+	will be run.
+	0 is the default value for this config.

I think it's better to use bullet lists, e.g.:

```
If git detects typos and ...
<skip>
... git will try to suggest the correct command or even run the intended command. Possible values are:
    - 0 (default): show the suggested command
    - positive number: run the suggested command after specified 
deciseconds (0.1 sec).
    - "immediate": run the suggested command immediately
    - "prompt": show the suggestion and prompt for confirmation to run 
the command
    - "never": don't show any suggestions nor run them
```
Signature · 1 line
An old man doll... just what I always wanted! - Clara
#2 lore raw
Quoted 15 lines · Bagas Sanjaya

I think it's better to use bullet lists, e.g.:

```
If git detects typos and ...
<skip>
... git will try to suggest the correct command or even run the intended
command. Possible values are:
     - 0 (default): show the suggested command
     - positive number: run the suggested command after specified
deciseconds (0.1 sec).
     - "immediate": run the suggested command immediately
     - "prompt": show the suggestion and prompt for confirmation to run
the command
     - "never": don't show any suggestions nor run them
```

Thanks for the feedback. I agree the bullets do look much better!

#3 lore raw
In reply to Azeem Bande-Ali via GitGitGadget

Review const char *help_unknown_cmd(const char *cmd) · line 626

Quoted 7 lines
(quoted diff) +2 -1
@@ -618,7 +622,18 @@ const char *help_unknown_cmd(const char *cmd)
 				   _("Continuing under the assumption that "
 				     "you meant '%s'."),
 				   assumed);
-		else {
+		else if (autocorrect == AUTOCORRECT_PROMPT) {
+			if (!isatty(STDIN_FILENO) | !isatty(STDERR_FILENO))

Don't do bitwise or when you only care about boolean outcome.

Review const char *help_unknown_cmd(const char *cmd) · line 627

Quoted 1 line
(quoted diff) +1 -0
+				exit(1);

This is not a new issue, but I think it is probably a bug in the original design of the help-unknown that we do not do this check much early in help_unknown_cmd(), to disable auto-correction in a non-interactive session. If we did so, we do not have to have this check here.

If we cannot yet come to consensus that disabling autocorrection when running non-interactively is a good idea, at least we should be able to do so only for _PROMPT case, like the attached patch at the end.

Review const char *help_unknown_cmd(const char *cmd) · line 628

Quoted 1 line
(quoted diff) +1 -0
+			char *answer;

This is decl-after-statement, but as I am suggesting to get rid of the tty check done inside this block, it will become OK.

Review const char *help_unknown_cmd(const char *cmd) · line 631

Quoted 3 lines
(quoted diff) +3 -0
+			fprintf_ln(stderr, _("Assuming you meant: '%s'."),
+				   assumed);
+			answer = git_prompt(_("Continue? (y/N)"), PROMPT_ECHO);

Hmph, the above does not look WRONG per-se, but I wonder if it is easier for the users to see a single line, e.g.

	struct strbuf msg = STRBUF_INIT;
	strbuf_addf(&msg, _("Run '%s' instead? (y/N)"), assumed);
        answer = git_prompt(msg.buf, PROMPT_ECHO);
        strbuf_release(&msg);

Thanks.

help.c +7 -0
index e22ba1d246..3629cb8796 100644
@@ -540,6 +540,13 @@ const char *help_unknown_cmd(const char *cmd)
 
 	read_early_config(git_unknown_cmd_config, NULL);
 
+	/*
+	 * Disable autocorrection prompt in a non-interactive session
+	 */
+	if ((autocorrect != AUTOCORRECT_PROMPT) &&
+	    (!isatty(0) || !isatty(2)))
+		autocorrect = AUTOCORRECT_NEVER;
+
 	if (autocorrect == AUTOCORRECT_NEVER) {
 		fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
 		exit(1);
#4 lore raw
Quoted 5 lines · Junio C Hamano

If we cannot yet come to consensus that disabling autocorrection when running non-interactively is a good idea, at least we should be able to do so only for _PROMPT case, like the attached patch at the end.

Thanks for the suggestion. I think it makes sense to skip the autocorrection completely when the setting is "prompt" and the user is not running interactively.

Quoted 4 lines

Review

Quoted 3 lines
(quoted diff) +3 -0
+                     fprintf_ln(stderr, _("Assuming you meant: '%s'."),
+                                assumed);
+                     answer = git_prompt(_("Continue? (y/N)"), PROMPT_ECHO);
Quoted 8 lines

Hmph, the above does not look WRONG per-se, but I wonder if it is easier for the users to see a single line, e.g.

        struct strbuf msg = STRBUF_INIT;
        strbuf_addf(&msg, _("Run '%s' instead? (y/N)"), assumed);
        answer = git_prompt(msg.buf, PROMPT_ECHO);
        strbuf_release(&msg);

I looked at the behavior for other settings and they all behave pretty compactly. So I think this suggested solution does fit better.

help.c const char *help_unknown_cmd(const char *cmd) · line 549

Quoted 7 lines
help.c +7 -0
+       /*
+        * Disable autocorrection prompt in a non-interactive session
+        */
+       if ((autocorrect != AUTOCORRECT_PROMPT) &&
+           (!isatty(0) || !isatty(2)))
+               autocorrect = AUTOCORRECT_NEVER;
+

That should be (autocorrect == AUTOCORRECT_PROMPT) right? So we skip the autocorrect if the user is not running interactively and has the "prompt" setting.

Thanks for all the feedback! I will send out a patch incorporating this feedback soon.

#5 lore raw

PATCH v2 1/1 help.c: help.autocorrect=prompt waits for user action

In reply to Azeem Bande-Ali via GitGitGadget

From: Azeem Bande-Ali <[email protected]>

If help.autocorrect is set to 'prompt', the user is prompted before the suggested action is executed.

Based on original patch by David Barr
https://lore.kernel.org/git/[email protected]/

---
New config for help.autocorrect to prompt user before action

Changes since v1:

* Use bullet lists for documenting the various settings now supported by help.autoCorrect
* Add a check for an interactive terminal early to bail if the user has the "prompt" setting
* Make the output more compact so the user can see the suggestion and the prompt in one line.

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1012%2Fazeemba%2Fautoprompt-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1012/azeemba/autoprompt-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1012

Range-diff vs v1:

1: 7f72819b805 ! 1: 5819b872356 help.c: help.autocorrect=prompt waits for user action
@@ Documentation/config/help.txt: help.format::
- is run immediately. If "never", suggestions are not shown at all. The
- default value is zero.
+ to the error, git will try to suggest the correct command or even
-+ run the intended command.
-+ If this config value is 0, then the suggested command will be shown.
-+ If it is positive, the suggested command will automatically
-+ run after waiting for that many deciseconds (0.1 sec).
-+ If it is "immediate", the suggested command will be
-+ run immediately.
-+ If it is "prompt", then the user will be shown the
-+ suggestion and will be prompted for confirmation before the command
-+ is run.
-+ If it is "never", then no suggestion will be shown and no command
-+ will be run.
-+ 0 is the default value for this config.
++ run the suggestion automatically. Possible config values are:
++ - 0 (default): show the suggested command.
++ - positive number: run the suggested command after specified
++deciseconds (0.1 sec).
++ - "immediate": run the suggested command immediately.
++ - "prompt": show the suggestion and prompt for confirmation to run
++the command.
++ - "never": don't run or show any suggested command.

help.htmlPath::
Specify the path where the HTML documentation resides. File system paths
@@ help.c: static int git_unknown_cmd_config(const char *var, const char *value, vo
int v = git_config_int(var, value);
autocorrect = (v < 0)
@@ help.c: const char *help_unknown_cmd(const char *cmd)
+
+ read_early_config(git_unknown_cmd_config, NULL);
+
++ /*
++ * Disable autocorrection prompt in a non-interactive session
++ */
++ if ((autocorrect == AUTOCORRECT_PROMPT) && (!isatty(0) || !isatty(2)))
++ autocorrect = AUTOCORRECT_NEVER;
++
+ if (autocorrect == AUTOCORRECT_NEVER) {
+ fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
+ exit(1);
+@@ help.c: const char *help_unknown_cmd(const char *cmd)
_("Continuing under the assumption that "
"you meant '%s'."),
assumed);
- else {
+ else if (autocorrect == AUTOCORRECT_PROMPT) {
-+ if (!isatty(STDIN_FILENO) | !isatty(STDERR_FILENO))
-+ exit(1);
-+
-+ char *answer;
-+ fprintf_ln(stderr, _("Assuming you meant: '%s'."),
-+ assumed);
-+ answer = git_prompt(_("Continue? (y/N)"), PROMPT_ECHO);
++ 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, "y") ||
+ starts_with(answer, "Y")))
+ exit(1);

 Documentation/config/help.txt | 16 +++++++++-------
 help.c                        | 22 +++++++++++++++++++++-
 2 files changed, 30 insertions(+), 8 deletions(-)
Documentation/config/help.txt +9 -7
index 783a90a0f93..610701f9a37 100644
@@ -9,13 +9,15 @@ help.format::
 
 help.autoCorrect::
 	If git detects typos and can identify exactly one valid command similar
-	to the error, git will automatically run the intended command after
-	waiting a duration of time defined by this configuration value in
-	deciseconds (0.1 sec).  If this value is 0, the suggested corrections
-	will be shown, but not executed. If it is a negative integer, or
-	"immediate", the suggested command
-	is run immediately. If "never", suggestions are not shown at all. The
-	default value is zero.
+	to the error, git will try to suggest the correct command or even
+	run the suggestion automatically. Possible config values are:
+	 - 0 (default): show the suggested command.
+	 - positive number: run the suggested command after specified
+deciseconds (0.1 sec).
+	 - "immediate": run the suggested command immediately.
+	 - "prompt": show the suggestion and prompt for confirmation to run
+the command.
+	 - "never": don't run or show any suggested command.
 
 help.htmlPath::
 	Specify the path where the HTML documentation resides. File system paths
help.c +21 -1
index 3c3bdec2135..22bb05e8e3d 100644
@@ -11,6 +11,7 @@
 #include "version.h"
 #include "refs.h"
 #include "parse-options.h"
+#include "prompt.h"
 
 struct category_description {
 	uint32_t category;
@@ -472,6 +473,7 @@ int is_in_cmdlist(struct cmdnames *c, const char *s)
 static int autocorrect;
 static struct cmdnames aliases;
 
+#define AUTOCORRECT_PROMPT (-3)
 #define AUTOCORRECT_NEVER (-2)
 #define AUTOCORRECT_IMMEDIATELY (-1)
 
@@ -486,6 +488,8 @@ static int git_unknown_cmd_config(const char *var, const char *value, void *cb)
 			autocorrect = AUTOCORRECT_NEVER;
 		} else if (!strcmp(value, "immediate")) {
 			autocorrect = AUTOCORRECT_IMMEDIATELY;
+		} else if (!strcmp(value, "prompt")) {
+			autocorrect = AUTOCORRECT_PROMPT;
 		} else {
 			int v = git_config_int(var, value);
 			autocorrect = (v < 0)
@@ -539,6 +543,12 @@ const char *help_unknown_cmd(const char *cmd)
 
 	read_early_config(git_unknown_cmd_config, NULL);
 
+	/*
+	 * Disable autocorrection prompt in a non-interactive session
+	 */
+	if ((autocorrect == AUTOCORRECT_PROMPT) && (!isatty(0) || !isatty(2)))
+		autocorrect = AUTOCORRECT_NEVER;
+
 	if (autocorrect == AUTOCORRECT_NEVER) {
 		fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
 		exit(1);
@@ -618,7 +628,17 @@ const char *help_unknown_cmd(const char *cmd)
 				   _("Continuing under the assumption that "
 				     "you meant '%s'."),
 				   assumed);
-		else {
+		else if (autocorrect == AUTOCORRECT_PROMPT) {
+			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, "y") ||
+			      starts_with(answer, "Y")))
+				exit(1);
+		} else {
 			fprintf_ln(stderr,
 				   _("Continuing in %0.1f seconds, "
 				     "assuming that you meant '%s'."),

base-commit: 2d755dfac9aadab25c3e025b849252b8c0a61465

Signature · 1 line
gitgitgadget
Reviewed-by on v2 1/1
#6 lore raw
Quoted 8 lines · Azeem Bande-Ali via GitGitGadget

help.autoCorrect::
If git detects typos and can identify exactly one valid command similar

Documentation/config/help.txt +0 -6
-	to the error, git will automatically run the intended command after
-	waiting a duration of time defined by this configuration value in
-	deciseconds (0.1 sec).  If this value is 0, the suggested corrections
-	will be shown, but not executed. If it is a negative integer, or
-	"immediate", the suggested command
-	is run immediately. If "never", suggestions are not shown at all. The

Documentation/config/help.txt help.format:: · line 20

Quoted 10 lines
Documentation/config/help.txt +9 -1
-	default value is zero.
+	to the error, git will try to suggest the correct command or even
+	run the suggestion automatically. Possible config values are:
+	 - 0 (default): show the suggested command.
+	 - positive number: run the suggested command after specified
+deciseconds (0.1 sec).
+	 - "immediate": run the suggested command immediately.
+	 - "prompt": show the suggestion and prompt for confirmation to run
+the command.
+	 - "never": don't run or show any suggested command.

Looks OK.

Signature · 1 line
An old man doll... just what I always wanted! - Clara
#7 lore raw
In reply to Azeem Bande-Ali via GitGitGadget

help.c const char *help_unknown_cmd(const char *cmd) · line 632

Quoted 7 lines · Azeem Bande-Ali via GitGitGadget
help.c +2 -1
@@ -618,7 +628,17 @@ const char *help_unknown_cmd(const char *cmd)
 				   _("Continuing under the assumption that "
 				     "you meant '%s'."),
 				   assumed);
-		else {
+		else if (autocorrect == AUTOCORRECT_PROMPT) {
+			char* answer;

Some people seem to make an asterisk stick to types like this, but in our codebase written in C, an asterisk sticks to the identifier that it makes into a pointer, i.e.

			char *answer;

This is because doing so differently would confuse novices with constructs like this:

			int* a, b;

where only 'a' is a pointer, and 'b' is not.

help.c const char *help_unknown_cmd(const char *cmd) · line 635

Quoted 3 lines
help.c +3 -0
+			struct strbuf msg = STRBUF_INIT;
+			strbuf_addf(&msg, _("Run '%s' instead? (y/N)"),
+				    assumed);

I think these should be kept on a single line for readability, i.e.

			strbuf_addf(&msg, _("Run '%s' instead? (y/N)"), assumed);

as I see a fairly long line after this block already.

	fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);

Other than these cosmetic bits, this round looks good to me, including the documentation update.

Thanks.

#8 lore raw
Quoted 11 lines · Junio C Hamano
Quoted 1 line · Azeem Bande-Ali via GitGitGadget

+ char* answer;

Some people seem to make an asterisk stick to types like this, but in our codebase written in C, an asterisk sticks to the identifier that it makes into a pointer, i.e.

                        char *answer;

Thanks! Will fix. I appreciate you providing the motivation for the policy as well!

Quoted 11 lines

help.c const char *help_unknown_cmd(const char *cmd) · line 635

Quoted 3 lines
help.c +3 -0
+                     struct strbuf msg = STRBUF_INIT;
+                     strbuf_addf(&msg, _("Run '%s' instead? (y/N)"),
+                                 assumed);

I think these should be kept on a single line for readability, i.e.

                        strbuf_addf(&msg, _("Run '%s' instead? (y/N)"), assumed);

as I see a fairly long line after this block already.

        fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);

The line split was done by clang-format via make style. Is it okay to ignore the clang-format recommendation?
(Incidentally make style would have also caught the first issue, I seem to have not run it after
making a change in that line.)

Quoted 2 lines

Other than these cosmetic bits, this round looks good to me, including the documentation update.

Great thanks! This is my first patch so I just wanted to confirm:
should I add a "Reviewed-by:"
line to the commit with your name as well?

#9 lore raw
In reply to Junio C Hamano

Hi,

Quoted 23 lines · Junio C Hamano

help.c const char *help_unknown_cmd(const char *cmd) · line 632

Quoted 7 lines · Azeem Bande-Ali via GitGitGadget
help.c +2 -1
@@ -618,7 +628,17 @@ const char *help_unknown_cmd(const char *cmd)
 				   _("Continuing under the assumption that "
 				     "you meant '%s'."),
 				   assumed);
-		else {
+		else if (autocorrect == AUTOCORRECT_PROMPT) {
+			char* answer;

Some people seem to make an asterisk stick to types like this, but in our codebase written in C, an asterisk sticks to the identifier that it makes into a pointer, i.e.

			char *answer;

This is because doing so differently would confuse novices with constructs like this:

			int* a, b;

where only 'a' is a pointer, and 'b' is not.

Quoted 7 lines

help.c const char *help_unknown_cmd(const char *cmd) · line 635

Quoted 3 lines
help.c +3 -0
+			struct strbuf msg = STRBUF_INIT;
+			strbuf_addf(&msg, _("Run '%s' instead? (y/N)"),
+				    assumed);

I think these should be kept on a single line for readability, i.e.

			strbuf_addf(&msg, _("Run '%s' instead? (y/N)"), assumed);

It might even make sense to use the xstrfmt() function instead:

			char *msg = xstrfmt(_("Run '%s' instead? (y/N)"), assumed);
			[...]
			free(msg);

Ciao,
Dscho

#10 lore raw

PATCH v3 1/1 help.c: help.autocorrect=prompt waits for user action

In reply to Azeem Bande-Ali via GitGitGadget

From: Azeem Bande-Ali <[email protected]>

If help.autocorrect is set to 'prompt', the user is prompted before the suggested action is executed.

Based on original patch by David Barr
https://lore.kernel.org/git/[email protected]/

---
New config for help.autocorrect to prompt user before action

Only minor style changes have been made since v2:

* Moved * to variable name instead of the type name
* Keep code in the same line for readability

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1012%2Fazeemba%2Fautoprompt-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1012/azeemba/autoprompt-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/1012

Range-diff vs v2:

1: 5819b872356 ! 1: f3f38f0d141 help.c: help.autocorrect=prompt waits for user action

     @@ Commit message
          Based on original patch by David Barr
          https://lore.kernel.org/git/[email protected]/
      
     +    Reviewed-by: Bagas Sanjaya <[email protected]>
          Signed-off-by: Azeem Bande-Ali <[email protected]>
      
       ## Documentation/config/help.txt ##
     @@ help.c: const char *help_unknown_cmd(const char *cmd)
       				   assumed);
      -		else {
      +		else if (autocorrect == AUTOCORRECT_PROMPT) {
     -+			char* answer;
     ++			char *answer;
      +			struct strbuf msg = STRBUF_INIT;
     -+			strbuf_addf(&msg, _("Run '%s' instead? (y/N)"),
     -+				    assumed);
     ++			strbuf_addf(&msg, _("Run '%s' instead? (y/N)"), assumed);
      +			answer = git_prompt(msg.buf, PROMPT_ECHO);
      +			strbuf_release(&msg);
      +			if (!(starts_with(answer, "y") ||
 Documentation/config/help.txt | 16 +++++++++-------
 help.c                        | 21 ++++++++++++++++++++-
 2 files changed, 29 insertions(+), 8 deletions(-)
Documentation/config/help.txt +9 -7
index 783a90a0f93..610701f9a37 100644
@@ -9,13 +9,15 @@ help.format::
 
 help.autoCorrect::
 	If git detects typos and can identify exactly one valid command similar
-	to the error, git will automatically run the intended command after
-	waiting a duration of time defined by this configuration value in
-	deciseconds (0.1 sec).  If this value is 0, the suggested corrections
-	will be shown, but not executed. If it is a negative integer, or
-	"immediate", the suggested command
-	is run immediately. If "never", suggestions are not shown at all. The
-	default value is zero.
+	to the error, git will try to suggest the correct command or even
+	run the suggestion automatically. Possible config values are:
+	 - 0 (default): show the suggested command.
+	 - positive number: run the suggested command after specified
+deciseconds (0.1 sec).
+	 - "immediate": run the suggested command immediately.
+	 - "prompt": show the suggestion and prompt for confirmation to run
+the command.
+	 - "never": don't run or show any suggested command.
 
 help.htmlPath::
 	Specify the path where the HTML documentation resides. File system paths
help.c +20 -1
index 3c3bdec2135..be2fa642415 100644
@@ -11,6 +11,7 @@
 #include "version.h"
 #include "refs.h"
 #include "parse-options.h"
+#include "prompt.h"
 
 struct category_description {
 	uint32_t category;
@@ -472,6 +473,7 @@ int is_in_cmdlist(struct cmdnames *c, const char *s)
 static int autocorrect;
 static struct cmdnames aliases;
 
+#define AUTOCORRECT_PROMPT (-3)
 #define AUTOCORRECT_NEVER (-2)
 #define AUTOCORRECT_IMMEDIATELY (-1)
 
@@ -486,6 +488,8 @@ static int git_unknown_cmd_config(const char *var, const char *value, void *cb)
 			autocorrect = AUTOCORRECT_NEVER;
 		} else if (!strcmp(value, "immediate")) {
 			autocorrect = AUTOCORRECT_IMMEDIATELY;
+		} else if (!strcmp(value, "prompt")) {
+			autocorrect = AUTOCORRECT_PROMPT;
 		} else {
 			int v = git_config_int(var, value);
 			autocorrect = (v < 0)
@@ -539,6 +543,12 @@ const char *help_unknown_cmd(const char *cmd)
 
 	read_early_config(git_unknown_cmd_config, NULL);
 
+	/*
+	 * Disable autocorrection prompt in a non-interactive session
+	 */
+	if ((autocorrect == AUTOCORRECT_PROMPT) && (!isatty(0) || !isatty(2)))
+		autocorrect = AUTOCORRECT_NEVER;
+
 	if (autocorrect == AUTOCORRECT_NEVER) {
 		fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd);
 		exit(1);
@@ -618,7 +628,16 @@ const char *help_unknown_cmd(const char *cmd)
 				   _("Continuing under the assumption that "
 				     "you meant '%s'."),
 				   assumed);
-		else {
+		else if (autocorrect == AUTOCORRECT_PROMPT) {
+			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, "y") ||
+			      starts_with(answer, "Y")))
+				exit(1);
+		} else {
 			fprintf_ln(stderr,
 				   _("Continuing in %0.1f seconds, "
 				     "assuming that you meant '%s'."),

base-commit: 2d755dfac9aadab25c3e025b849252b8c0a61465

Signature · 1 line
gitgitgadget
#11 lore raw
Quoted 10 lines · Azeem Bande-Ali via GitGitGadget

From: Azeem Bande-Ali <[email protected]>

If help.autocorrect is set to 'prompt', the user is prompted before the suggested action is executed.

Based on original patch by David Barr
https://lore.kernel.org/git/[email protected]/

Quoted 7 lines

---
New config for help.autocorrect to prompt user before action

Only minor style changes have been made since v2:

* Moved * to variable name instead of the type name
* Keep code in the same line for readability

I didn't see anybody comment on this round (and do not think I saw anything glaringly wrong).

Is everybody happy with this version? I am about to mark it for 'next' in the next issue of "What's cooking" report, so please holler if I should wait.

Thanks.