зеркало из https://github.com/microsoft/git.git
Merge branch 'hv/mingw-help-is-executable'
"git help" enumerates executable files in $PATH; the implementation of "is this file executable?" on Windows has been optimized. * hv/mingw-help-is-executable: help: improve is_executable() on Windows
This commit is contained in:
Коммит
ce050477fb
21
help.c
21
help.c
|
@ -105,7 +105,22 @@ static int is_executable(const char *name)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#if defined(GIT_WINDOWS_NATIVE)
|
#if defined(GIT_WINDOWS_NATIVE)
|
||||||
{ /* cannot trust the executable bit, peek into the file instead */
|
/*
|
||||||
|
* On Windows there is no executable bit. The file extension
|
||||||
|
* indicates whether it can be run as an executable, and Git
|
||||||
|
* has special-handling to detect scripts and launch them
|
||||||
|
* through the indicated script interpreter. We test for the
|
||||||
|
* file extension first because virus scanners may make
|
||||||
|
* it quite expensive to open many files.
|
||||||
|
*/
|
||||||
|
if (ends_with(name, ".exe"))
|
||||||
|
return S_IXUSR;
|
||||||
|
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Now that we know it does not have an executable extension,
|
||||||
|
* peek into the file instead.
|
||||||
|
*/
|
||||||
char buf[3] = { 0 };
|
char buf[3] = { 0 };
|
||||||
int n;
|
int n;
|
||||||
int fd = open(name, O_RDONLY);
|
int fd = open(name, O_RDONLY);
|
||||||
|
@ -113,8 +128,8 @@ static int is_executable(const char *name)
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
n = read(fd, buf, 2);
|
n = read(fd, buf, 2);
|
||||||
if (n == 2)
|
if (n == 2)
|
||||||
/* DOS executables start with "MZ" */
|
/* look for a she-bang */
|
||||||
if (!strcmp(buf, "#!") || !strcmp(buf, "MZ"))
|
if (!strcmp(buf, "#!"))
|
||||||
st.st_mode |= S_IXUSR;
|
st.st_mode |= S_IXUSR;
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче