debugshell: allow commands to be specified as a CLI argument
Add a `--command` option to `hg debugshell` that allows the user to pass in
Python code to evaluate directly from the command line. This was inspired by
the `--command` option present in Facebook's Sapling fork of Mercurial,
which in turn was inspired by the `-c` option of the Python interpreter
itself. It is particularly useful for writing tests, especially for getting
visibility into things that otherwise aren't exposed via debug commands.
--- a/mercurial/debugcommands.py Tue Jan 10 11:40:19 2023 +0100
+++ b/mercurial/debugcommands.py Thu Jan 19 11:12:20 2023 -0500
@@ -3786,8 +3786,21 @@
ui.writenoi18n(b' revision %s\n' % v[1])
-@command(b'debugshell', optionalrepo=True)
-def debugshell(ui, repo):
+@command(
+ b'debugshell',
+ [
+ (
+ b'c',
+ b'command',
+ b'',
+ _(b'program passed in as a string'),
+ _(b'COMMAND'),
+ )
+ ],
+ _(b'[-c COMMAND]'),
+ optionalrepo=True,
+)
+def debugshell(ui, repo, **opts):
"""run an interactive Python interpreter
The local namespace is provided with a reference to the ui and
@@ -3815,6 +3828,12 @@
except ImportError:
site = None # Keep PyCharm happy
+ command = opts.get('command')
+ if command:
+ compiled = code.compile_command(encoding.strfromlocal(command))
+ code.InteractiveInterpreter(locals=imported_objects).runcode(compiled)
+ return
+
code.interact(local=imported_objects)
--- a/tests/test-completion.t Tue Jan 10 11:40:19 2023 +0100
+++ b/tests/test-completion.t Thu Jan 19 11:12:20 2023 -0500
@@ -328,7 +328,7 @@
debugrevspec: optimize, show-revs, show-set, show-stage, no-optimized, verify-optimized
debugserve: sshstdio, logiofd, logiofile
debugsetparents:
- debugshell:
+ debugshell: command
debugsidedata: changelog, manifest, dir
debugssl:
debugstrip: rev, force, no-backup, nobackup, , keep, bookmark, soft
--- a/tests/test-debugcommands.t Tue Jan 10 11:40:19 2023 +0100
+++ b/tests/test-debugcommands.t Thu Jan 19 11:12:20 2023 -0500
@@ -724,3 +724,8 @@
pushable: yes
#endif
+
+Test debugshell
+
+ $ hg debugshell -c 'ui.write(b"%s\n" % ui.username())'
+ test