run-command: treat inaccessible directories as ENOENT
commit38f865c27d1f2560afb48efd2b7b105c1278c4b5
authorJeff King <peff@peff.net>
Fri, 30 Mar 2012 07:52:18 +0000 (30 03:52 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 5 Apr 2012 23:24:13 +0000 (5 16:24 -0700)
tree5b4368c4261b4351a19cb2eec1fe2b01aaa6d0f3
parent1696d72321492c05bebd1e823de0708c13ec7d72
run-command: treat inaccessible directories as ENOENT

When execvp reports EACCES, it can be one of two things:

  1. We found a file to execute, but did not have
     permissions to do so.

  2. We did not have permissions to look in some directory
     in the $PATH.

In the former case, we want to consider this a
permissions problem and report it to the user as such (since
getting this for something like "git foo" is likely a
configuration error).

In the latter case, there is a good chance that the
inaccessible directory does not contain anything of
interest. Reporting "permission denied" is confusing to the
user (and prevents our usual "did you mean...?" lookup). It
also prevents git from trying alias lookup, since we do so
only when an external command does not exist (not when it
exists but has an error).

This patch detects EACCES from execvp, checks whether we are
in case (2), and if so converts errno to ENOENT. This
behavior matches that of "bash" (but not of simpler shells
that use execvp more directly, like "dash").

Test stolen from Junio.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
cache.h
exec_cmd.c
run-command.c
t/t0061-run-command.sh