From c74d69764344b7ef536886bb1b14119279b5e972 Mon Sep 17 00:00:00 2001 From: Harold Zeng Date: Tue, 21 Apr 2020 11:31:03 +0800 Subject: [PATCH 1/7] refine event and catch SystemExit --- knack/cli.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/knack/cli.py b/knack/cli.py index 8a21474..8e0ef3b 100644 --- a/knack/cli.py +++ b/knack/cli.py @@ -219,14 +219,19 @@ def invoke(self, args, initial_invocation_data=None, out_file=None): if cmd_result and cmd_result.result is not None: formatter = self.output.get_formatter(output_type) self.output.out(cmd_result, formatter=formatter, out_file=out_file) - self.raise_event(EVENT_CLI_POST_EXECUTE) except KeyboardInterrupt as ex: self.result = CommandResultItem(None, error=ex) exit_code = 1 except Exception as ex: # pylint: disable=broad-except exit_code = self.exception_handler(ex) self.result = CommandResultItem(None, error=ex) + except SystemExit as ex: + exit_code = self.exception_handler(ex) + self.result = CommandResultItem(None, error=ex) + raise ex finally: + self.raise_event(EVENT_CLI_POST_EXECUTE) + if self.enable_color: colorama.deinit() self.result.exit_code = exit_code From 33d158f009931fd9b9c5c084d6d7463d50686c17 Mon Sep 17 00:00:00 2001 From: Harold Zeng Date: Tue, 21 Apr 2020 12:26:55 +0800 Subject: [PATCH 2/7] Make SystemExit be awared in exception_handler --- knack/cli.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/knack/cli.py b/knack/cli.py index 8e0ef3b..99861f1 100644 --- a/knack/cli.py +++ b/knack/cli.py @@ -167,6 +167,8 @@ def exception_handler(self, ex): # pylint: disable=no-self-use """ The default exception handler """ if isinstance(ex, CLIError): logger.error(ex) + elif isinstance(ex, SystemExit): + return ex.code else: logger.exception(ex) return 1 From a765e31a8199b2b4cacd7bad20e2e383fc8a0228 Mon Sep 17 00:00:00 2001 From: Harold Zeng Date: Tue, 21 Apr 2020 13:20:17 +0800 Subject: [PATCH 3/7] Add parameter args when raise EVENT_CLI_PRE_EXECUTE event --- knack/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/knack/cli.py b/knack/cli.py index 99861f1..298e6ae 100644 --- a/knack/cli.py +++ b/knack/cli.py @@ -204,7 +204,7 @@ def invoke(self, args, initial_invocation_data=None, out_file=None): self.logging.configure(args) logger.debug('Command arguments: %s', args) - self.raise_event(EVENT_CLI_PRE_EXECUTE) + self.raise_event(EVENT_CLI_PRE_EXECUTE, args=args) if CLI._should_show_version(args): self.show_version() self.result = CommandResultItem(None) From 3759f951e4e44f9d0675667e108fb87320c25e56 Mon Sep 17 00:00:00 2001 From: Harold Zeng Date: Tue, 21 Apr 2020 13:59:47 +0800 Subject: [PATCH 4/7] fix exit code --- knack/cli.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/knack/cli.py b/knack/cli.py index 298e6ae..aacad12 100644 --- a/knack/cli.py +++ b/knack/cli.py @@ -167,8 +167,6 @@ def exception_handler(self, ex): # pylint: disable=no-self-use """ The default exception handler """ if isinstance(ex, CLIError): logger.error(ex) - elif isinstance(ex, SystemExit): - return ex.code else: logger.exception(ex) return 1 @@ -228,13 +226,13 @@ def invoke(self, args, initial_invocation_data=None, out_file=None): exit_code = self.exception_handler(ex) self.result = CommandResultItem(None, error=ex) except SystemExit as ex: - exit_code = self.exception_handler(ex) self.result = CommandResultItem(None, error=ex) + exit_code = ex.code raise ex finally: self.raise_event(EVENT_CLI_POST_EXECUTE) if self.enable_color: colorama.deinit() - self.result.exit_code = exit_code + self.result.exit_code = exit_code return exit_code From 677e355b760c2b5937a94ce2b4440600175c20dc Mon Sep 17 00:00:00 2001 From: Harold Zeng Date: Tue, 21 Apr 2020 14:38:31 +0800 Subject: [PATCH 5/7] revert defailt behavior to raise event EVENT_CLI_PRE_EXECUTE --- knack/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/knack/cli.py b/knack/cli.py index aacad12..861fe80 100644 --- a/knack/cli.py +++ b/knack/cli.py @@ -202,7 +202,7 @@ def invoke(self, args, initial_invocation_data=None, out_file=None): self.logging.configure(args) logger.debug('Command arguments: %s', args) - self.raise_event(EVENT_CLI_PRE_EXECUTE, args=args) + self.raise_event(EVENT_CLI_PRE_EXECUTE) if CLI._should_show_version(args): self.show_version() self.result = CommandResultItem(None) From e905e5b27ad8321048d18d0ad444986f23056aaa Mon Sep 17 00:00:00 2001 From: Harold Zeng Date: Tue, 21 Apr 2020 16:00:39 +0800 Subject: [PATCH 6/7] refine self.result and exit_code --- knack/cli.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/knack/cli.py b/knack/cli.py index 861fe80..ea69233 100644 --- a/knack/cli.py +++ b/knack/cli.py @@ -234,5 +234,7 @@ def invoke(self, args, initial_invocation_data=None, out_file=None): if self.enable_color: colorama.deinit() - self.result.exit_code = exit_code + + if self.result: + self.result.exit_code = exit_code return exit_code From e59fb68a15a38b20eda993a2c68fa4b2febfdf32 Mon Sep 17 00:00:00 2001 From: Harold Zeng Date: Tue, 21 Apr 2020 18:00:44 +0800 Subject: [PATCH 7/7] refine self.result assignment --- knack/cli.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/knack/cli.py b/knack/cli.py index ea69233..ec903a9 100644 --- a/knack/cli.py +++ b/knack/cli.py @@ -220,14 +220,14 @@ def invoke(self, args, initial_invocation_data=None, out_file=None): formatter = self.output.get_formatter(output_type) self.output.out(cmd_result, formatter=formatter, out_file=out_file) except KeyboardInterrupt as ex: - self.result = CommandResultItem(None, error=ex) exit_code = 1 + self.result = CommandResultItem(None, error=ex, exit_code=exit_code) except Exception as ex: # pylint: disable=broad-except exit_code = self.exception_handler(ex) - self.result = CommandResultItem(None, error=ex) + self.result = CommandResultItem(None, error=ex, exit_code=exit_code) except SystemExit as ex: - self.result = CommandResultItem(None, error=ex) exit_code = ex.code + self.result = CommandResultItem(None, error=ex, exit_code=exit_code) raise ex finally: self.raise_event(EVENT_CLI_POST_EXECUTE) @@ -235,6 +235,4 @@ def invoke(self, args, initial_invocation_data=None, out_file=None): if self.enable_color: colorama.deinit() - if self.result: - self.result.exit_code = exit_code return exit_code