changeset 4684:849f011dbf79

Remember path to 'hg' executable and pass to external tools and hooks as $HG.
author Thomas Arendsen Hein <thomas@intevation.de>
date Sat, 23 Jun 2007 20:21:10 +0200
parents 8c3d449ecc63
children b5bbfa18daf7
files mercurial/cmdutil.py mercurial/commands.py mercurial/help.py mercurial/util.py
diffstat 4 files changed, 27 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -20,7 +20,7 @@ class AmbiguousCommand(Exception):
 class ParseError(Exception):
     """Exception raised on errors in parsing the command line."""
 
-def runcatch(ui, args):
+def runcatch(ui, args, argv0=None):
     def catchterm(*args):
         raise util.SignalInterrupt
 
@@ -34,7 +34,7 @@ def runcatch(ui, args):
             if '--debugger' in args:
                 pdb.set_trace()
             try:
-                return dispatch(ui, args)
+                return dispatch(ui, args, argv0=argv0)
             finally:
                 ui.flush()
         except:
@@ -255,7 +255,10 @@ def earlygetopt(aliases, args):
             return args[args.index(opt) + 1]
     return None
 
-def dispatch(ui, args):
+def dispatch(ui, args, argv0=None):
+    # remember how to call 'hg' before changing the working dir
+    util.set_hgexecutable(argv0)
+
     # check for cwd first
     cwd = earlygetopt(['--cwd'], args)
     if cwd:
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -3090,13 +3090,13 @@ norepo = ("clone init version help debug
           " debugindex debugindexdot debugdate debuginstall")
 optionalrepo = ("paths serve showconfig")
 
-def dispatch(args):
+def dispatch(args, argv0=None):
     try:
         u = ui.ui(traceback='--traceback' in args)
     except util.Abort, inst:
         sys.stderr.write(_("abort: %s\n") % inst)
         return -1
-    return cmdutil.runcatch(u, args)
+    return cmdutil.runcatch(u, args, argv0=argv0)
 
 def run():
-    sys.exit(dispatch(sys.argv[1:]))
+    sys.exit(dispatch(sys.argv[1:], argv0=sys.argv[0]))
--- a/mercurial/help.py
+++ b/mercurial/help.py
@@ -37,6 +37,11 @@ helptable = {
 
     'environment|env|Environment Variables':
     r'''
+HG::
+    Path to the 'hg' executable, automatically passed when running hooks
+    or external tools. Falls back to 'hg' if unset and the value can't be
+    autodetected, e.g. when Mercurial is run as a Python module.
+
 HGEDITOR::
     This is the name of the editor to use when committing. Defaults to the
     value of EDITOR.
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -537,6 +537,17 @@ def _matcher(canonroot, cwd, names, inc,
 
     return (roots, match, (inc or exc or anypats) and True)
 
+_hgexecutable = None
+
+def set_hgexecutable(path):
+    """remember location of the 'hg' executable if easily possible
+
+    path might be None or empty if hg was loaded as a module,
+    fall back to 'hg' in this case.
+    """
+    global _hgexecutable
+    _hgexecutable = path and os.path.abspath(path) or 'hg'
+
 def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None):
     '''enhanced shell command execution.
     run with environment maybe modified, maybe in different dir.
@@ -562,6 +573,8 @@ def system(cmd, environ={}, cwd=None, on
     try:
         for k, v in environ.iteritems():
             os.environ[k] = py2shell(v)
+        if 'HG' not in os.environ:
+            os.environ['HG'] = _hgexecutable
         if cwd is not None and oldcwd != cwd:
             os.chdir(cwd)
         rc = os.system(cmd)