[PATCH 7 of 7] remotedebug: allow to request --traceback from the remote server
Paul Morelle
paul.morelle at octobus.net
Wed Jun 20 12:36:28 EDT 2018
# HG changeset patch
# User Boris Feld <boris.feld at octobus.net>
# Date 1529494410 -7200
# Wed Jun 20 13:33:30 2018 +0200
# Node ID aa4b26d92e20d95323929a306b3d63c44ceb3d69
# Parent f663c257cf788d3f3d00398dbf64d9b572536377
# EXP-Topic remote-debug
# Available At https://bitbucket.org/octobus/mercurial-devel/
# hg pull https://bitbucket.org/octobus/mercurial-devel/ -r aa4b26d92e20
remotedebug: allow to request --traceback from the remote server
Getting a full traceback is useful in the case of a crash.
This changeset makes it possible for an authorized user to receive it
from the client side.
diff -r f663c257cf78 -r aa4b26d92e20 mercurial/configitems.py
--- a/mercurial/configitems.py Wed Jun 20 13:00:41 2018 +0200
+++ b/mercurial/configitems.py Wed Jun 20 13:33:30 2018 +0200
@@ -345,6 +345,9 @@
coreconfigitem('devel', 'remote.profile',
default=False,
)
+coreconfigitem('devel', 'remote.traceback',
+ default=False,
+)
coreconfigitem('devel', 'servercafile',
default='',
)
diff -r f663c257cf78 -r aa4b26d92e20 mercurial/dispatch.py
--- a/mercurial/dispatch.py Wed Jun 20 13:00:41 2018 +0200
+++ b/mercurial/dispatch.py Wed Jun 20 13:33:30 2018 +0200
@@ -297,7 +297,7 @@
if not ('*' in rd_access or user in rd_access) and other_args:
unsafe()
while other_args:
- if other_args[0] in ('--debug', '--profile'):
+ if other_args[0] in ('--debug', '--profile', '--traceback'):
other_args.pop(0)
else:
unsafe()
diff -r f663c257cf78 -r aa4b26d92e20 mercurial/sshpeer.py
--- a/mercurial/sshpeer.py Wed Jun 20 13:00:41 2018 +0200
+++ b/mercurial/sshpeer.py Wed Jun 20 13:33:30 2018 +0200
@@ -154,6 +154,8 @@
serverspawn += ' --debug'
if ui.configbool('devel', 'remote.profile'):
serverspawn += ' --profile'
+ if ui.configbool('devel', 'remote.traceback'):
+ serverspawn += ' --traceback'
cmd = '%s %s %s' % (sshcmd, args, procutil.shellquote(serverspawn))
ui.debug('running %s\n' % cmd)
cmd = procutil.quotecommand(cmd)
diff -r f663c257cf78 -r aa4b26d92e20 tests/test-remote-debugging.t
--- a/tests/test-remote-debugging.t Wed Jun 20 13:00:41 2018 +0200
+++ b/tests/test-remote-debugging.t Wed Jun 20 13:33:30 2018 +0200
@@ -106,11 +106,71 @@
remote: Sample count: * (glob)
remote: Total time: * seconds (* wall) (glob)
+Test basic remote traceback output
+----------------------------------
+
+ $ echo 'raise Exception("This extensions is broken")' > $TESTTMP/badext.py
+ $ cat << EOF >> $TESTTMP/remote/.hg/hgrc
+ > [extensions]
+ > bad=$TESTTMP/badext.py
+ > EOF
+
+ $ hg pull --config "devel.remote.traceback=yes"
+ pulling from ssh://user@dummy/remote/
+ remote: *** failed to import extension bad from $TESTTMP/badext.py: This extensions is broken
+ remote: Traceback (most recent call last):
+ remote: File "*/mercurial/extensions.py", line *, in loadall (glob)
+ remote: load(ui, name, path)
+ remote: File "*/mercurial/extensions.py", line *, in load (glob)
+ remote: mod = _importext(name, path, bind(_reportimporterror, ui))
+ remote: File "*/mercurial/extensions.py", line *, in _importext (glob)
+ remote: mod = loadpath(path, 'hgext.%s' % name)
+ remote: File "*/mercurial/extensions.py", line *, in loadpath (glob)
+ remote: return imp.load_source(module_name, path)
+ remote: File "$TESTTMP/badext.py", line 1, in <module> (glob)
+ remote: raise Exception("This extensions is broken")
+ remote: Exception: This extensions is broken
+ searching for changes
+ no changes found
+ remote: Traceback (most recent call last):
+ remote: File "*/mercurial/scmutil.py", line *, in callcatch (glob)
+ remote: return func()
+ remote: File "*/mercurial/dispatch.py", line *, in _runcatchfunc (glob)
+ remote: return _dispatch(req)
+ remote: File "*/mercurial/dispatch.py", line *, in _dispatch (glob)
+ remote: cmdpats, cmdoptions)
+ remote: File "*/mercurial/dispatch.py", line *, in runcommand (glob)
+ remote: ret = _runcommand(ui, options, cmd, d)
+ remote: File "*/mercurial/dispatch.py", line *, in _runcommand (glob)
+ remote: return cmdfunc()
+ remote: File "*/mercurial/dispatch.py", line *, in <lambda> (glob)
+ remote: d = lambda: util.checksignature(func)(ui, *args, **strcmdopt)
+ remote: File "*/mercurial/util.py", line 1556, in check (glob)
+ remote: return func(*args, **kwargs)
+ remote: File "*/mercurial/commands.py", line *, in serve (glob)
+ remote: s.serve_forever()
+ remote: File "*/mercurial/wireprotoserver.py", line *, in serve_forever (glob)
+ remote: sys.exit(0)
+ remote: SystemExit: 0
+
Test basic combined remote debug option
---------------------------------------
- $ hg pull --config "devel.remote.debug=yes" --config "devel.remote.profile=yes" | grep -v --extended-regexp 'line +[0-9]+:'
+ $ hg pull --config "devel.remote.debug=yes" --config "devel.remote.profile=yes" --config "devel.remote.traceback=yes" | grep -v --extended-regexp 'line +[0-9]+:'
pulling from ssh://user@dummy/remote/
+ remote: *** failed to import extension bad from $TESTTMP/badext.py: This extensions is broken
+ remote: Traceback (most recent call last):
+ remote: File "*/mercurial/extensions.py", line *, in loadall (glob)
+ remote: load(ui, name, path)
+ remote: File "*/mercurial/extensions.py", line *, in load (glob)
+ remote: mod = _importext(name, path, bind(_reportimporterror, ui))
+ remote: File "*/mercurial/extensions.py", line *, in _importext (glob)
+ remote: mod = loadpath(path, 'hgext.%s' % name)
+ remote: File "*/mercurial/extensions.py", line *, in loadpath (glob)
+ remote: return imp.load_source(module_name, path)
+ remote: File "$TESTTMP/badext.py", line 1, in <module> (glob)
+ remote: raise Exception("This extensions is broken")
+ remote: Exception: This extensions is broken
searching for changes
no changes found
remote: listing keys for "bookmarks"
@@ -120,3 +180,23 @@
remote: ---
remote: Sample count: * (glob)
remote: Total time: * seconds (* wall) (glob)
+ remote: Traceback (most recent call last):
+ remote: File "*/mercurial/scmutil.py", line *, in callcatch (glob)
+ remote: return func()
+ remote: File "*/mercurial/dispatch.py", line *, in _runcatchfunc (glob)
+ remote: return _dispatch(req)
+ remote: File "*/mercurial/dispatch.py", line *, in _dispatch (glob)
+ remote: cmdpats, cmdoptions)
+ remote: File "*/mercurial/dispatch.py", line *, in runcommand (glob)
+ remote: ret = _runcommand(ui, options, cmd, d)
+ remote: File "*/mercurial/dispatch.py", line *, in _runcommand (glob)
+ remote: return cmdfunc()
+ remote: File "*/mercurial/dispatch.py", line *, in <lambda> (glob)
+ remote: d = lambda: util.checksignature(func)(ui, *args, **strcmdopt)
+ remote: File "*/mercurial/util.py", line 1556, in check (glob)
+ remote: return func(*args, **kwargs)
+ remote: File "*/mercurial/commands.py", line *, in serve (glob)
+ remote: s.serve_forever()
+ remote: File "*/mercurial/wireprotoserver.py", line *, in serve_forever (glob)
+ remote: sys.exit(0)
+ remote: SystemExit: 0
More information about the Mercurial-devel
mailing list