diff options
author | Junio C Hamano <gitster@pobox.com> | 2011-07-06 15:37:42 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-07-06 15:37:42 -0700 |
commit | 4d9e42f8f11c57b32b976a943c8ddaf6214e64b8 (patch) | |
tree | f1aee1490288aa30fb62a981696389d9b5e3e992 /exec_cmd.c | |
parent | c5bcf1f9f6d3429ab9a09e07e28362e7d189005b (diff) | |
parent | ea02eef096d4bfcbb83e76cfab0fcb42dbcad35e (diff) | |
download | git-4d9e42f8f11c57b32b976a943c8ddaf6214e64b8.tar.gz |
Merge commit 'v1.6.0' into jc/checkout-reflog-fix
* commit 'v1.6.0': (2063 commits)
GIT 1.6.0
git-p4: chdir now properly sets PWD environment variable in msysGit
Improve error output of git-rebase
t9300: replace '!' with test_must_fail
Git.pm: Make File::Spec and File::Temp requirement lazy
Documentation: document the pager.* configuration setting
git-stash: improve synopsis in help and manual page
Makefile: building git in cygwin 1.7.0
git-am: ignore --binary option
bash-completion: Add non-command git help files to bash-completion
Fix t3700 on filesystems which do not support question marks in names
Utilise our new p4_read_pipe and p4_write_pipe wrappers
Add p4 read_pipe and write_pipe wrappers
bash completion: Add '--merge' long option for 'git log'
bash completion: Add completion for 'git mergetool'
git format-patch documentation: clarify what --cover-letter does
bash completion: 'git apply' should use 'fix' not 'strip'
t5304-prune: adjust file mtime based on system time rather than file mtime
test-parse-options: use appropriate cast in length_callback
Fix escaping of glob special characters in pathspecs
...
Conflicts:
builtin-checkout.c
Diffstat (limited to 'exec_cmd.c')
-rw-r--r-- | exec_cmd.c | 65 |
1 files changed, 39 insertions, 26 deletions
diff --git a/exec_cmd.c b/exec_cmd.c index e189caca62..ce6741eb68 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,34 +78,32 @@ 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) { - struct strbuf cmd; - const char *tmp; + int argc; + const char **nargv; - strbuf_init(&cmd, 0); - strbuf_addf(&cmd, "git-%s", argv[0]); + for (argc = 0; argv[argc]; argc++) + ; /* just counting */ + nargv = xmalloc(sizeof(*nargv) * (argc + 2)); - /* - * argv[0] must be the git command, but the argv array - * belongs to the caller, and may be reused in - * subsequent loop iterations. Save argv[0] and - * restore it on error. - */ - tmp = argv[0]; - argv[0] = cmd.buf; + nargv[0] = "git"; + for (argc = 0; argv[argc]; argc++) + nargv[argc + 1] = argv[argc]; + nargv[argc + 1] = NULL; + return nargv; +} - trace_argv_printf(argv, "trace: exec:"); +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 */ - execvp(cmd.buf, (char **)argv); + execvp("git", (char **)nargv); trace_printf("trace: exec failed: %s\n", strerror(errno)); - argv[0] = tmp; - - strbuf_release(&cmd); - + free(nargv); return -1; } |