-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Exec git programs without using PATH.
The git suite may not be in PATH (and thus programs such as git-send-pack could not exec git-rev-list). Thus there is a need for logic that will locate these programs. Modifying PATH is not desirable as it result in behavior differing from the user's intentions, as we may end up prepending "/usr/bin" to PATH. - git C programs will use exec*_git_cmd() APIs to exec sub-commands. - exec*_git_cmd() will execute a git program by searching for it in the following directories: 1. --exec-path (as used by "git") 2. The GIT_EXEC_PATH environment variable. 3. $(gitexecdir) as set in Makefile (default value $(bindir)). - git wrapper will modify PATH as before to enable shell scripts to invoke "git-foo" commands. Ideally, shell scripts should use the git wrapper to become independent of PATH, and then modifying PATH will not be necessary. [jc: with minor updates after a brief review.] Signed-off-by: Michal Ostrowski <mostrows@watson.ibm.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
- Loading branch information
Michal Ostrowski
authored and
Junio C Hamano
committed
Jan 14, 2006
1 parent
c884dd9
commit 77cb17e
Showing
12 changed files
with
176 additions
and
62 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
#include "cache.h" | ||
#include "exec_cmd.h" | ||
#define MAX_ARGS 32 | ||
|
||
extern char **environ; | ||
static const char *builtin_exec_path = GIT_EXEC_PATH; | ||
static const char *current_exec_path = NULL; | ||
|
||
void git_set_exec_path(const char *exec_path) | ||
{ | ||
current_exec_path = exec_path; | ||
} | ||
|
||
|
||
/* Returns the highest-priority, location to look for git programs. */ | ||
const char *git_exec_path() | ||
{ | ||
const char *env; | ||
|
||
if (current_exec_path) | ||
return current_exec_path; | ||
|
||
env = getenv("GIT_EXEC_PATH"); | ||
if (env) { | ||
return env; | ||
} | ||
|
||
return builtin_exec_path; | ||
} | ||
|
||
|
||
int execv_git_cmd(char **argv) | ||
{ | ||
char git_command[PATH_MAX + 1]; | ||
char *tmp; | ||
int len, err, i; | ||
const char *paths[] = { current_exec_path, | ||
getenv("GIT_EXEC_PATH"), | ||
builtin_exec_path }; | ||
|
||
for (i = 0; i < sizeof(paths)/sizeof(paths[0]); ++i) { | ||
const char *exec_dir = paths[i]; | ||
if (!exec_dir) continue; | ||
|
||
if (*exec_dir != '/') { | ||
if (!getcwd(git_command, sizeof(git_command))) { | ||
fprintf(stderr, "git: cannot determine " | ||
"current directory\n"); | ||
exit(1); | ||
} | ||
len = strlen(git_command); | ||
|
||
/* Trivial cleanup */ | ||
while (!strncmp(exec_dir, "./", 2)) { | ||
exec_dir += 2; | ||
while (*exec_dir == '/') | ||
exec_dir++; | ||
} | ||
snprintf(git_command + len, sizeof(git_command) - len, | ||
"/%s", exec_dir); | ||
} else { | ||
strcpy(git_command, exec_dir); | ||
} | ||
|
||
len = strlen(git_command); | ||
len += snprintf(git_command + len, sizeof(git_command) - len, | ||
"/git-%s", argv[0]); | ||
|
||
if (sizeof(git_command) <= len) { | ||
fprintf(stderr, | ||
"git: command name given is too long.\n"); | ||
break; | ||
} | ||
|
||
/* argv[0] must be the git command, but the argv array | ||
* belongs to the caller, and my be reused in | ||
* subsequent loop iterations. Save argv[0] and | ||
* restore it on error. | ||
*/ | ||
|
||
tmp = argv[0]; | ||
argv[0] = git_command; | ||
|
||
/* execve() can only ever return if it fails */ | ||
execve(git_command, argv, environ); | ||
|
||
err = errno; | ||
|
||
argv[0] = tmp; | ||
} | ||
return -1; | ||
|
||
} | ||
|
||
|
||
int execl_git_cmd(char *cmd,...) | ||
{ | ||
int argc; | ||
char *argv[MAX_ARGS + 1]; | ||
char *arg; | ||
va_list param; | ||
|
||
va_start(param, cmd); | ||
argv[0] = cmd; | ||
argc = 1; | ||
while (argc < MAX_ARGS) { | ||
arg = argv[argc++] = va_arg(param, char *); | ||
if (!arg) | ||
break; | ||
} | ||
va_end(param); | ||
if (MAX_ARGS <= argc) | ||
return error("too many args to run %s", cmd); | ||
|
||
argv[argc] = NULL; | ||
return execv_git_cmd(argv); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#ifndef __GIT_EXEC_CMD_H_ | ||
#define __GIT_EXEC_CMD_H_ | ||
|
||
extern void git_set_exec_path(const char *exec_path); | ||
extern const char* git_exec_path(void); | ||
extern int execv_git_cmd(char **argv); /* NULL terminated */ | ||
extern int execl_git_cmd(char *cmd, ...); | ||
|
||
|
||
#endif /* __GIT_EXEC_CMD_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.