* Bad DWIM response when git gui cannot start @ 2009-07-20 12:11 Peter Krefting 2009-07-20 13:45 ` [PATCH] help.c: don't blame an user's typo when the system is at fault Michele Ballabio 0 siblings, 1 reply; 4+ messages in thread From: Peter Krefting @ 2009-07-20 12:11 UTC (permalink / raw) To: Git Mailing List If git cannot start one of the external commands (at least some of them), the DWIM engine is a bit flaky: $ git citool /usr/local/libexec/git-core/git-citool: line 10: exec: wish: not found git: 'citool' is not a git-command. See 'git --help'. Did you mean this? citool $ git gui /usr/local/libexec/git-core/git-gui: line 10: exec: wish: not found git: 'gui' is not a git-command. See 'git --help'. Did you mean this? gui -- \\// Peter - http://www.softwolves.pp.se/ ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH] help.c: don't blame an user's typo when the system is at fault 2009-07-20 12:11 Bad DWIM response when git gui cannot start Peter Krefting @ 2009-07-20 13:45 ` Michele Ballabio 2009-07-20 14:17 ` Thomas Rast 0 siblings, 1 reply; 4+ messages in thread From: Michele Ballabio @ 2009-07-20 13:45 UTC (permalink / raw) To: Peter Krefting; +Cc: Git Mailing List As reported by Peter Krefting: If git cannot start one of the external commands (at least some of them), the DWIM engine is a bit flaky: $ git citool /usr/local/libexec/git-core/git-citool: line 10: exec: wish: not found git: 'citool' is not a git-command. See 'git --help'. Did you mean this? citool Now we check whether the best bet found by levenshtein() differs from the command line or not before proceeding. The new error is: $ git citool /usr/local/libexec/git-core/git-citool: line 10: exec: wish: not found fatal: Failed to run command 'citool': No such file or directory Signed-off-by: Michele Ballabio <barra_cuda@katamail.com> --- Is the call to strerror() useless anyway? help.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/help.c b/help.c index fd87bb5..eec62a3 100644 --- a/help.c +++ b/help.c @@ -325,6 +325,9 @@ const char *help_unknown_cmd(const char *cmd) if (!main_cmds.cnt) die ("Uh oh. Your system reports no Git commands at all."); + if (!strcmp(cmd, main_cmds.names[0]->name)) + die("Failed to run command '%s': %s\n", + cmd, strerror(errno)); best_similarity = main_cmds.names[0]->len; n = 1; -- 1.6.3.1.17.g076c3 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] help.c: don't blame an user's typo when the system is at fault 2009-07-20 13:45 ` [PATCH] help.c: don't blame an user's typo when the system is at fault Michele Ballabio @ 2009-07-20 14:17 ` Thomas Rast 2009-07-20 15:12 ` Jeff King 0 siblings, 1 reply; 4+ messages in thread From: Thomas Rast @ 2009-07-20 14:17 UTC (permalink / raw) To: Michele Ballabio; +Cc: Peter Krefting, Git Mailing List Michele Ballabio wrote: > Is the call to strerror() useless anyway? [...] > + if (!strcmp(cmd, main_cmds.names[0]->name)) > + die("Failed to run command '%s': %s\n", > + cmd, strerror(errno)); The invocation of help_unknown_cmd comes from while (1) { // ... was_alias = run_argv(&argc, &argv); if (errno != ENOENT) break; // ... side branch with an exit() ... if (!done_help) { cmd = argv[0] = help_unknown_cmd(cmd); so errno is always ENOENT when help_unknown_cmd() is called. (Furthermore, the function itself uses git_config() and load_command_list(), both of which _probably_ clobber errno, I don't really have the time for an in-depth check.) It also seems that the 'errno != ENOENT' check was intended to catch the case where the command failed for any reason other than that it does not exist, but this collides with the kernel reporting ENOENT if the _interpreter_ does not exist. Perhaps run_argv should differentiate the case where a command executable exists but cannot be run? [I started writing a reply because I wanted to ask for a conversion to die_errno() in the spirit of d824cbb (Convert existing die(..., strerror(errno)) to die_errno(), 2009-06-27). Please keep that in mind if you put in another die() that mentions errno.] -- Thomas Rast trast@{inf,student}.ethz.ch ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] help.c: don't blame an user's typo when the system is at fault 2009-07-20 14:17 ` Thomas Rast @ 2009-07-20 15:12 ` Jeff King 0 siblings, 0 replies; 4+ messages in thread From: Jeff King @ 2009-07-20 15:12 UTC (permalink / raw) To: Thomas Rast; +Cc: Michele Ballabio, Peter Krefting, Git Mailing List On Mon, Jul 20, 2009 at 04:17:47PM +0200, Thomas Rast wrote: > The invocation of help_unknown_cmd comes from > > while (1) { > // ... > was_alias = run_argv(&argc, &argv); > if (errno != ENOENT) > break; > // ... side branch with an exit() ... > if (!done_help) { > cmd = argv[0] = help_unknown_cmd(cmd); > > so errno is always ENOENT when help_unknown_cmd() is called. > (Furthermore, the function itself uses git_config() and > load_command_list(), both of which _probably_ clobber errno, I don't > really have the time for an in-depth check.) > > It also seems that the 'errno != ENOENT' check was intended to catch > the case where the command failed for any reason other than that it > does not exist, but this collides with the kernel reporting ENOENT if > the _interpreter_ does not exist. Perhaps run_argv should > differentiate the case where a command executable exists but cannot be > run? Yes, I think double-checking the suggested commands list is only half of it; it still says "citool is not a git command" which is wrong. Getting it totally right means differentiating the two ENOENT cases, which I think would require searching the PATH. Something like the patch below should work, though I didn't think terribly long about it, so there might be a corner case that isn't covered, or some easier helper functions for accomplishing this. --- diff --git a/git.c b/git.c index 5da6c65..4e44c98 100644 --- a/git.c +++ b/git.c @@ -3,6 +3,7 @@ #include "cache.h" #include "quote.h" #include "run-command.h" +#include "help.h" const char git_usage_string[] = "git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]"; @@ -449,6 +450,16 @@ static int run_argv(int *argcp, const char ***argv) return done_alias; } +static int command_exists(const char *s) +{ + static struct cmdnames main_cmds, other_cmds; + static int loaded; + if (!loaded) { + load_command_list("git-", &main_cmds, &other_cmds); + loaded = 1; + } + return is_in_cmdlist(&main_cmds, s) || is_in_cmdlist(&other_cmds, s); +} int main(int argc, const char **argv) { @@ -504,7 +515,7 @@ int main(int argc, const char **argv) static int done_help = 0; static int was_alias = 0; was_alias = run_argv(&argc, &argv); - if (errno != ENOENT) + if (errno != ENOENT || command_exists(argv[0])) break; if (was_alias) { fprintf(stderr, "Expansion of alias '%s' failed; " ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2009-07-20 15:12 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-07-20 12:11 Bad DWIM response when git gui cannot start Peter Krefting 2009-07-20 13:45 ` [PATCH] help.c: don't blame an user's typo when the system is at fault Michele Ballabio 2009-07-20 14:17 ` Thomas Rast 2009-07-20 15:12 ` Jeff King
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).