annotate sat_frontends/jp/cmd_shell.py @ 3366:e09cb08166a3

plugin XEP-0329, core(xmpp): moved `_compParseJids` to `SatXMPPComponent`: This method to retrieve owner and peer JID from an element is generally useful for components, thus it has been moved. The part to retrieve owner JID from local JID has been splitted in its own `getOwnerFromJid` method.
author Goffi <goffi@goffi.org>
date Sun, 20 Sep 2020 14:04:11 +0200
parents 559a625a236b
children 2f0be2b7de68
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
1 #!/usr/bin/env python3
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
3
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # jp: a SàT command line tool
3136
9d0df638c8b4 dates update
Goffi <goffi@goffi.org>
parents: 3040
diff changeset
5 # Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org)
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
6
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
11
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
16
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
19
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
20
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
21 import cmd
2313
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
22 import sys
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
23 import shlex
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
24 import subprocess
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
25 from . import base
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 from sat.core.i18n import _
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
27 from sat.core import exceptions
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 from sat_frontends.jp.constants import Const as C
2315
8d9bd5d77336 jp (arg_tools): moved get_cmd_choices, get_use_args and escape to a new arg_tools module, so they can be used in other commands than shell
Goffi <goffi@goffi.org>
parents: 2313
diff changeset
29 from sat_frontends.jp import arg_tools
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
30 from sat.tools.common.ansi import ANSI as A
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
31
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 __commands__ = ["Shell"]
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
33 INTRO = _(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
34 """Welcome to {app_name} shell, the Salut à Toi shell !
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
35
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 This enrironment helps you using several {app_name} commands with similar parameters.
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
37
2354
5129a0506739 jp (shell): fixed use of profile + added EOF handling:
Goffi <goffi@goffi.org>
parents: 2317
diff changeset
38 To quit, just enter "quit" or press C-d.
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 Enter "help" or "?" to know what to do
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
40 """
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
41 ).format(app_name=C.APP_NAME)
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
42
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
43
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 class Shell(base.CommandBase, cmd.Cmd):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 def __init__(self, host):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
46 base.CommandBase.__init__(
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
47 self, host, "shell",
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
48 help=_("launch jp in shell (REPL) mode")
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
49 )
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
50 cmd.Cmd.__init__(self)
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
51
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
52 def parse_args(self, args):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
53 """parse line arguments"""
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
54 return shlex.split(args, posix=True)
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
55
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 def update_path(self):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
57 self._cur_parser = self.host.parser
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
58 self.help = ""
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 for idx, path_elt in enumerate(self.path):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
60 try:
2315
8d9bd5d77336 jp (arg_tools): moved get_cmd_choices, get_use_args and escape to a new arg_tools module, so they can be used in other commands than shell
Goffi <goffi@goffi.org>
parents: 2313
diff changeset
61 self._cur_parser = arg_tools.get_cmd_choices(path_elt, self._cur_parser)
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
62 except exceptions.NotFound:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
63 self.disp(_("bad command path"), error=True)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
64 self.path = self.path[:idx]
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
65 break
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
66 else:
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
67 self.help = self._cur_parser
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
68
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
69 self.prompt = A.color(C.A_PROMPT_PATH, "/".join(self.path)) + A.color(
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
70 C.A_PROMPT_SUF, "> "
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
71 )
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
72 try:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
73 self.actions = list(arg_tools.get_cmd_choices(parser=self._cur_parser).keys())
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
74 except exceptions.NotFound:
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
75 self.actions = []
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
76
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
77 def add_parser_options(self):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
78 pass
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
79
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
80 def format_args(self, args):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
81 """format argument to be printed with quotes if needed"""
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
82 for arg in args:
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
83 if " " in arg:
2315
8d9bd5d77336 jp (arg_tools): moved get_cmd_choices, get_use_args and escape to a new arg_tools module, so they can be used in other commands than shell
Goffi <goffi@goffi.org>
parents: 2313
diff changeset
84 yield arg_tools.escape(arg)
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
85 else:
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
86 yield arg
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
87
2313
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
88 def run_cmd(self, args, external=False):
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
89 """run command and retur exit code
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
90
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
91 @param args[list[string]]: arguments of the command
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
92 must not include program name
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
93 @param external(bool): True if it's an external command (i.e. not jp)
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
94 @return (int): exit code (0 success, any other int failure)
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
95 """
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
96 # FIXME: we have to use subprocess
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
97 # and relaunch whole python for now
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
98 # because if host.quit() is called in D-Bus callback
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
99 # GLib quit the whole app without possibility to stop it
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
100 # didn't found a nice way to work around it so far
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
101 # Situation should be better when we'll move away from python-dbus
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
102 if self.verbose:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
103 self.disp(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
104 _("COMMAND {external}=> {args}").format(
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
105 external=_("(external) ") if external else "",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
106 args=" ".join(self.format_args(args)),
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
107 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
108 )
2313
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
109 if not external:
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
110 args = sys.argv[0:1] + args
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
111 ret_code = subprocess.call(args)
2313
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
112 # XXX: below is a way to launch the command without creating a new process
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
113 # may be used when a solution to the aforementioned issue is there
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
114 # try:
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
115 # self.host.run(args)
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
116 # except SystemExit as e:
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
117 # ret_code = e.code
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
118 # except Exception as e:
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
119 # self.disp(A.color(C.A_FAILURE, u'command failed with an exception: {msg}'.format(msg=e)), error=True)
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
120 # ret_code = 1
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
121 # else:
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
122 # ret_code = 0
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
123
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
124 if ret_code != 0:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
125 self.disp(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
126 A.color(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
127 C.A_FAILURE,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
128 "command failed with an error code of {err_no}".format(
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
129 err_no=ret_code
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
130 ),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
131 ),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
132 error=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
133 )
2313
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
134 return ret_code
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
135
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
136 def default(self, args):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
137 """called when no shell command is recognized
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
138
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
139 will launch the command with args on the line
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
140 (i.e. will launch do [args])
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
141 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
142 if args == "EOF":
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
143 self.do_quit("")
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
144 self.do_do(args)
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
145
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
146 def do_help(self, args):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
147 """show help message"""
2310
5996063ecad7 jp (shell): don't print header if a command is specified in help
Goffi <goffi@goffi.org>
parents: 2309
diff changeset
148 if not args:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
149 self.disp(A.color(C.A_HEADER, _("Shell commands:")), no_lf=True)
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
150 super(Shell, self).do_help(args)
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 if not args:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
152 self.disp(A.color(C.A_HEADER, _("Action commands:")))
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
153 help_list = self._cur_parser.format_help().split("\n\n")
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
154 print(("\n\n".join(help_list[1 if self.path else 2 :])))
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
155
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
156 # FIXME: debug crashes on exit and is not that useful,
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
157 # keeping it until refactoring, may be removed entirely then
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
158 # def do_debug(self, args):
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
159 # """launch internal debugger"""
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
160 # try:
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
161 # import ipdb as pdb
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
162 # except ImportError:
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
163 # import pdb
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
164 # pdb.set_trace()
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
165
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
166 def do_verbose(self, args):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
167 """show verbose mode, or (de)activate it"""
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
168 args = self.parse_args(args)
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
169 if args:
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
170 self.verbose = C.bool(args[0])
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
171 self.disp(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
172 _("verbose mode is {status}").format(
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
173 status=_("ENABLED") if self.verbose else _("DISABLED")
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
174 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
175 )
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
176
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
177 def do_cmd(self, args):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
178 """change command path"""
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
179 if args == "..":
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
180 self.path = self.path[:-1]
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
181 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
182 if not args or args[0] == "/":
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
183 self.path = []
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
184 args = "/".join(args.split())
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
185 for path_elt in args.split("/"):
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
186 path_elt = path_elt.strip()
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
187 if not path_elt:
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
188 continue
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
189 self.path.append(path_elt)
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
190 self.update_path()
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
191
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
192 def do_version(self, args):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
193 """show current SàT/jp version"""
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
194 self.run_cmd(['--version'])
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
195
2313
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
196 def do_shell(self, args):
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
197 """launch an external command (you can use ![command] too)"""
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
198 args = self.parse_args(args)
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
199 self.run_cmd(args, external=True)
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
200
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
201 def do_do(self, args):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
202 """lauch a command"""
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
203 args = self.parse_args(args)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
204 if (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
205 self._not_default_profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
206 and not "-p" in args
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
207 and not "--profile" in args
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
208 and not "profile" in self.use
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
209 ):
2354
5129a0506739 jp (shell): fixed use of profile + added EOF handling:
Goffi <goffi@goffi.org>
parents: 2317
diff changeset
210 # profile is not specified and we are not using the default profile
5129a0506739 jp (shell): fixed use of profile + added EOF handling:
Goffi <goffi@goffi.org>
parents: 2317
diff changeset
211 # so we need to add it in arguments to use current user profile
5129a0506739 jp (shell): fixed use of profile + added EOF handling:
Goffi <goffi@goffi.org>
parents: 2317
diff changeset
212 if self.verbose:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
213 self.disp(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
214 _("arg profile={profile} (logged profile)").format(
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
215 profile=self.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
216 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
217 )
2354
5129a0506739 jp (shell): fixed use of profile + added EOF handling:
Goffi <goffi@goffi.org>
parents: 2317
diff changeset
218 use = self.use.copy()
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
219 use["profile"] = self.profile
2354
5129a0506739 jp (shell): fixed use of profile + added EOF handling:
Goffi <goffi@goffi.org>
parents: 2317
diff changeset
220 else:
5129a0506739 jp (shell): fixed use of profile + added EOF handling:
Goffi <goffi@goffi.org>
parents: 2317
diff changeset
221 use = self.use
5129a0506739 jp (shell): fixed use of profile + added EOF handling:
Goffi <goffi@goffi.org>
parents: 2317
diff changeset
222
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
223 # args may be modified by use_args
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
224 # to remove subparsers from it
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
225 parser_args, use_args = arg_tools.get_use_args(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
226 self.host, args, use, verbose=self.verbose, parser=self._cur_parser
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
227 )
2317
f4e05600577b jp (arg_tools): args is not modified anymore in get_use_args + fixed args returned + parser_args are returned separatly (return is now a tuple)
Goffi <goffi@goffi.org>
parents: 2315
diff changeset
228 cmd_args = self.path + parser_args + use_args
2313
6ff5212997c7 jp (shell): use of subprocess instead of running commands in the same process:
Goffi <goffi@goffi.org>
parents: 2311
diff changeset
229 self.run_cmd(cmd_args)
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
230
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
231 def do_use(self, args):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
232 """fix an argument"""
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
233 args = self.parse_args(args)
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
234 if not args:
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
235 if not self.use:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
236 self.disp(_("no argument in USE"))
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
237 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
238 self.disp(_("arguments in USE:"))
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
239 for arg, value in self.use.items():
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
240 self.disp(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
241 _(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
242 A.color(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
243 C.A_SUBHEADER,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
244 arg,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
245 A.RESET,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
246 " = ",
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
247 arg_tools.escape(value),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
248 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
249 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
250 )
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
251 elif len(args) != 2:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
252 self.disp("bad syntax, please use:\nuse [arg] [value]", error=True)
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
253 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
254 self.use[args[0]] = " ".join(args[1:])
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
255 if self.verbose:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
256 self.disp(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
257 "set {name} = {value}".format(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
258 name=args[0], value=arg_tools.escape(args[1])
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
259 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
260 )
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
261
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
262 def do_use_clear(self, args):
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
263 """unset one or many argument(s) in USE, or all of them if no arg is specified"""
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
264 args = self.parse_args(args)
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
265 if not args:
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
266 self.use.clear()
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
267 else:
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
268 for arg in args:
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
269 try:
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
270 del self.use[arg]
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
271 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
272 self.disp(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
273 A.color(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
274 C.A_FAILURE, _("argument {name} not found").format(name=arg)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
275 ),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
276 error=True,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
277 )
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
278 else:
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
279 if self.verbose:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
280 self.disp(_("argument {name} removed").format(name=arg))
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
281
2311
a42a2478abd2 jp (shell): added "whoami" command to print currently used profile
Goffi <goffi@goffi.org>
parents: 2310
diff changeset
282 def do_whoami(self, args):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
283 """print profile currently used"""
2311
a42a2478abd2 jp (shell): added "whoami" command to print currently used profile
Goffi <goffi@goffi.org>
parents: 2310
diff changeset
284 self.disp(self.profile)
a42a2478abd2 jp (shell): added "whoami" command to print currently used profile
Goffi <goffi@goffi.org>
parents: 2310
diff changeset
285
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
286 def do_quit(self, args):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
287 """quit the shell"""
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
288 self.disp(_("good bye!"))
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
289 self.host.quit()
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
290
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
291 def do_exit(self, args):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
292 """alias for quit"""
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
293 self.do_quit(args)
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
294
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
295 async def start(self):
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
296 # FIXME: "shell" is currently kept synchronous as it works well as it
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
297 # and it will be refactored soon.
2354
5129a0506739 jp (shell): fixed use of profile + added EOF handling:
Goffi <goffi@goffi.org>
parents: 2317
diff changeset
298 default_profile = self.host.bridge.profileNameGet(C.PROF_KEY_DEFAULT)
5129a0506739 jp (shell): fixed use of profile + added EOF handling:
Goffi <goffi@goffi.org>
parents: 2317
diff changeset
299 self._not_default_profile = self.profile != default_profile
2309
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
300 self.path = []
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
301 self._cur_parser = self.host.parser
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
302 self.use = {}
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
303 self.verbose = False
c7a72b75232b jp (shell): shell command (REPL mode), first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
304 self.update_path()
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
305 self.cmdloop(INTRO)