# HG changeset patch # User Thomas Arendsen Hein # Date 1186259112 -7200 # Node ID 3d35c8cb5eb410d911c5e9dd55fffb264c339149 # Parent a49f2a4d5ff73dfde8e4d18a0f59f7f63c801504 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. diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- 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) diff --git a/mercurial/commands.py b/mercurial/commands.py --- 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:])) diff --git a/mercurial/help.py b/mercurial/help.py --- 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 diff --git a/mercurial/util.py b/mercurial/util.py --- 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)