changeset 5067:3d35c8cb5eb4

Simplify/correct finding the hg executable (fixes issue644) Simply use find_exe('hg') as the default value for $HG and require to manually set it if you have special requirements. While the default will not always be 100% correct (i.e. the identical hg version) for many users it is and for the others the hg executable found in the PATH should do most things correctly. Developers or other users with multiple installs can set $HG or run something like util.set_hgexecutable in their shell or python scripts. Additionally util.hgexecutable() is now available so extensions can access the value with a public interface, too.
author Thomas Arendsen Hein <thomas@intevation.de>
date Sat, 04 Aug 2007 22:25:12 +0200
parents a49f2a4d5ff7
children d5126a0172ba 142a07e758c8
files mercurial/cmdutil.py mercurial/commands.py mercurial/help.py mercurial/util.py
diffstat 4 files changed, 22 insertions(+), 22 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, argv0=None):
+def runcatch(ui, args):
     def catchterm(*args):
         raise util.SignalInterrupt
 
@@ -34,7 +34,7 @@ def runcatch(ui, args, argv0=None):
             if '--debugger' in args:
                 pdb.set_trace()
             try:
-                return dispatch(ui, args, argv0=argv0)
+                return dispatch(ui, args)
             finally:
                 ui.flush()
         except:
@@ -276,10 +276,7 @@ def earlygetopt(aliases, args):
             pos += 1
     return values
 
-def dispatch(ui, args, argv0=None):
-    # remember how to call 'hg' before changing the working dir
-    util.set_hgexecutable(argv0)
-
+def dispatch(ui, args):
     # read --config before doing anything else
     # (e.g. to change trust settings for reading .hg/hgrc)
     config = earlygetopt(['--config'], args)
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -3130,13 +3130,13 @@ norepo = ("clone init version help debug
           " debugindex debugindexdot debugdate debuginstall")
 optionalrepo = ("paths serve showconfig")
 
-def dispatch(args, argv0=None):
+def dispatch(args):
     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, argv0=argv0)
+    return cmdutil.runcatch(u, args)
 
 def run():
-    sys.exit(dispatch(sys.argv[1:], argv0=sys.argv[0]))
+    sys.exit(dispatch(sys.argv[1:]))
--- a/mercurial/help.py
+++ b/mercurial/help.py
@@ -38,9 +38,9 @@ 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.
+    Path to the 'hg' executable, automatically passed when running hooks,
+    extensions or external tools. If unset or empty, an executable named
+    'hg' (with com/exe/bat/cmd extension on Windows) is searched.
 
 HGEDITOR::
     This is the name of the editor to use when committing. Defaults to the
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -540,17 +540,21 @@ def _matcher(canonroot, cwd, names, inc,
 
     return (roots, match, (inc or exc or anypats) and True)
 
-_hgexecutable = 'hg'
+_hgexecutable = None
+
+def hgexecutable():
+    """return location of the 'hg' executable.
+
+    Defaults to $HG or 'hg' in the search path.
+    """
+    if _hgexecutable is None:
+        set_hgexecutable(os.environ.get('HG') or find_exe('hg', 'hg'))
+    return _hgexecutable
 
 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.
-    """
+    """set location of the 'hg' executable"""
     global _hgexecutable
-    if path:
-        _hgexecutable = os.path.abspath(path)
+    _hgexecutable = path
 
 def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None):
     '''enhanced shell command execution.
@@ -577,8 +581,7 @@ 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
+        os.environ['HG'] = hgexecutable()
         if cwd is not None and oldcwd != cwd:
             os.chdir(cwd)
         rc = os.system(cmd)