comparison mercurial/hook.py @ 9332:872d49dd577a

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
author Steve Borho <steve@borho.org>
date Wed, 05 Aug 2009 21:45:54 -0500
parents 0bf0045000b5
children 852b1f3032d2
comparison
equal deleted inserted replaced
9315:fb66a7d3f28f 9332:872d49dd577a
25 d = funcname.rfind('.') 25 d = funcname.rfind('.')
26 if d == -1: 26 if d == -1:
27 raise util.Abort(_('%s hook is invalid ("%s" not in ' 27 raise util.Abort(_('%s hook is invalid ("%s" not in '
28 'a module)') % (hname, funcname)) 28 'a module)') % (hname, funcname))
29 modname = funcname[:d] 29 modname = funcname[:d]
30 oldpaths = sys.path[:]
31 if hasattr(sys, "frozen"):
32 # binary installs require sys.path manipulation
33 path, name = os.path.split(modname)
34 if path and name:
35 sys.path.append(path)
36 modname = name
30 try: 37 try:
31 obj = __import__(modname) 38 obj = __import__(modname)
32 except ImportError: 39 except ImportError:
33 try: 40 try:
34 # extensions are loaded with hgext_ prefix 41 # extensions are loaded with hgext_ prefix
35 obj = __import__("hgext_%s" % modname) 42 obj = __import__("hgext_%s" % modname)
36 except ImportError: 43 except ImportError:
37 raise util.Abort(_('%s hook is invalid ' 44 raise util.Abort(_('%s hook is invalid '
38 '(import of "%s" failed)') % 45 '(import of "%s" failed)') %
39 (hname, modname)) 46 (hname, modname))
47 sys.path = oldpaths
40 try: 48 try:
41 for p in funcname.split('.')[1:]: 49 for p in funcname.split('.')[1:]:
42 obj = getattr(obj, p) 50 obj = getattr(obj, p)
43 except AttributeError: 51 except AttributeError:
44 raise util.Abort(_('%s hook is invalid ' 52 raise util.Abort(_('%s hook is invalid '
108 if hname.split('.')[0] != name or not cmd: 116 if hname.split('.')[0] != name or not cmd:
109 continue 117 continue
110 if hasattr(cmd, '__call__'): 118 if hasattr(cmd, '__call__'):
111 r = _pythonhook(ui, repo, name, hname, cmd, args, throw) or r 119 r = _pythonhook(ui, repo, name, hname, cmd, args, throw) or r
112 elif cmd.startswith('python:'): 120 elif cmd.startswith('python:'):
113 if cmd.count(':') == 2: 121 if cmd.count(':') >= 2:
114 path, cmd = cmd[7:].split(':') 122 path, cmd = cmd[7:].rsplit(':', 1)
115 mod = extensions.loadpath(path, 'hgkook.%s' % hname) 123 mod = extensions.loadpath(path, 'hghook.%s' % hname)
116 hookfn = getattr(mod, cmd) 124 hookfn = getattr(mod, cmd)
117 else: 125 else:
118 hookfn = cmd[7:].strip() 126 hookfn = cmd[7:].strip()
119 r = _pythonhook(ui, repo, name, hname, hookfn, args, throw) or r 127 r = _pythonhook(ui, repo, name, hname, hookfn, args, throw) or r
120 else: 128 else: