summaryrefslogtreecommitdiff
path: root/cmd2
diff options
context:
space:
mode:
authorKevin Van Brunt <kmvanbrunt@gmail.com>2020-09-30 14:19:13 -0400
committerKevin Van Brunt <kmvanbrunt@gmail.com>2020-09-30 20:36:46 -0400
commit018c329a4df9f3b84227cf33a14f9482f3e7eb2a (patch)
treeaaaedcef9a4391b9952d0da48e54e8672ef738c1 /cmd2
parented7b9e5185fd14808aa26e61a26968b9753beee0 (diff)
downloadcmd2-git-018c329a4df9f3b84227cf33a14f9482f3e7eb2a.tar.gz
Fixed issue where quoted redirectors and terminators in aliases and macros were not being
restored when read from a startup script.
Diffstat (limited to 'cmd2')
-rw-r--r--cmd2/cmd2.py70
-rw-r--r--cmd2/utils.py30
2 files changed, 75 insertions, 25 deletions
diff --git a/cmd2/cmd2.py b/cmd2/cmd2.py
index d1a26a2b..8810025a 100644
--- a/cmd2/cmd2.py
+++ b/cmd2/cmd2.py
@@ -2821,20 +2821,39 @@ class Cmd(cmd.Cmd):
@as_subcommand_to('alias', 'list', alias_list_parser, help=alias_delete_help)
def _alias_list(self, args: argparse.Namespace) -> None:
- """List some or all aliases"""
+ """List some or all aliases as 'alias create' commands"""
create_cmd = "alias create"
if args.with_silent:
create_cmd += " --silent"
+ tokens_to_quote = constants.REDIRECTION_TOKENS
+ tokens_to_quote.extend(self.statement_parser.terminators)
+
if args.names:
- for cur_name in utils.remove_duplicates(args.names):
- if cur_name in self.aliases:
- self.poutput("{} {} {}".format(create_cmd, cur_name, self.aliases[cur_name]))
- else:
- self.perror("Alias '{}' not found".format(cur_name))
+ to_list = utils.remove_duplicates(args.names)
else:
- for cur_alias in sorted(self.aliases, key=self.default_sort_key):
- self.poutput("{} {} {}".format(create_cmd, cur_alias, self.aliases[cur_alias]))
+ to_list = sorted(self.aliases, key=self.default_sort_key)
+
+ not_found = [] # type: List[str]
+ for name in to_list:
+ if name not in self.aliases:
+ not_found.append(name)
+ continue
+
+ # Quote redirection and terminator tokens for the 'alias create' command
+ tokens = shlex_split(self.aliases[name])
+ command = tokens[0]
+ args = tokens[1:]
+ utils.quote_specific_tokens(args, tokens_to_quote)
+
+ val = command
+ if args:
+ val += ' ' + ' '.join(args)
+
+ self.poutput("{} {} {}".format(create_cmd, name, val))
+
+ for name in not_found:
+ self.perror("Alias '{}' not found".format(name))
#############################################################
# Parsers and functions for macro command and subcommands
@@ -3029,20 +3048,39 @@ class Cmd(cmd.Cmd):
@as_subcommand_to('macro', 'list', macro_list_parser, help=macro_list_help)
def _macro_list(self, args: argparse.Namespace) -> None:
- """List some or all macros"""
+ """List some or all macros as 'macro create' commands"""
create_cmd = "macro create"
if args.with_silent:
create_cmd += " --silent"
+ tokens_to_quote = constants.REDIRECTION_TOKENS
+ tokens_to_quote.extend(self.statement_parser.terminators)
+
if args.names:
- for cur_name in utils.remove_duplicates(args.names):
- if cur_name in self.macros:
- self.poutput("{} {} {}".format(create_cmd, cur_name, self.macros[cur_name].value))
- else:
- self.perror("Macro '{}' not found".format(cur_name))
+ to_list = utils.remove_duplicates(args.names)
else:
- for cur_macro in sorted(self.macros, key=self.default_sort_key):
- self.poutput("{} {} {}".format(create_cmd, cur_macro, self.macros[cur_macro].value))
+ to_list = sorted(self.macros, key=self.default_sort_key)
+
+ not_found = [] # type: List[str]
+ for name in to_list:
+ if name not in self.macros:
+ not_found.append(name)
+ continue
+
+ # Quote redirection and terminator tokens for the 'macro create' command
+ tokens = shlex_split(self.macros[name].value)
+ command = tokens[0]
+ args = tokens[1:]
+ utils.quote_specific_tokens(args, tokens_to_quote)
+
+ val = command
+ if args:
+ val += ' ' + ' '.join(args)
+
+ self.poutput("{} {} {}".format(create_cmd, name, val))
+
+ for name in not_found:
+ self.perror("Macro '{}' not found".format(name))
def complete_help_command(self, text: str, line: str, begidx: int, endidx: int) -> List[str]:
"""Completes the command argument of help"""
diff --git a/cmd2/utils.py b/cmd2/utils.py
index b6dadf1c..45ca494c 100644
--- a/cmd2/utils.py
+++ b/cmd2/utils.py
@@ -318,17 +318,29 @@ def natural_sort(list_to_sort: Iterable[str]) -> List[str]:
return sorted(list_to_sort, key=natural_keys)
-def unquote_specific_tokens(args: List[str], tokens_to_unquote: List[str]) -> None:
+def quote_specific_tokens(tokens: List[str], tokens_to_quote: List[str]) -> None:
"""
- Unquote a specific tokens in a list of command-line arguments
- This is used when certain tokens have to be passed to another command
- :param args: the command line args
- :param tokens_to_unquote: the tokens, which if present in args, to unquote
+ Quote specific tokens in a list
+
+ :param tokens: token list being edited
+ :param tokens_to_quote: the tokens, which if present in tokens, to quote
+ """
+ for i, token in enumerate(tokens):
+ if token in tokens_to_quote:
+ tokens[i] = quote_string(token)
+
+
+def unquote_specific_tokens(tokens: List[str], tokens_to_unquote: List[str]) -> None:
+ """
+ Unquote specific tokens in a list
+
+ :param tokens: token list being edited
+ :param tokens_to_unquote: the tokens, which if present in tokens, to unquote
"""
- for i, arg in enumerate(args):
- unquoted_arg = strip_quotes(arg)
- if unquoted_arg in tokens_to_unquote:
- args[i] = unquoted_arg
+ for i, token in enumerate(tokens):
+ unquoted_token = strip_quotes(token)
+ if unquoted_token in tokens_to_unquote:
+ tokens[i] = unquoted_token
def expand_user(token: str) -> str: