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.
--- a/mercurial/cmdutil.py Tue Jul 10 10:06:24 2007 -0700
+++ b/mercurial/cmdutil.py Sat Aug 04 22:25:12 2007 +0200
@@ -20,7 +20,7 @@
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 @@
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 @@
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 Tue Jul 10 10:06:24 2007 -0700
+++ b/mercurial/commands.py Sat Aug 04 22:25:12 2007 +0200
@@ -3130,13 +3130,13 @@
" 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 Tue Jul 10 10:06:24 2007 -0700
+++ b/mercurial/help.py Sat Aug 04 22:25:12 2007 +0200
@@ -38,9 +38,9 @@
'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 Tue Jul 10 10:06:24 2007 -0700
+++ b/mercurial/util.py Sat Aug 04 22:25:12 2007 +0200
@@ -540,17 +540,21 @@
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 @@
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)