From 150bc97fc92d99d0de20e55b06fc281cddfcbf49 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Thu, 20 Nov 2025 10:44:14 +0100 Subject: [PATCH] build.lib.util, build.App: Beautify exceptions Make exceptions somewhat more readable. Signed-off-by: Jan Lindemann --- src/python/jw/build/App.py | 7 ++++++- src/python/jw/build/lib/util.py | 21 ++++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/python/jw/build/App.py b/src/python/jw/build/App.py index 261a30ad..5d8364e1 100644 --- a/src/python/jw/build/App.py +++ b/src/python/jw/build/App.py @@ -458,4 +458,9 @@ class App(object): subparser = argparse.ArgumentParser(description=cmd_name) cmd.add_arguments(subparser) args = subparser.parse_args(sys.argv[(len(self.global_args) + 1)::]) - return cmd.run(args) + try: + return cmd.run(args) + except Exception as e: + self.err('Failed to run >{}<: {}'.format(' '.join(sys.argv), e)) + raise + sys.exit(1) diff --git a/src/python/jw/build/lib/util.py b/src/python/jw/build/lib/util.py index df30d9e7..04814bb5 100644 --- a/src/python/jw/build/lib/util.py +++ b/src/python/jw/build/lib/util.py @@ -4,19 +4,22 @@ import os, sys, subprocess, json, time from argparse import Namespace from urllib.parse import urlparse -def run_cmd(cmd: list[str], wd=None, throw=True, verbose=False) -> str|None: # export - +def pretty_cmd(cmd: list[str], wd=None): tokens = [cmd[0]] for token in cmd[1:]: if token.find(' ') != -1: token = '"' + token + '"' tokens.append(token) - subject = ' '.join(tokens) + ret = ' '.join(tokens) if wd is not None: - subject += f' in {wd}' + ret += f' in {wd}' + return ret + +def run_cmd(cmd: list[str], wd=None, throw=True, verbose=False) -> str|None: # export + if verbose: delim_len = 120 - delim = f'---- running {subject} -' + delim = f'---- running {pretty_cmd(cmd, wd)} -' delim = delim + '-' * (delim_len - len(delim)) print(',' + delim + ' >') @@ -37,7 +40,7 @@ def run_cmd(cmd: list[str], wd=None, throw=True, verbose=False) -> str|None: # e if p.returncode: if verbose: print(' '.join(cmd) + ' failed') - raise Exception(time.strftime('%Y-%m-%d %H:%M') + f': failed to run "{subject}"') + raise Exception(time.strftime('%Y-%m-%d %H:%M') + f': Command returned an error: "{pretty_cmd(cmd, wd)}"') finally: if cwd: os.chdir(cwd) @@ -50,7 +53,11 @@ def run_curl(args: list[str], parse_json: bool=True, wd=None, throw=None, verbos cmd.extend(args) ret = run_cmd(cmd, wd=wd, throw=throw, verbose=verbose) if parse_json: - return json.loads(ret) + try: + return json.loads(ret) + except Exception as e: + print(f'Failed to parse {len(ret)} bytes output of command >{pretty_cmd(cmd, wd)}< ({e})', file=sys.stderr) + raise return ret def get_username(args: Namespace|None=None, url: str|None=None) -> str: # export