From b19b6ff6464a5bb325cddcacc09fd3131c8b4b37 Mon Sep 17 00:00:00 2001 From: Dirk Thomas Date: Thu, 30 Jan 2020 09:35:52 -0800 Subject: [PATCH 1/3] override parse_known_args for completion to work with partial argparse tree Signed-off-by: Dirk Thomas --- ros2cli/ros2cli/command/__init__.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/ros2cli/ros2cli/command/__init__.py b/ros2cli/ros2cli/command/__init__.py index 638b12cb0..e832f1789 100644 --- a/ros2cli/ros2cli/command/__init__.py +++ b/ros2cli/ros2cli/command/__init__.py @@ -15,6 +15,8 @@ import argparse import inspect +import os +import shlex import types from ros2cli.entry_points import get_entry_points @@ -199,7 +201,17 @@ def add_subparsers_on_demand( # in order to parse known args root_parser = getattr(parser, '_root_parser', parser) with SuppressUsageOutput({parser} | set(command_parsers.values())): - known_args, _ = root_parser.parse_known_args(args=argv) + args = argv + # for completion use the arguments provided by the arcomplete env var + if _is_completion_requested(): + args = shlex.split(os.environ['COMP_LINE'])[1:] + try: + known_args, _ = root_parser.parse_known_args(args=args) + except SystemExit: + if not _is_completion_requested(): + raise + # if the partial arguments can't be parsed use no known args + known_args = argparse.Namespace(verb_name=None) # check if a specific subparser is selected name = getattr(known_args, subparser.dest) @@ -281,3 +293,7 @@ def exit_(self, status=0, message=None): return original_exit_handler(status=status, message=message) return exit_ + + +def _is_completion_requested(): + return os.environ.get('_ARGCOMPLETE') == '1' From 3f5fee91db557920572a4ff47bd8c84577f1d9f5 Mon Sep 17 00:00:00 2001 From: Dirk Thomas Date: Thu, 30 Jan 2020 13:24:23 -0800 Subject: [PATCH 2/3] fix completion of partial first level command Signed-off-by: Dirk Thomas --- ros2cli/ros2cli/command/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ros2cli/ros2cli/command/__init__.py b/ros2cli/ros2cli/command/__init__.py index e832f1789..26f889959 100644 --- a/ros2cli/ros2cli/command/__init__.py +++ b/ros2cli/ros2cli/command/__init__.py @@ -211,7 +211,7 @@ def add_subparsers_on_demand( if not _is_completion_requested(): raise # if the partial arguments can't be parsed use no known args - known_args = argparse.Namespace(verb_name=None) + known_args = argparse.Namespace(**{subparser.dest: None}) # check if a specific subparser is selected name = getattr(known_args, subparser.dest) From 7be4c7e628b1b14caf8f2c82d6f8706a1ef04490 Mon Sep 17 00:00:00 2001 From: Dirk Thomas Date: Fri, 31 Jan 2020 09:16:27 -0800 Subject: [PATCH 3/3] fix spelling in comment Signed-off-by: Dirk Thomas --- ros2cli/ros2cli/command/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ros2cli/ros2cli/command/__init__.py b/ros2cli/ros2cli/command/__init__.py index 26f889959..4b48c04ad 100644 --- a/ros2cli/ros2cli/command/__init__.py +++ b/ros2cli/ros2cli/command/__init__.py @@ -202,7 +202,7 @@ def add_subparsers_on_demand( root_parser = getattr(parser, '_root_parser', parser) with SuppressUsageOutput({parser} | set(command_parsers.values())): args = argv - # for completion use the arguments provided by the arcomplete env var + # for completion use the arguments provided by the argcomplete env var if _is_completion_requested(): args = shlex.split(os.environ['COMP_LINE'])[1:] try: