Show More
@@ -333,61 +333,9 b' def _runcatch(req):' | |||||
333 | return inst.code |
|
333 | return inst.code | |
334 | except socket.error as inst: |
|
334 | except socket.error as inst: | |
335 | ui.warn(_("abort: %s\n") % inst.args[-1]) |
|
335 | ui.warn(_("abort: %s\n") % inst.args[-1]) | |
336 | except: # re-raises |
|
336 | except: # perhaps re-raises | |
337 | # For compatibility checking, we discard the portion of the hg |
|
337 | if not handlecommandexception(ui): | |
338 | # version after the + on the assumption that if a "normal |
|
338 | raise | |
339 | # user" is running a build with a + in it the packager |
|
|||
340 | # probably built from fairly close to a tag and anyone with a |
|
|||
341 | # 'make local' copy of hg (where the version number can be out |
|
|||
342 | # of date) will be clueful enough to notice the implausible |
|
|||
343 | # version number and try updating. |
|
|||
344 | ct = util.versiontuple(n=2) |
|
|||
345 | worst = None, ct, '' |
|
|||
346 | if ui.config('ui', 'supportcontact', None) is None: |
|
|||
347 | for name, mod in extensions.extensions(): |
|
|||
348 | testedwith = getattr(mod, 'testedwith', '') |
|
|||
349 | report = getattr(mod, 'buglink', _('the extension author.')) |
|
|||
350 | if not testedwith.strip(): |
|
|||
351 | # We found an untested extension. It's likely the culprit. |
|
|||
352 | worst = name, 'unknown', report |
|
|||
353 | break |
|
|||
354 |
|
||||
355 | # Never blame on extensions bundled with Mercurial. |
|
|||
356 | if testedwith == 'internal': |
|
|||
357 | continue |
|
|||
358 |
|
||||
359 | tested = [util.versiontuple(t, 2) for t in testedwith.split()] |
|
|||
360 | if ct in tested: |
|
|||
361 | continue |
|
|||
362 |
|
||||
363 | lower = [t for t in tested if t < ct] |
|
|||
364 | nearest = max(lower or tested) |
|
|||
365 | if worst[0] is None or nearest < worst[1]: |
|
|||
366 | worst = name, nearest, report |
|
|||
367 | if worst[0] is not None: |
|
|||
368 | name, testedwith, report = worst |
|
|||
369 | if not isinstance(testedwith, str): |
|
|||
370 | testedwith = '.'.join([str(c) for c in testedwith]) |
|
|||
371 | warning = (_('** Unknown exception encountered with ' |
|
|||
372 | 'possibly-broken third-party extension %s\n' |
|
|||
373 | '** which supports versions %s of Mercurial.\n' |
|
|||
374 | '** Please disable %s and try your action again.\n' |
|
|||
375 | '** If that fixes the bug please report it to %s\n') |
|
|||
376 | % (name, testedwith, name, report)) |
|
|||
377 | else: |
|
|||
378 | bugtracker = ui.config('ui', 'supportcontact', None) |
|
|||
379 | if bugtracker is None: |
|
|||
380 | bugtracker = _("https://mercurial-scm.org/wiki/BugTracker") |
|
|||
381 | warning = (_("** unknown exception encountered, " |
|
|||
382 | "please report by visiting\n** ") + bugtracker + '\n') |
|
|||
383 | warning += ((_("** Python %s\n") % sys.version.replace('\n', '')) + |
|
|||
384 | (_("** Mercurial Distributed SCM (version %s)\n") % |
|
|||
385 | util.version()) + |
|
|||
386 | (_("** Extensions loaded: %s\n") % |
|
|||
387 | ", ".join([x[0] for x in extensions.extensions()]))) |
|
|||
388 | ui.log("commandexception", "%s\n%s\n", warning, traceback.format_exc()) |
|
|||
389 | ui.warn(warning) |
|
|||
390 | raise |
|
|||
391 |
|
339 | |||
392 | return -1 |
|
340 | return -1 | |
393 |
|
341 | |||
@@ -1066,3 +1014,64 b' def _runcommand(ui, options, cmd, cmdfun' | |||||
1066 | fp.close() |
|
1014 | fp.close() | |
1067 | else: |
|
1015 | else: | |
1068 | return checkargs() |
|
1016 | return checkargs() | |
|
1017 | ||||
|
1018 | def handlecommandexception(ui): | |||
|
1019 | """Produce a warning message for broken commands | |||
|
1020 | ||||
|
1021 | Called when handling an exception; the exception is reraised if | |||
|
1022 | this function returns False, ignored otherwise. | |||
|
1023 | """ | |||
|
1024 | # For compatibility checking, we discard the portion of the hg | |||
|
1025 | # version after the + on the assumption that if a "normal | |||
|
1026 | # user" is running a build with a + in it the packager | |||
|
1027 | # probably built from fairly close to a tag and anyone with a | |||
|
1028 | # 'make local' copy of hg (where the version number can be out | |||
|
1029 | # of date) will be clueful enough to notice the implausible | |||
|
1030 | # version number and try updating. | |||
|
1031 | ct = util.versiontuple(n=2) | |||
|
1032 | worst = None, ct, '' | |||
|
1033 | if ui.config('ui', 'supportcontact', None) is None: | |||
|
1034 | for name, mod in extensions.extensions(): | |||
|
1035 | testedwith = getattr(mod, 'testedwith', '') | |||
|
1036 | report = getattr(mod, 'buglink', _('the extension author.')) | |||
|
1037 | if not testedwith.strip(): | |||
|
1038 | # We found an untested extension. It's likely the culprit. | |||
|
1039 | worst = name, 'unknown', report | |||
|
1040 | break | |||
|
1041 | ||||
|
1042 | # Never blame on extensions bundled with Mercurial. | |||
|
1043 | if testedwith == 'internal': | |||
|
1044 | continue | |||
|
1045 | ||||
|
1046 | tested = [util.versiontuple(t, 2) for t in testedwith.split()] | |||
|
1047 | if ct in tested: | |||
|
1048 | continue | |||
|
1049 | ||||
|
1050 | lower = [t for t in tested if t < ct] | |||
|
1051 | nearest = max(lower or tested) | |||
|
1052 | if worst[0] is None or nearest < worst[1]: | |||
|
1053 | worst = name, nearest, report | |||
|
1054 | if worst[0] is not None: | |||
|
1055 | name, testedwith, report = worst | |||
|
1056 | if not isinstance(testedwith, str): | |||
|
1057 | testedwith = '.'.join([str(c) for c in testedwith]) | |||
|
1058 | warning = (_('** Unknown exception encountered with ' | |||
|
1059 | 'possibly-broken third-party extension %s\n' | |||
|
1060 | '** which supports versions %s of Mercurial.\n' | |||
|
1061 | '** Please disable %s and try your action again.\n' | |||
|
1062 | '** If that fixes the bug please report it to %s\n') | |||
|
1063 | % (name, testedwith, name, report)) | |||
|
1064 | else: | |||
|
1065 | bugtracker = ui.config('ui', 'supportcontact', None) | |||
|
1066 | if bugtracker is None: | |||
|
1067 | bugtracker = _("https://mercurial-scm.org/wiki/BugTracker") | |||
|
1068 | warning = (_("** unknown exception encountered, " | |||
|
1069 | "please report by visiting\n** ") + bugtracker + '\n') | |||
|
1070 | warning += ((_("** Python %s\n") % sys.version.replace('\n', '')) + | |||
|
1071 | (_("** Mercurial Distributed SCM (version %s)\n") % | |||
|
1072 | util.version()) + | |||
|
1073 | (_("** Extensions loaded: %s\n") % | |||
|
1074 | ", ".join([x[0] for x in extensions.extensions()]))) | |||
|
1075 | ui.log("commandexception", "%s\n%s\n", warning, traceback.format_exc()) | |||
|
1076 | ui.warn(warning) | |||
|
1077 | return False # re-raise the exception |
General Comments 0
You need to be logged in to leave comments.
Login now