# HG changeset patch # User Arun Kulshreshtha # Date 1674144740 18000 # Node ID 8f76a41ee46571727558c2f797b531c14e00b551 # Parent 86958104b6cadafe587843a253cf0fa6cd00fe64 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. diff -r 86958104b6ca -r 8f76a41ee465 mercurial/debugcommands.py --- 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) diff -r 86958104b6ca -r 8f76a41ee465 tests/test-completion.t --- 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 diff -r 86958104b6ca -r 8f76a41ee465 tests/test-debugcommands.t --- 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