Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/hook.py @ 43077:687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Done with
python3.7 contrib/byteify-strings.py -i $(hg files 'set:mercurial/**.py - mercurial/thirdparty/** + hgext/**.py - hgext/fsmonitor/pywatchman/** - mercurial/__init__.py')
black -l 80 -t py33 -S $(hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**" - hgext/fsmonitor/pywatchman/**')
# skip-blame mass-reformatting only
Differential Revision: https://phab.mercurial-scm.org/D6972
author | Augie Fackler <augie@google.com> |
---|---|
date | Sun, 06 Oct 2019 09:48:39 -0400 |
parents | 2372284d9457 |
children | c59eb1560c44 |
comparison
equal
deleted
inserted
replaced
43076:2372284d9457 | 43077:687b865b95ad |
---|---|
37 | 37 |
38 if callable(funcname): | 38 if callable(funcname): |
39 obj = funcname | 39 obj = funcname |
40 funcname = pycompat.sysbytes(obj.__module__ + r"." + obj.__name__) | 40 funcname = pycompat.sysbytes(obj.__module__ + r"." + obj.__name__) |
41 else: | 41 else: |
42 d = funcname.rfind('.') | 42 d = funcname.rfind(b'.') |
43 if d == -1: | 43 if d == -1: |
44 raise error.HookLoadError( | 44 raise error.HookLoadError( |
45 _('%s hook is invalid: "%s" not in a module') | 45 _(b'%s hook is invalid: "%s" not in a module') |
46 % (hname, funcname) | 46 % (hname, funcname) |
47 ) | 47 ) |
48 modname = funcname[:d] | 48 modname = funcname[:d] |
49 oldpaths = sys.path | 49 oldpaths = sys.path |
50 if procutil.mainfrozen(): | 50 if procutil.mainfrozen(): |
64 except (ImportError, SyntaxError): | 64 except (ImportError, SyntaxError): |
65 e2 = sys.exc_info() | 65 e2 = sys.exc_info() |
66 if ui.tracebackflag: | 66 if ui.tracebackflag: |
67 ui.warn( | 67 ui.warn( |
68 _( | 68 _( |
69 'exception from first failed import ' | 69 b'exception from first failed import ' |
70 'attempt:\n' | 70 b'attempt:\n' |
71 ) | 71 ) |
72 ) | 72 ) |
73 ui.traceback(e1) | 73 ui.traceback(e1) |
74 if ui.tracebackflag: | 74 if ui.tracebackflag: |
75 ui.warn( | 75 ui.warn( |
76 _( | 76 _( |
77 'exception from second failed import ' | 77 b'exception from second failed import ' |
78 'attempt:\n' | 78 b'attempt:\n' |
79 ) | 79 ) |
80 ) | 80 ) |
81 ui.traceback(e2) | 81 ui.traceback(e2) |
82 | 82 |
83 if not ui.tracebackflag: | 83 if not ui.tracebackflag: |
84 tracebackhint = _( | 84 tracebackhint = _( |
85 'run with --traceback for stack trace' | 85 b'run with --traceback for stack trace' |
86 ) | 86 ) |
87 else: | 87 else: |
88 tracebackhint = None | 88 tracebackhint = None |
89 raise error.HookLoadError( | 89 raise error.HookLoadError( |
90 _('%s hook is invalid: import of "%s" failed') | 90 _(b'%s hook is invalid: import of "%s" failed') |
91 % (hname, modname), | 91 % (hname, modname), |
92 hint=tracebackhint, | 92 hint=tracebackhint, |
93 ) | 93 ) |
94 sys.path = oldpaths | 94 sys.path = oldpaths |
95 try: | 95 try: |
96 for p in funcname.split('.')[1:]: | 96 for p in funcname.split(b'.')[1:]: |
97 obj = getattr(obj, p) | 97 obj = getattr(obj, p) |
98 except AttributeError: | 98 except AttributeError: |
99 raise error.HookLoadError( | 99 raise error.HookLoadError( |
100 _('%s hook is invalid: "%s" is not defined') % (hname, funcname) | 100 _(b'%s hook is invalid: "%s" is not defined') |
101 % (hname, funcname) | |
101 ) | 102 ) |
102 if not callable(obj): | 103 if not callable(obj): |
103 raise error.HookLoadError( | 104 raise error.HookLoadError( |
104 _('%s hook is invalid: "%s" is not callable') | 105 _(b'%s hook is invalid: "%s" is not callable') |
105 % (hname, funcname) | 106 % (hname, funcname) |
106 ) | 107 ) |
107 | 108 |
108 ui.note(_("calling hook %s: %s\n") % (hname, funcname)) | 109 ui.note(_(b"calling hook %s: %s\n") % (hname, funcname)) |
109 starttime = util.timer() | 110 starttime = util.timer() |
110 | 111 |
111 try: | 112 try: |
112 r = obj(ui=ui, repo=repo, hooktype=htype, **pycompat.strkwargs(args)) | 113 r = obj(ui=ui, repo=repo, hooktype=htype, **pycompat.strkwargs(args)) |
113 except Exception as exc: | 114 except Exception as exc: |
114 if isinstance(exc, error.Abort): | 115 if isinstance(exc, error.Abort): |
115 ui.warn(_('error: %s hook failed: %s\n') % (hname, exc.args[0])) | 116 ui.warn(_(b'error: %s hook failed: %s\n') % (hname, exc.args[0])) |
116 else: | 117 else: |
117 ui.warn( | 118 ui.warn( |
118 _('error: %s hook raised an exception: ' '%s\n') | 119 _(b'error: %s hook raised an exception: ' b'%s\n') |
119 % (hname, stringutil.forcebytestr(exc)) | 120 % (hname, stringutil.forcebytestr(exc)) |
120 ) | 121 ) |
121 if throw: | 122 if throw: |
122 raise | 123 raise |
123 if not ui.tracebackflag: | 124 if not ui.tracebackflag: |
124 ui.warn(_('(run with --traceback for stack trace)\n')) | 125 ui.warn(_(b'(run with --traceback for stack trace)\n')) |
125 ui.traceback() | 126 ui.traceback() |
126 return True, True | 127 return True, True |
127 finally: | 128 finally: |
128 duration = util.timer() - starttime | 129 duration = util.timer() - starttime |
129 ui.log( | 130 ui.log( |
130 'pythonhook', | 131 b'pythonhook', |
131 'pythonhook-%s: %s finished in %0.2f seconds\n', | 132 b'pythonhook-%s: %s finished in %0.2f seconds\n', |
132 htype, | 133 htype, |
133 funcname, | 134 funcname, |
134 duration, | 135 duration, |
135 ) | 136 ) |
136 if r: | 137 if r: |
137 if throw: | 138 if throw: |
138 raise error.HookAbort(_('%s hook failed') % hname) | 139 raise error.HookAbort(_(b'%s hook failed') % hname) |
139 ui.warn(_('warning: %s hook failed\n') % hname) | 140 ui.warn(_(b'warning: %s hook failed\n') % hname) |
140 return r, False | 141 return r, False |
141 | 142 |
142 | 143 |
143 def _exthook(ui, repo, htype, name, cmd, args, throw): | 144 def _exthook(ui, repo, htype, name, cmd, args, throw): |
144 starttime = util.timer() | 145 starttime = util.timer() |
147 # make in-memory changes visible to external process | 148 # make in-memory changes visible to external process |
148 if repo is not None: | 149 if repo is not None: |
149 tr = repo.currenttransaction() | 150 tr = repo.currenttransaction() |
150 repo.dirstate.write(tr) | 151 repo.dirstate.write(tr) |
151 if tr and tr.writepending(): | 152 if tr and tr.writepending(): |
152 env['HG_PENDING'] = repo.root | 153 env[b'HG_PENDING'] = repo.root |
153 env['HG_HOOKTYPE'] = htype | 154 env[b'HG_HOOKTYPE'] = htype |
154 env['HG_HOOKNAME'] = name | 155 env[b'HG_HOOKNAME'] = name |
155 | 156 |
156 for k, v in args.iteritems(): | 157 for k, v in args.iteritems(): |
157 if callable(v): | 158 if callable(v): |
158 v = v() | 159 v = v() |
159 if isinstance(v, (dict, list)): | 160 if isinstance(v, (dict, list)): |
160 v = stringutil.pprint(v) | 161 v = stringutil.pprint(v) |
161 env['HG_' + k.upper()] = v | 162 env[b'HG_' + k.upper()] = v |
162 | 163 |
163 if ui.configbool('hooks', 'tonative.%s' % name, False): | 164 if ui.configbool(b'hooks', b'tonative.%s' % name, False): |
164 oldcmd = cmd | 165 oldcmd = cmd |
165 cmd = procutil.shelltonative(cmd, env) | 166 cmd = procutil.shelltonative(cmd, env) |
166 if cmd != oldcmd: | 167 if cmd != oldcmd: |
167 ui.note(_('converting hook "%s" to native\n') % name) | 168 ui.note(_(b'converting hook "%s" to native\n') % name) |
168 | 169 |
169 ui.note(_("running hook %s: %s\n") % (name, cmd)) | 170 ui.note(_(b"running hook %s: %s\n") % (name, cmd)) |
170 | 171 |
171 if repo: | 172 if repo: |
172 cwd = repo.root | 173 cwd = repo.root |
173 else: | 174 else: |
174 cwd = encoding.getcwd() | 175 cwd = encoding.getcwd() |
175 r = ui.system(cmd, environ=env, cwd=cwd, blockedtag='exthook-%s' % (name,)) | 176 r = ui.system(cmd, environ=env, cwd=cwd, blockedtag=b'exthook-%s' % (name,)) |
176 | 177 |
177 duration = util.timer() - starttime | 178 duration = util.timer() - starttime |
178 ui.log( | 179 ui.log( |
179 'exthook', | 180 b'exthook', |
180 'exthook-%s: %s finished in %0.2f seconds\n', | 181 b'exthook-%s: %s finished in %0.2f seconds\n', |
181 name, | 182 name, |
182 cmd, | 183 cmd, |
183 duration, | 184 duration, |
184 ) | 185 ) |
185 if r: | 186 if r: |
186 desc = procutil.explainexit(r) | 187 desc = procutil.explainexit(r) |
187 if throw: | 188 if throw: |
188 raise error.HookAbort(_('%s hook %s') % (name, desc)) | 189 raise error.HookAbort(_(b'%s hook %s') % (name, desc)) |
189 ui.warn(_('warning: %s hook %s\n') % (name, desc)) | 190 ui.warn(_(b'warning: %s hook %s\n') % (name, desc)) |
190 return r | 191 return r |
191 | 192 |
192 | 193 |
193 # represent an untrusted hook command | 194 # represent an untrusted hook command |
194 _fromuntrusted = object() | 195 _fromuntrusted = object() |
211 | 212 |
212 | 213 |
213 def _hookitems(ui, _untrusted=False): | 214 def _hookitems(ui, _untrusted=False): |
214 """return all hooks items ready to be sorted""" | 215 """return all hooks items ready to be sorted""" |
215 hooks = {} | 216 hooks = {} |
216 for name, cmd in ui.configitems('hooks', untrusted=_untrusted): | 217 for name, cmd in ui.configitems(b'hooks', untrusted=_untrusted): |
217 if name.startswith('priority.') or name.startswith('tonative.'): | 218 if name.startswith(b'priority.') or name.startswith(b'tonative.'): |
218 continue | 219 continue |
219 | 220 |
220 priority = ui.configint('hooks', 'priority.%s' % name, 0) | 221 priority = ui.configint(b'hooks', b'priority.%s' % name, 0) |
221 hooks[name] = (-priority, len(hooks), name, cmd) | 222 hooks[name] = (-priority, len(hooks), name, cmd) |
222 return hooks | 223 return hooks |
223 | 224 |
224 | 225 |
225 _redirect = False | 226 _redirect = False |
233 def hashook(ui, htype): | 234 def hashook(ui, htype): |
234 """return True if a hook is configured for 'htype'""" | 235 """return True if a hook is configured for 'htype'""" |
235 if not ui.callhooks: | 236 if not ui.callhooks: |
236 return False | 237 return False |
237 for hname, cmd in _allhooks(ui): | 238 for hname, cmd in _allhooks(ui): |
238 if hname.split('.')[0] == htype and cmd: | 239 if hname.split(b'.')[0] == htype and cmd: |
239 return True | 240 return True |
240 return False | 241 return False |
241 | 242 |
242 | 243 |
243 def hook(ui, repo, htype, throw=False, **args): | 244 def hook(ui, repo, htype, throw=False, **args): |
244 if not ui.callhooks: | 245 if not ui.callhooks: |
245 return False | 246 return False |
246 | 247 |
247 hooks = [] | 248 hooks = [] |
248 for hname, cmd in _allhooks(ui): | 249 for hname, cmd in _allhooks(ui): |
249 if hname.split('.')[0] == htype and cmd: | 250 if hname.split(b'.')[0] == htype and cmd: |
250 hooks.append((hname, cmd)) | 251 hooks.append((hname, cmd)) |
251 | 252 |
252 res = runhooks(ui, repo, htype, hooks, throw=throw, **args) | 253 res = runhooks(ui, repo, htype, hooks, throw=throw, **args) |
253 r = False | 254 r = False |
254 for hname, cmd in hooks: | 255 for hname, cmd in hooks: |
277 pass | 278 pass |
278 | 279 |
279 if cmd is _fromuntrusted: | 280 if cmd is _fromuntrusted: |
280 if throw: | 281 if throw: |
281 raise error.HookAbort( | 282 raise error.HookAbort( |
282 _('untrusted hook %s not executed') % hname, | 283 _(b'untrusted hook %s not executed') % hname, |
283 hint=_("see 'hg help config.trusted'"), | 284 hint=_(b"see 'hg help config.trusted'"), |
284 ) | 285 ) |
285 ui.warn(_('warning: untrusted hook %s not executed\n') % hname) | 286 ui.warn(_(b'warning: untrusted hook %s not executed\n') % hname) |
286 r = 1 | 287 r = 1 |
287 raised = False | 288 raised = False |
288 elif callable(cmd): | 289 elif callable(cmd): |
289 r, raised = pythonhook(ui, repo, htype, hname, cmd, args, throw) | 290 r, raised = pythonhook(ui, repo, htype, hname, cmd, args, throw) |
290 elif cmd.startswith('python:'): | 291 elif cmd.startswith(b'python:'): |
291 if cmd.count(':') >= 2: | 292 if cmd.count(b':') >= 2: |
292 path, cmd = cmd[7:].rsplit(':', 1) | 293 path, cmd = cmd[7:].rsplit(b':', 1) |
293 path = util.expandpath(path) | 294 path = util.expandpath(path) |
294 if repo: | 295 if repo: |
295 path = os.path.join(repo.root, path) | 296 path = os.path.join(repo.root, path) |
296 try: | 297 try: |
297 mod = extensions.loadpath(path, 'hghook.%s' % hname) | 298 mod = extensions.loadpath(path, b'hghook.%s' % hname) |
298 except Exception: | 299 except Exception: |
299 ui.write(_("loading %s hook failed:\n") % hname) | 300 ui.write(_(b"loading %s hook failed:\n") % hname) |
300 raise | 301 raise |
301 hookfn = getattr(mod, cmd) | 302 hookfn = getattr(mod, cmd) |
302 else: | 303 else: |
303 hookfn = cmd[7:].strip() | 304 hookfn = cmd[7:].strip() |
304 r, raised = pythonhook( | 305 r, raised = pythonhook( |