[PATCH 2 of 2] dispatch: try and identify third-party extensions as sources of tracebacks

Augie Fackler raf at durin42.com
Wed May 16 16:47:22 CDT 2012


check code said hi. Drop these.

On May 16, 2012, at 4:25 PM, Augie Fackler wrote:

> # HG changeset patch
> # User Augie Fackler <raf at durin42.com>
> # Date 1337203087 18000
> # Node ID c705c71b721fd921376c012c90f7458cfa6d6f98
> # Parent  86f33df08b67d02910b66d18222695f4c04917ea
> dispatch: try and identify third-party extensions as sources of tracebacks
> 
> Extension authors should explicitly declare their supported hg
> versions and include a buglink attribute in their extension. In the
> event that a traceback occurs, we'll identify the
> least-recently-tested extensionas the most likely source of the defect
> and suggest the user disable that extension.
> 
> Packagers should make every effort to ship hg versions from exact
> tags, or with as few modifications as possible so that the versioning
> can work appropriately.
> 
> diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
> --- a/mercurial/dispatch.py
> +++ b/mercurial/dispatch.py
> @@ -205,18 +205,56 @@
>     except socket.error, inst:
>         ui.warn(_("abort: %s\n") % inst.args[-1])
>     except: # re-raises
> -        ui.warn(_("** unknown exception encountered,"
> -                  " please report by visiting\n"))
> -        ui.warn(_("**  http://mercurial.selenic.com/wiki/BugTracker\n"))
> -        ui.warn(_("** Python %s\n") % sys.version.replace('\n', ''))
> -        ui.warn(_("** Mercurial Distributed SCM (version %s)\n")
> -               % util.version())
> -        ui.warn(_("** Extensions loaded: %s\n")
> -               % ", ".join([x[0] for x in extensions.extensions()]))
> +        myver = util.version()
> +        # For compatibility checking, we discard the portion of the hg
> +        # version after the + on the assumption that if a "normal
> +        # user" is running a build with a + in it the packager
> +        # probably built from fairly close to a tag and anyone with a
> +        # 'make local' copy of hg (where the version number can be out
> +        # of date) will be clueful enough to notice the implausible
> +        # version number and try updating.
> +        compare = myver.split('+')[0]
> +        ct = tuplever(compare)
> +        worst = None, ct, ''
> +        for name, mod in extensions.extensions():
> +            testedwith = getattr(mod, 'testedwith', 'unknown')
> +            report = getattr(mod, 'buglink', _('the extension author.'))
> +            if testedwith == 'unknown':
> +                # We found an untested extension. It's likely the culprit.
> +                worst = name, testedwith, report
> +                break
> +            if compare not in testedwith.split() and testedwith != 'internal':
> +                tested = [tuplever(v) for v in testedwith.split()]
> +                nearest = max([t for t in tested if t < ct])
> +                if nearest < worst[1]:
> +                    worst = name, nearest, report
> +        if worst[0] is not None:
> +            name, testedwith, report = worst
> +            if not isinstance(testedwith, str):
> +                testedwith = '.'.join([str(c) for c in testedwith])
> +            warning = (_('** Unknown exception encountered with '
> +                         'possibly-broken third-party extension %s\n'
> +                         '** which supports versions %s of Mercurial.\n'
> +                         '** Please disable %s and try your action again.\n'
> +                         '** If that fixes the bug please report it to %s\n')
> +                       % (name, testedwith, name, report))
> +        else:
> +            warning = (_("** unknown exception encountered, "
> +                         "please report by visiting\n") +
> +                       _("** http://mercurial.selenic.com/wiki/BugTracker\n"))
> +        warning += ((_("** Python %s\n") % sys.version.replace('\n', '')) +
> +                    (_("** Mercurial Distributed SCM (version %s)\n") % myver) +
> +                    (_("** Extensions loaded: %s\n") %
> +                     ", ".join([x[0] for x in extensions.extensions()])))
> +        ui.warn(warning)
>         raise
> 
>     return -1
> 
> +def tuplever(v):
> +    return tuple([int(i) for i in v.split('.')])
> +
> +
> def aliasargs(fn, givenargs):
>     args = getattr(fn, 'args', [])
>     if args:
> diff --git a/tests/test-extension.t b/tests/test-extension.t
> --- a/tests/test-extension.t
> +++ b/tests/test-extension.t
> @@ -478,3 +478,60 @@
>   hg: unknown command 'foo'
>   warning: error finding commands in $TESTTMP/hgext/forest.py (glob)
>   [255]
> +
> +  $ cat > throw.py <<EOF
> +  > from mercurial import cmdutil, commands
> +  > cmdtable = {}
> +  > command = cmdutil.command(cmdtable)
> +  > class Bogon(Exception): pass
> +  > 
> +  > @command('throw', [], 'hg throw')
> +  > def throw(ui, **opts):
> +  >     """throws an exception"""
> +  >     raise Bogon()
> +  > commands.norepo += " throw"
> +  > EOF
> +No declared supported version, extension complains:
> +  $ hg --config extensions.throw=throw.py throw 2>&1 | egrep '^\*\*'
> +  ** Unknown exception encountered with possibly-broken third-party extension throw
> +  ** which supports versions unknown of Mercurial.
> +  ** Please disable throw and try your action again.
> +  ** If that fixes the bug please report it to the extension author.
> +  ** Python * (glob)
> +  ** Mercurial Distributed SCM * (glob)
> +  ** Extensions loaded: throw
> +If the extension specifies a buglink, show that:
> +  $ echo 'buglink = "http://example.com/bts"' >> throw.py
> +  $ rm -f throw.pyc throw.pyo
> +  $ hg --config extensions.throw=throw.py throw 2>&1 | egrep '^\*\*'
> +  ** Unknown exception encountered with possibly-broken third-party extension throw
> +  ** which supports versions unknown 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)
> +  ** Mercurial Distributed SCM (*) (glob)
> +  ** Extensions loaded: throw
> +If the extensions declare outdated versions, accuse the older extension first:
> +  $ echo "testedwith = '1.9.3'" >> older.py
> +  $ echo "testedwith = '2.1.1'" >> throw.py
> +  $ rm -f throw.pyc throw.pyo
> +  $ 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.
> +  ** Please disable older and try your action again.
> +  ** If that fixes the bug please report it to the extension author.
> +  ** Python * (glob)
> +  ** Mercurial Distributed SCM (*) (glob)
> +  ** Extensions loaded: throw, older
> +
> +Declare the version as supporting this hg version, show regular bts link:
> +  $ hgver=$(python -c 'from mercurial import util; print util.version().split("+")[0]')
> +  $ echo 'testedwith = """'"$hgver"'"""' >> 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
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list