hook: fix full path imports on Windows (
issue1779)
Bottom portion fixes full path imports on source installs on Windows.
The top portion further fixes full path imports on binary installs.
Initial patch by Roman V. Kiseliov
--- a/mercurial/hook.py Wed Aug 05 17:19:37 2009 +0200
+++ b/mercurial/hook.py Wed Aug 05 21:45:54 2009 -0500
@@ -27,6 +27,13 @@
raise util.Abort(_('%s hook is invalid ("%s" not in '
'a module)') % (hname, funcname))
modname = funcname[:d]
+ oldpaths = sys.path[:]
+ if hasattr(sys, "frozen"):
+ # binary installs require sys.path manipulation
+ path, name = os.path.split(modname)
+ if path and name:
+ sys.path.append(path)
+ modname = name
try:
obj = __import__(modname)
except ImportError:
@@ -37,6 +44,7 @@
raise util.Abort(_('%s hook is invalid '
'(import of "%s" failed)') %
(hname, modname))
+ sys.path = oldpaths
try:
for p in funcname.split('.')[1:]:
obj = getattr(obj, p)
@@ -110,9 +118,9 @@
if hasattr(cmd, '__call__'):
r = _pythonhook(ui, repo, name, hname, cmd, args, throw) or r
elif cmd.startswith('python:'):
- if cmd.count(':') == 2:
- path, cmd = cmd[7:].split(':')
- mod = extensions.loadpath(path, 'hgkook.%s' % hname)
+ if cmd.count(':') >= 2:
+ path, cmd = cmd[7:].rsplit(':', 1)
+ mod = extensions.loadpath(path, 'hghook.%s' % hname)
hookfn = getattr(mod, cmd)
else:
hookfn = cmd[7:].strip()