From: Junio C Hamano Date: Wed, 11 Jan 2006 00:42:44 GMT Subject: Re: [PATCH 2/2] Remember and use GIT_EXEC_PATH on exec()'s Message-ID: <7vd5iz4mt7.fsf@assigned-by-dhcp.cox.net> In-Reply-To: <1136924980.11717.603.camel@brick.watson.ibm.com> Michal Ostrowski writes: > How about searching for executables in the following places, and in this > order: > > 1. --exec-path setting, if any > 2. GIT_EXEC_PATH env var, if set > 3. PATH (never modified) > 4. Value of ${bindir} at build time My preference is to first do this to the Makefile: -- >8 -- diff --git a/Makefile b/Makefile index 5817e86..b1e3055 100644 --- a/Makefile +++ b/Makefile @@ -71,6 +71,7 @@ ALL_LDFLAGS = $(LDFLAGS) prefix = $(HOME) bindir = $(prefix)/bin +gitexecdir = $(prefix)/bin template_dir = $(prefix)/share/git-core/templates/ GIT_PYTHON_DIR = $(prefix)/share/git-core/python # DESTDIR= @@ -144,7 +145,7 @@ PROGRAMS = \ git-describe$X # what 'all' will build and 'install' will install. -ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(SCRIPTS) git$X +ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(SCRIPTS) # Backward compatibility -- to be removed after 1.0 PROGRAMS += git-ssh-pull$X git-ssh-push$X @@ -368,13 +369,13 @@ LIB_OBJS += $(COMPAT_OBJS) export prefix TAR INSTALL DESTDIR SHELL_PATH template_dir ### Build rules -all: $(ALL_PROGRAMS) +all: $(ALL_PROGRAMS) git$X all: $(MAKE) -C templates git$X: git.c $(LIB_FILE) - $(CC) -DGIT_EXEC_PATH='"$(bindir)"' -DGIT_VERSION='"$(GIT_VERSION)"' \ + $(CC) -DGIT_EXEC_PATH='"$(gitexecdir)"' -DGIT_VERSION='"$(GIT_VERSION)"' \ $(CFLAGS) $(COMPAT_CFLAGS) -o $@ $(filter %.c,$^) $(LIB_FILE) $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh @@ -470,7 +471,9 @@ check: install: all $(INSTALL) -d -m755 $(call shellquote,$(DESTDIR)$(bindir)) - $(INSTALL) $(ALL_PROGRAMS) $(call shellquote,$(DESTDIR)$(bindir)) + $(INSTALL) -d -m755 $(call shellquote,$(DESTDIR)$(gitexecdir)) + $(INSTALL) $(ALL_PROGRAMS) $(call shellquote,$(DESTDIR)$(gitexecdir)) + $(INSTALL) git$X $(call shellquote,$(DESTDIR)$(bindir)) $(MAKE) -C templates install $(INSTALL) -d -m755 $(call shellquote,$(DESTDIR)$(GIT_PYTHON_DIR)) $(INSTALL) $(PYMODULES) $(call shellquote,$(DESTDIR)$(GIT_PYTHON_DIR)) -- 8< -- and then make the rule for git things: 1. --exec-path 2. GIT_EXEC_PATH environment 3. $(gitexecdir) in this order. Non git things should just use $PATH without looking at anything else --- as long as a hook script calls a git wrapper (i.e. "git foo" not "git-foo") I think things should work fine. > ... The patch I sent out this morning > attempts to do this. (I'll append again to avoid confusion with > previous patches)... > + if (flags & RUN_GIT_CMD) { > + execv_git_cmd(argv); > + } else { > + execvp(argv[0], (char *const*) argv); > } This bit sounds good, but if you were to go this route I'd suggest to rename your exec_git_cmd() to execl_git_cmd() (and terminate the vararg list with NULL) for naming consistency. execv_git_cmd() is good---we do not *want* execvp_git_cmd(), because we do not run git subcommand using PATH.