diff mercurial/debugcommands.py @ 49944: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 88b81dc2d82b
children 637d46c5b1fa
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)