Patchwork [2,of,2,V2] traceback: allow providing of a local support contact point

login
register
mail settings
Submitter Pierre-Yves David
Date Sept. 17, 2015, 7:11 p.m.
Message ID <224402df539757ac09d1.1442517095@marginatus.alto.octopoid.net>
Download mbox | patch
Permalink /patch/10526/
State Rejected
Headers show

Comments

Pierre-Yves David - Sept. 17, 2015, 7:11 p.m.
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david@fb.com>
# Date 1442000719 25200
#      Fri Sep 11 12:45:19 2015 -0700
# Node ID 224402df539757ac09d1ec0b0f707aa8fab75634
# Parent  75a8b3abe7bc407e84153134dadfa3815443210d
traceback: allow providing of a local support contact point

The extensions blaming code is fine for casual users but pretty terrible for
corporate environments that can deploy a large amount of extensions to
unsuspecting users. Reports will likely blame a random "innocent" extension (in
our case crecord) and the hint in the message will triggers endless debug
attempts from the user.

We introduce a "ui.supportcontact" option that allow such big company to redirect
their users to their own support desk. This disables all extensions blaming and
just point people to the local support in all cases.
Augie Fackler - Sept. 22, 2015, 7:03 p.m.
On Thu, Sep 17, 2015 at 12:11:35PM -0700, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david@fb.com>
> # Date 1442000719 25200
> #      Fri Sep 11 12:45:19 2015 -0700
> # Node ID 224402df539757ac09d1ec0b0f707aa8fab75634
> # Parent  75a8b3abe7bc407e84153134dadfa3815443210d
> traceback: allow providing of a local support contact point

This appears to be queued as bf2bfc6f45fb.

>
> The extensions blaming code is fine for casual users but pretty terrible for
> corporate environments that can deploy a large amount of extensions to
> unsuspecting users. Reports will likely blame a random "innocent" extension (in
> our case crecord) and the hint in the message will triggers endless debug
> attempts from the user.
>
> We introduce a "ui.supportcontact" option that allow such big company to redirect
> their users to their own support desk. This disables all extensions blaming and
> just point people to the local support in all cases.
>
> diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
> --- a/mercurial/dispatch.py
> +++ b/mercurial/dispatch.py
> @@ -333,11 +333,11 @@ def _runcatch(req):
>          # 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, ''
> -        if True:
> +        if ui.config('ui', 'supportcontact', None) is None:
>              for name, mod in extensions.extensions():
>                  testedwith = getattr(mod, 'testedwith', '')
>                  report = getattr(mod, 'buglink', _('the extension author.'))
>                  if not testedwith.strip():
>                      # We found an untested extension. It's likely the culprit.
> @@ -365,13 +365,15 @@ def _runcatch(req):
>                           '** 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:
> +            bugtracker = ui.config('ui', 'supportcontact', None)
> +            if bugtracker is None:
> +                bugtracker = _("http://mercurial.selenic.com/wiki/BugTracker")
>              warning = (_("** unknown exception encountered, "
> -                         "please report by visiting\n") +
> -                       _("** http://mercurial.selenic.com/wiki/BugTracker\n"))
> +                         "please report by visiting\n** ") + 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.log("commandexception", "%s\n%s\n", warning, traceback.format_exc())
> diff --git a/mercurial/help/config.txt b/mercurial/help/config.txt
> --- a/mercurial/help/config.txt
> +++ b/mercurial/help/config.txt
> @@ -1509,10 +1509,15 @@ User interface controls.
>      abbreviations. True or False. (default: False)
>
>  ``style``
>      Name of style to use for command output.
>
> +``supportcontact``
> +    Location pointed at in Mercurial traceback for reporting crash. Use this if
> +    you are a large organisation with it's own Mercurial deployement process and
> +    crash reports should be addressed to your internal support.
> +
>  ``timeout``
>      The timeout used when a lock is held (in seconds), a negative value
>      means no timeout. (default: 600)
>
>  ``traceback``
> diff --git a/tests/test-extension.t b/tests/test-extension.t
> --- a/tests/test-extension.t
> +++ b/tests/test-extension.t
> @@ -941,10 +941,19 @@ Older extension is tested with current v
>    ** If that fixes the bug please report it to http://example.com/bts
>    ** Python * (glob)
>    ** Mercurial Distributed SCM (version 1.9.3)
>    ** Extensions loaded: throw, older
>
> +Ability to point to a different point
> +  $ hg --config extensions.throw=throw.py --config extensions.older=older.py \
> +  >   --config ui.supportcontact='Your Local Goat Lenders' throw 2>&1 | egrep '^\*\*'
> +  ** unknown exception encountered, please report by visiting
> +  ** Your Local Goat Lenders
> +  ** 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
>    $ if [ -z "$hgver" ]; then
>    >   echo "unable to fetch a mercurial version. Make sure __version__ is correct";
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel

Patch

diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
--- a/mercurial/dispatch.py
+++ b/mercurial/dispatch.py
@@ -333,11 +333,11 @@  def _runcatch(req):
         # 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, ''
-        if True:
+        if ui.config('ui', 'supportcontact', None) is None:
             for name, mod in extensions.extensions():
                 testedwith = getattr(mod, 'testedwith', '')
                 report = getattr(mod, 'buglink', _('the extension author.'))
                 if not testedwith.strip():
                     # We found an untested extension. It's likely the culprit.
@@ -365,13 +365,15 @@  def _runcatch(req):
                          '** 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:
+            bugtracker = ui.config('ui', 'supportcontact', None)
+            if bugtracker is None:
+                bugtracker = _("http://mercurial.selenic.com/wiki/BugTracker")
             warning = (_("** unknown exception encountered, "
-                         "please report by visiting\n") +
-                       _("** http://mercurial.selenic.com/wiki/BugTracker\n"))
+                         "please report by visiting\n** ") + 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.log("commandexception", "%s\n%s\n", warning, traceback.format_exc())
diff --git a/mercurial/help/config.txt b/mercurial/help/config.txt
--- a/mercurial/help/config.txt
+++ b/mercurial/help/config.txt
@@ -1509,10 +1509,15 @@  User interface controls.
     abbreviations. True or False. (default: False)
 
 ``style``
     Name of style to use for command output.
 
+``supportcontact``
+    Location pointed at in Mercurial traceback for reporting crash. Use this if
+    you are a large organisation with it's own Mercurial deployement process and
+    crash reports should be addressed to your internal support.
+
 ``timeout``
     The timeout used when a lock is held (in seconds), a negative value
     means no timeout. (default: 600)
 
 ``traceback``
diff --git a/tests/test-extension.t b/tests/test-extension.t
--- a/tests/test-extension.t
+++ b/tests/test-extension.t
@@ -941,10 +941,19 @@  Older extension is tested with current v
   ** If that fixes the bug please report it to http://example.com/bts
   ** Python * (glob)
   ** Mercurial Distributed SCM (version 1.9.3)
   ** Extensions loaded: throw, older
 
+Ability to point to a different point
+  $ hg --config extensions.throw=throw.py --config extensions.older=older.py \
+  >   --config ui.supportcontact='Your Local Goat Lenders' throw 2>&1 | egrep '^\*\*'
+  ** unknown exception encountered, please report by visiting
+  ** Your Local Goat Lenders
+  ** 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
   $ if [ -z "$hgver" ]; then
   >   echo "unable to fetch a mercurial version. Make sure __version__ is correct";