git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Thomas Rast <trast@student.ethz.ch>
Cc: Michele Ballabio <barra_cuda@katamail.com>,
	Peter Krefting <peter@softwolves.pp.se>,
	Git Mailing List <git@vger.kernel.org>
Subject: Re: [PATCH] help.c: don't blame an user's typo when the system is at fault
Date: Mon, 20 Jul 2009 11:12:17 -0400	[thread overview]
Message-ID: <20090720151217.GA5347@coredump.intra.peff.net> (raw)
In-Reply-To: <200907201617.48168.trast@student.ethz.ch>

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; "

      reply	other threads:[~2009-07-20 15:12 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 message]

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=20090720151217.GA5347@coredump.intra.peff.net \
    --to=peff@peff.net \
    --cc=barra_cuda@katamail.com \
    --cc=git@vger.kernel.org \
    --cc=peter@softwolves.pp.se \
    --cc=trast@student.ethz.ch \
    /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).