X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=exec_cmd.c;h=ce6741eb682b59ad638c7bee6ca31e2fcd53f281;hb=dd718365cccfddd7d5992a40296de50e7cabdfc8;hp=0f8f4b5b7d9dea4458b9944dd81cf98c2e9a1322;hpb=9d54ea6760cc4d7ee526d12cd00218bf19b79bf5;p=git.git diff --git a/exec_cmd.c b/exec_cmd.c index 0f8f4b5b7..ce6741eb6 100644 --- a/exec_cmd.c +++ b/exec_cmd.c @@ -4,8 +4,23 @@ #define MAX_ARGS 32 extern char **environ; -static const char *builtin_exec_path = GIT_EXEC_PATH; static const char *argv_exec_path; +static const char *argv0_path; + +const char *system_path(const char *path) +{ + if (!is_absolute_path(path) && argv0_path) { + struct strbuf d = STRBUF_INIT; + strbuf_addf(&d, "%s/%s", argv0_path, path); + path = strbuf_detach(&d, NULL); + } + return path; +} + +void git_set_argv0_path(const char *path) +{ + argv0_path = path; +} void git_set_argv_exec_path(const char *exec_path) { @@ -26,7 +41,7 @@ const char *git_exec_path(void) return env; } - return builtin_exec_path; + return system_path(GIT_EXEC_PATH); } static void add_path(struct strbuf *out, const char *path) @@ -35,13 +50,13 @@ static void add_path(struct strbuf *out, const char *path) if (is_absolute_path(path)) strbuf_addstr(out, path); else - strbuf_addstr(out, make_absolute_path(path)); + strbuf_addstr(out, make_nonrelative_path(path)); - strbuf_addch(out, ':'); + strbuf_addch(out, PATH_SEP); } } -void setup_path(const char *cmd_path) +void setup_path(void) { const char *old_path = getenv("PATH"); struct strbuf new_path; @@ -50,8 +65,8 @@ void setup_path(const char *cmd_path) add_path(&new_path, argv_exec_path); add_path(&new_path, getenv(EXEC_PATH_ENVIRONMENT)); - add_path(&new_path, builtin_exec_path); - add_path(&new_path, cmd_path); + add_path(&new_path, system_path(GIT_EXEC_PATH)); + add_path(&new_path, argv0_path); if (old_path) strbuf_addstr(&new_path, old_path); @@ -63,7 +78,7 @@ void setup_path(const char *cmd_path) strbuf_release(&new_path); } -int execv_git_cmd(const char **argv) +const char **prepare_git_cmd(const char **argv) { int argc; const char **nargv; @@ -76,6 +91,11 @@ int execv_git_cmd(const char **argv) for (argc = 0; argv[argc]; argc++) nargv[argc + 1] = argv[argc]; nargv[argc + 1] = NULL; + return nargv; +} + +int execv_git_cmd(const char **argv) { + const char **nargv = prepare_git_cmd(argv); trace_argv_printf(nargv, "trace: exec:"); /* execvp() can only ever return if it fails */