diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py --- a/mercurial/dispatch.py +++ b/mercurial/dispatch.py @@ -283,12 +283,19 @@ def _runcatch(req): # We found an untested extension. It's likely the culprit. worst = name, 'unknown', report break - if compare not in testedwith.split() and testedwith != 'internal': - tested = [tuplever(v) for v in testedwith.split()] - lower = [t for t in tested if t < ct] - nearest = max(lower or tested) - if worst[0] is None or nearest < worst[1]: - worst = name, nearest, report + + # Never blame on extensions bundled with Mercurial. + if testedwith == 'internal': + continue + + tested = [tuplever(t) for t in testedwith.split()] + if ct in tested: + continue + + lower = [t for t in tested if t < ct] + nearest = max(lower or tested) + if worst[0] is None or nearest < worst[1]: + worst = name, nearest, report if worst[0] is not None: name, testedwith, report = worst if not isinstance(testedwith, str): @@ -315,7 +322,10 @@ def _runcatch(req): def tuplever(v): try: - return tuple([int(i) for i in v.split('.')]) + # Assertion: tuplever is only used for extension compatibility + # checking. Otherwise, the discarding of extra version fields is + # incorrect. + return tuple([int(i) for i in v.split('.')[0:2]]) except ValueError: return tuple() diff --git a/tests/test-extension.t b/tests/test-extension.t --- a/tests/test-extension.t +++ b/tests/test-extension.t @@ -858,7 +858,7 @@ Broken disabled extension and command: [255] $ cat > throw.py < from mercurial import cmdutil, commands + > from mercurial import cmdutil, commands, util > cmdtable = {} > command = cmdutil.command(cmdtable) > class Bogon(Exception): pass @@ -910,7 +910,7 @@ If the extensions declare outdated versi $ hg --config extensions.throw=throw.py --config extensions.older=older.py \ > throw 2>&1 | egrep '^\*\*' ** Unknown exception encountered with possibly-broken third-party extension older - ** which supports versions 1.9.3 of Mercurial. + ** which supports versions 1.9 of Mercurial. ** Please disable older and try your action again. ** If that fixes the bug please report it to the extension author. ** Python * (glob) @@ -923,7 +923,7 @@ One extension only tested with older, on $ hg --config extensions.throw=throw.py --config extensions.older=older.py \ > throw 2>&1 | egrep '^\*\*' ** Unknown exception encountered with possibly-broken third-party extension older - ** which supports versions 1.9.3 of Mercurial. + ** which supports versions 1.9 of Mercurial. ** Please disable older and try your action again. ** If that fixes the bug please report it to the extension author. ** Python * (glob) @@ -936,7 +936,7 @@ Older extension is tested with current v $ hg --config extensions.throw=throw.py --config extensions.older=older.py \ > throw 2>&1 | egrep '^\*\*' ** Unknown exception encountered with possibly-broken third-party extension throw - ** which supports versions 2.1.1 of Mercurial. + ** which supports versions 2.1 of Mercurial. ** Please disable throw and try your action again. ** If that fixes the bug please report it to http://example.com/bts ** Python * (glob) @@ -954,6 +954,17 @@ Declare the version as supporting this h ** Mercurial Distributed SCM (*) (glob) ** Extensions loaded: throw +Patch version is ignored during compatibility check + $ echo "testedwith = '3.2'" >> throw.py + $ echo "util.version = lambda:'3.2.2'" >> throw.py + $ rm -f throw.pyc throw.pyo + $ hg --config extensions.throw=throw.py throw 2>&1 | egrep '^\*\*' + ** unknown exception encountered, please report by visiting + ** http://mercurial.selenic.com/wiki/BugTracker + ** Python * (glob) + ** Mercurial Distributed SCM (*) (glob) + ** Extensions loaded: throw + Test version number support in 'hg version': $ echo '__version__ = (1, 2, 3)' >> throw.py $ rm -f throw.pyc throw.pyo