diff --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py --- a/mercurial/debugcommands.py +++ b/mercurial/debugcommands.py @@ -3786,8 +3786,21 @@ def debugsub(ui, repo, rev=None): 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 @@ def debugshell(ui, repo): 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 --git a/tests/test-completion.t b/tests/test-completion.t --- a/tests/test-completion.t +++ b/tests/test-completion.t @@ -328,7 +328,7 @@ Show all commands + options 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 --git a/tests/test-debugcommands.t b/tests/test-debugcommands.t --- a/tests/test-debugcommands.t +++ b/tests/test-debugcommands.t @@ -724,3 +724,8 @@ Test debugpeer pushable: yes #endif + +Test debugshell + + $ hg debugshell -c 'ui.write(b"%s\n" % ui.username())' + test