Show More
@@ -15,7 +15,6 b' import pdb' | |||
|
15 | 15 | import re |
|
16 | 16 | import shlex |
|
17 | 17 | import signal |
|
18 | import socket | |
|
19 | 18 | import sys |
|
20 | 19 | import time |
|
21 | 20 | import traceback |
@@ -38,6 +37,7 b' from . import (' | |||
|
38 | 37 | profiling, |
|
39 | 38 | pycompat, |
|
40 | 39 | revset, |
|
40 | scmutil, | |
|
41 | 41 | templatefilters, |
|
42 | 42 | templatekw, |
|
43 | 43 | templater, |
@@ -218,30 +218,15 b' def _runcatch(req):' | |||
|
218 | 218 | return callcatch(ui, _runcatchfunc) |
|
219 | 219 | |
|
220 | 220 | def callcatch(ui, func): |
|
221 | """call func() with global exception handling | |
|
222 | ||
|
223 | return func() if no exception happens. otherwise do some error handling | |
|
224 | and return an exit code accordingly. | |
|
221 | """like scmutil.callcatch but handles more high-level exceptions about | |
|
222 | config parsing and commands. besides, use handlecommandexception to handle | |
|
223 | uncaught exceptions. | |
|
225 | 224 | """ |
|
226 | 225 | try: |
|
227 |
return func |
|
|
228 | # Global exception handling, alphabetically | |
|
229 | # Mercurial-specific first, followed by built-in and library exceptions | |
|
226 | return scmutil.callcatch(ui, func) | |
|
230 | 227 | except error.AmbiguousCommand as inst: |
|
231 | 228 | ui.warn(_("hg: command '%s' is ambiguous:\n %s\n") % |
|
232 | 229 | (inst.args[0], " ".join(inst.args[1]))) |
|
233 | except error.ParseError as inst: | |
|
234 | _formatparse(ui.warn, inst) | |
|
235 | return -1 | |
|
236 | except error.LockHeld as inst: | |
|
237 | if inst.errno == errno.ETIMEDOUT: | |
|
238 | reason = _('timed out waiting for lock held by %s') % inst.locker | |
|
239 | else: | |
|
240 | reason = _('lock held by %s') % inst.locker | |
|
241 | ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason)) | |
|
242 | except error.LockUnavailable as inst: | |
|
243 | ui.warn(_("abort: could not lock %s: %s\n") % | |
|
244 | (inst.desc or inst.filename, inst.strerror)) | |
|
245 | 230 | except error.CommandError as inst: |
|
246 | 231 | if inst.args[0]: |
|
247 | 232 | ui.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1])) |
@@ -249,34 +234,9 b' def callcatch(ui, func):' | |||
|
249 | 234 | else: |
|
250 | 235 | ui.warn(_("hg: %s\n") % inst.args[1]) |
|
251 | 236 | commands.help_(ui, 'shortlist') |
|
252 |
except error. |
|
|
253 | if inst.args: | |
|
254 | msg = _("abort: remote error:\n") | |
|
255 | else: | |
|
256 | msg = _("abort: remote error\n") | |
|
257 | ui.warn(msg) | |
|
258 | if inst.args: | |
|
259 | ui.warn(''.join(inst.args)) | |
|
260 | if inst.hint: | |
|
261 | ui.warn('(%s)\n' % inst.hint) | |
|
262 | except error.RepoError as inst: | |
|
263 | ui.warn(_("abort: %s!\n") % inst) | |
|
264 | if inst.hint: | |
|
265 | ui.warn(_("(%s)\n") % inst.hint) | |
|
266 | except error.ResponseError as inst: | |
|
267 | ui.warn(_("abort: %s") % inst.args[0]) | |
|
268 | if not isinstance(inst.args[1], basestring): | |
|
269 | ui.warn(" %r\n" % (inst.args[1],)) | |
|
270 | elif not inst.args[1]: | |
|
271 | ui.warn(_(" empty string\n")) | |
|
272 | else: | |
|
273 | ui.warn("\n%r\n" % util.ellipsis(inst.args[1])) | |
|
274 | except error.CensoredNodeError as inst: | |
|
275 | ui.warn(_("abort: file censored %s!\n") % inst) | |
|
276 | except error.RevlogError as inst: | |
|
277 | ui.warn(_("abort: %s!\n") % inst) | |
|
278 | except error.SignalInterrupt: | |
|
279 | ui.warn(_("killed!\n")) | |
|
237 | except error.ParseError as inst: | |
|
238 | _formatparse(ui.warn, inst) | |
|
239 | return -1 | |
|
280 | 240 | except error.UnknownCommand as inst: |
|
281 | 241 | ui.warn(_("hg: unknown command '%s'\n") % inst.args[0]) |
|
282 | 242 | try: |
@@ -292,61 +252,11 b' def callcatch(ui, func):' | |||
|
292 | 252 | suggested = True |
|
293 | 253 | if not suggested: |
|
294 | 254 | commands.help_(ui, 'shortlist') |
|
295 | except error.InterventionRequired as inst: | |
|
296 | ui.warn("%s\n" % inst) | |
|
297 | if inst.hint: | |
|
298 | ui.warn(_("(%s)\n") % inst.hint) | |
|
299 | return 1 | |
|
300 | except error.Abort as inst: | |
|
301 | ui.warn(_("abort: %s\n") % inst) | |
|
302 | if inst.hint: | |
|
303 | ui.warn(_("(%s)\n") % inst.hint) | |
|
304 | except ImportError as inst: | |
|
305 | ui.warn(_("abort: %s!\n") % inst) | |
|
306 | m = str(inst).split()[-1] | |
|
307 | if m in "mpatch bdiff".split(): | |
|
308 | ui.warn(_("(did you forget to compile extensions?)\n")) | |
|
309 | elif m in "zlib".split(): | |
|
310 | ui.warn(_("(is your Python install correct?)\n")) | |
|
311 | except IOError as inst: | |
|
312 | if util.safehasattr(inst, "code"): | |
|
313 | ui.warn(_("abort: %s\n") % inst) | |
|
314 | elif util.safehasattr(inst, "reason"): | |
|
315 | try: # usually it is in the form (errno, strerror) | |
|
316 | reason = inst.reason.args[1] | |
|
317 | except (AttributeError, IndexError): | |
|
318 | # it might be anything, for example a string | |
|
319 | reason = inst.reason | |
|
320 | if isinstance(reason, unicode): | |
|
321 | # SSLError of Python 2.7.9 contains a unicode | |
|
322 | reason = reason.encode(encoding.encoding, 'replace') | |
|
323 | ui.warn(_("abort: error: %s\n") % reason) | |
|
324 | elif (util.safehasattr(inst, "args") | |
|
325 | and inst.args and inst.args[0] == errno.EPIPE): | |
|
326 | pass | |
|
327 | elif getattr(inst, "strerror", None): | |
|
328 | if getattr(inst, "filename", None): | |
|
329 | ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename)) | |
|
330 | else: | |
|
331 | ui.warn(_("abort: %s\n") % inst.strerror) | |
|
332 | else: | |
|
333 | raise | |
|
334 | except OSError as inst: | |
|
335 | if getattr(inst, "filename", None) is not None: | |
|
336 | ui.warn(_("abort: %s: '%s'\n") % (inst.strerror, inst.filename)) | |
|
337 | else: | |
|
338 | ui.warn(_("abort: %s\n") % inst.strerror) | |
|
255 | except IOError: | |
|
256 | raise | |
|
339 | 257 | except KeyboardInterrupt: |
|
340 | 258 | raise |
|
341 | except MemoryError: | |
|
342 | ui.warn(_("abort: out of memory\n")) | |
|
343 | except SystemExit as inst: | |
|
344 | # Commands shouldn't sys.exit directly, but give a return code. | |
|
345 | # Just in case catch this and and pass exit code to caller. | |
|
346 | return inst.code | |
|
347 | except socket.error as inst: | |
|
348 | ui.warn(_("abort: %s\n") % inst.args[-1]) | |
|
349 | except: # perhaps re-raises | |
|
259 | except: # probably re-raises | |
|
350 | 260 | if not handlecommandexception(ui): |
|
351 | 261 | raise |
|
352 | 262 |
@@ -14,6 +14,7 b' import hashlib' | |||
|
14 | 14 | import os |
|
15 | 15 | import re |
|
16 | 16 | import shutil |
|
17 | import socket | |
|
17 | 18 | import stat |
|
18 | 19 | import tempfile |
|
19 | 20 | import threading |
@@ -141,6 +142,108 b' def nochangesfound(ui, repo, excluded=No' | |||
|
141 | 142 | else: |
|
142 | 143 | ui.status(_("no changes found\n")) |
|
143 | 144 | |
|
145 | def callcatch(ui, func): | |
|
146 | """call func() with global exception handling | |
|
147 | ||
|
148 | return func() if no exception happens. otherwise do some error handling | |
|
149 | and return an exit code accordingly. does not handle all exceptions. | |
|
150 | """ | |
|
151 | try: | |
|
152 | return func() | |
|
153 | # Global exception handling, alphabetically | |
|
154 | # Mercurial-specific first, followed by built-in and library exceptions | |
|
155 | except error.LockHeld as inst: | |
|
156 | if inst.errno == errno.ETIMEDOUT: | |
|
157 | reason = _('timed out waiting for lock held by %s') % inst.locker | |
|
158 | else: | |
|
159 | reason = _('lock held by %s') % inst.locker | |
|
160 | ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason)) | |
|
161 | except error.LockUnavailable as inst: | |
|
162 | ui.warn(_("abort: could not lock %s: %s\n") % | |
|
163 | (inst.desc or inst.filename, inst.strerror)) | |
|
164 | except error.OutOfBandError as inst: | |
|
165 | if inst.args: | |
|
166 | msg = _("abort: remote error:\n") | |
|
167 | else: | |
|
168 | msg = _("abort: remote error\n") | |
|
169 | ui.warn(msg) | |
|
170 | if inst.args: | |
|
171 | ui.warn(''.join(inst.args)) | |
|
172 | if inst.hint: | |
|
173 | ui.warn('(%s)\n' % inst.hint) | |
|
174 | except error.RepoError as inst: | |
|
175 | ui.warn(_("abort: %s!\n") % inst) | |
|
176 | if inst.hint: | |
|
177 | ui.warn(_("(%s)\n") % inst.hint) | |
|
178 | except error.ResponseError as inst: | |
|
179 | ui.warn(_("abort: %s") % inst.args[0]) | |
|
180 | if not isinstance(inst.args[1], basestring): | |
|
181 | ui.warn(" %r\n" % (inst.args[1],)) | |
|
182 | elif not inst.args[1]: | |
|
183 | ui.warn(_(" empty string\n")) | |
|
184 | else: | |
|
185 | ui.warn("\n%r\n" % util.ellipsis(inst.args[1])) | |
|
186 | except error.CensoredNodeError as inst: | |
|
187 | ui.warn(_("abort: file censored %s!\n") % inst) | |
|
188 | except error.RevlogError as inst: | |
|
189 | ui.warn(_("abort: %s!\n") % inst) | |
|
190 | except error.SignalInterrupt: | |
|
191 | ui.warn(_("killed!\n")) | |
|
192 | except error.InterventionRequired as inst: | |
|
193 | ui.warn("%s\n" % inst) | |
|
194 | if inst.hint: | |
|
195 | ui.warn(_("(%s)\n") % inst.hint) | |
|
196 | return 1 | |
|
197 | except error.Abort as inst: | |
|
198 | ui.warn(_("abort: %s\n") % inst) | |
|
199 | if inst.hint: | |
|
200 | ui.warn(_("(%s)\n") % inst.hint) | |
|
201 | except ImportError as inst: | |
|
202 | ui.warn(_("abort: %s!\n") % inst) | |
|
203 | m = str(inst).split()[-1] | |
|
204 | if m in "mpatch bdiff".split(): | |
|
205 | ui.warn(_("(did you forget to compile extensions?)\n")) | |
|
206 | elif m in "zlib".split(): | |
|
207 | ui.warn(_("(is your Python install correct?)\n")) | |
|
208 | except IOError as inst: | |
|
209 | if util.safehasattr(inst, "code"): | |
|
210 | ui.warn(_("abort: %s\n") % inst) | |
|
211 | elif util.safehasattr(inst, "reason"): | |
|
212 | try: # usually it is in the form (errno, strerror) | |
|
213 | reason = inst.reason.args[1] | |
|
214 | except (AttributeError, IndexError): | |
|
215 | # it might be anything, for example a string | |
|
216 | reason = inst.reason | |
|
217 | if isinstance(reason, unicode): | |
|
218 | # SSLError of Python 2.7.9 contains a unicode | |
|
219 | reason = reason.encode(encoding.encoding, 'replace') | |
|
220 | ui.warn(_("abort: error: %s\n") % reason) | |
|
221 | elif (util.safehasattr(inst, "args") | |
|
222 | and inst.args and inst.args[0] == errno.EPIPE): | |
|
223 | pass | |
|
224 | elif getattr(inst, "strerror", None): | |
|
225 | if getattr(inst, "filename", None): | |
|
226 | ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename)) | |
|
227 | else: | |
|
228 | ui.warn(_("abort: %s\n") % inst.strerror) | |
|
229 | else: | |
|
230 | raise | |
|
231 | except OSError as inst: | |
|
232 | if getattr(inst, "filename", None) is not None: | |
|
233 | ui.warn(_("abort: %s: '%s'\n") % (inst.strerror, inst.filename)) | |
|
234 | else: | |
|
235 | ui.warn(_("abort: %s\n") % inst.strerror) | |
|
236 | except MemoryError: | |
|
237 | ui.warn(_("abort: out of memory\n")) | |
|
238 | except SystemExit as inst: | |
|
239 | # Commands shouldn't sys.exit directly, but give a return code. | |
|
240 | # Just in case catch this and and pass exit code to caller. | |
|
241 | return inst.code | |
|
242 | except socket.error as inst: | |
|
243 | ui.warn(_("abort: %s\n") % inst.args[-1]) | |
|
244 | ||
|
245 | return -1 | |
|
246 | ||
|
144 | 247 | def checknewlabel(repo, lbl, kind): |
|
145 | 248 | # Do not use the "kind" parameter in ui output. |
|
146 | 249 | # It makes strings difficult to translate. |
@@ -92,6 +92,7 b'' | |||
|
92 | 92 | */mercurial/dispatch.py:* in dispatch (glob) |
|
93 | 93 | */mercurial/dispatch.py:* in _runcatch (glob) |
|
94 | 94 | */mercurial/dispatch.py:* in callcatch (glob) |
|
95 | */mercurial/scmutil.py* in callcatch (glob) | |
|
95 | 96 | */mercurial/dispatch.py:* in _runcatchfunc (glob) |
|
96 | 97 | */mercurial/dispatch.py:* in _dispatch (glob) |
|
97 | 98 | */mercurial/dispatch.py:* in runcommand (glob) |
@@ -127,6 +128,7 b'' | |||
|
127 | 128 | */mercurial/dispatch.py:* in dispatch (glob) |
|
128 | 129 | */mercurial/dispatch.py:* in _runcatch (glob) |
|
129 | 130 | */mercurial/dispatch.py:* in callcatch (glob) |
|
131 | */mercurial/scmutil.py* in callcatch (glob) | |
|
130 | 132 | */mercurial/dispatch.py:* in _runcatchfunc (glob) |
|
131 | 133 | */mercurial/dispatch.py:* in _dispatch (glob) |
|
132 | 134 | */mercurial/dispatch.py:* in runcommand (glob) |
@@ -150,6 +152,7 b'' | |||
|
150 | 152 | */mercurial/dispatch.py:* in dispatch (glob) |
|
151 | 153 | */mercurial/dispatch.py:* in _runcatch (glob) |
|
152 | 154 | */mercurial/dispatch.py:* in callcatch (glob) |
|
155 | */mercurial/scmutil.py* in callcatch (glob) | |
|
153 | 156 | */mercurial/dispatch.py:* in _runcatchfunc (glob) |
|
154 | 157 | */mercurial/dispatch.py:* in _dispatch (glob) |
|
155 | 158 | */mercurial/dispatch.py:* in runcommand (glob) |
General Comments 0
You need to be logged in to leave comments.
Login now