changeset 50014:8f76a41ee465

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.
author Arun Kulshreshtha <akulshreshtha@janestreet.com>
date Thu, 19 Jan 2023 11:12:20 -0500
parents 86958104b6ca
children 70b4c7af9cdb
files mercurial/debugcommands.py tests/test-completion.t tests/test-debugcommands.t
diffstat 3 files changed, 27 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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