diff options
author | Junio C Hamano <gitster@pobox.com> | 2012-07-31 12:51:30 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-07-31 12:51:30 -0700 |
commit | a78550831a42db6896e598cd2a8bfb441a958fc8 (patch) | |
tree | 0d71fe45ad75a9cdf32a18a65b2dad40fe651d69 | |
parent | 38f865c27d1f2560afb48efd2b7b105c1278c4b5 (diff) | |
download | git-a78550831a42db6896e598cd2a8bfb441a958fc8.tar.gz |
sane_execvp(): ignore non-directory on $PATH
When you have a non-directory on your PATH, a funny thing happens:
$ PATH=$PATH:/bin/sh git foo
fatal: cannot exec 'git-foo': Not a directory?
Worse yet, as real commands always take precedence over aliases,
this behaviour interacts rather badly with them:
$ PATH=$PATH:/bin/sh git -c alias.foo=show git foo -s
fatal: cannot exec 'git-foo': Not a directory?
This is because an ENOTDIR error from the underlying execvp(2) is
reported back to the caller of our sane_execvp() wrapper as-is.
Translating it to ENOENT, just like the case where we _might_ have
the command in an unreadable directory, fixes it. Without an alias,
we would get
git: 'foo' is not a git command. See 'git --help'.
and we use the 'foo' alias when it is available, of course.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | run-command.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/run-command.c b/run-command.c index 805d41f93d..f9b7db2385 100644 --- a/run-command.c +++ b/run-command.c @@ -77,6 +77,8 @@ int sane_execvp(const char *file, char * const argv[]) */ if (errno == EACCES && !strchr(file, '/')) errno = exists_in_PATH(file) ? EACCES : ENOENT; + else if (errno == ENOTDIR && !strchr(file, '/')) + errno = ENOENT; return -1; } |