Mercurial > public > mercurial-scm > hg-stable
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: |