From 46080de1131c0bbfd1b42670b8615e1e8cbce4b6 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Sun, 11 Apr 2021 20:46:42 +0200 Subject: [PATCH] generator: Simplify error handling Similar to Rusts return and try, just use exceptions and pretty-print them at the highest level (instead of presenting the user with a stacktrace that's harder to read than the error alone). --- generator.py | 63 ++++++++++++++++++++-------------------------------- 1 file changed, 24 insertions(+), 39 deletions(-) diff --git a/generator.py b/generator.py index 0605e05f4..92a917c76 100755 --- a/generator.py +++ b/generator.py @@ -5,11 +5,6 @@ import argparse import subprocess import sys - -NOTHING_TO_BE_DONE = 0 -NEED_UPDATE = 1 -FAILURE = 2 - DEFAULT_GIR_FILES_DIRECTORY = Path("./gir-files") DEFAULT_GST_GIR_FILES_DIRECTORY = Path("./gst-gir-files") DEFAULT_GIR_DIRECTORY = Path("./gir/") @@ -19,11 +14,7 @@ DEFAULT_GIR_PATH = DEFAULT_GIR_DIRECTORY / "target/release/gir" def run_command(command, folder=None): if folder is None: folder = "." - ret = subprocess.run(command, cwd=folder) - if ret.returncode != 0: - print("Command `{}` failed with `{}`...".format(command, ret)) - return False - return True + return subprocess.run(command, cwd=folder, check=True) def spawn_process(command): @@ -43,37 +34,28 @@ def ask_yes_no_question(question, conf): return line.strip().lower() == "y" -def def_check_submodule(submodule_path, conf): +def update_submodule(submodule_path, conf): if any(submodule_path.iterdir()): - return NOTHING_TO_BE_DONE + return False print("=> Initializing {} submodule...".format(submodule_path)) - if not run_command(["git", "submodule", "update", "--init", submodule_path]): - return FAILURE + run_command(["git", "submodule", "update", "--init", submodule_path]) print("<= Done!") if ask_yes_no_question( "Do you want to update {} submodule?".format(submodule_path), conf ): print("=> Updating submodule...") - if not run_command(["git", "reset", "--hard", "HEAD"], submodule_path): - return FAILURE - if not run_command(["git", "pull", "-f", "origin", "master"], submodule_path): - return FAILURE + run_command(["git", "reset", "--hard", "HEAD"], submodule_path) + run_command(["git", "pull", "-f", "origin", "master"], submodule_path) print("<= Done!") - return NEED_UPDATE - return NOTHING_TO_BE_DONE + return True + return False -def build_gir_if_needed(updated_submodule): - if updated_submodule == FAILURE: - return False +def build_gir(): print("=> Building gir...") - if update_workspace(): - print("<= Done!") - else: - print("<= Failed...") - return False - return True + update_workspace() + print("<= Done!") def regen_crates(path, conf): @@ -97,11 +79,7 @@ def regen_crates(path, conf): # doc-target-path is relative to `-c` path_depth = len(path.parent.parts) - doc_path = ( - Path(*[".."] * path_depth, "docs") - .joinpath(path.parent) - .joinpath("docs.md") - ) + doc_path = Path(*[".."] * path_depth, "docs", path.parent, "docs.md") doc_args = args + [ "-m", "doc", @@ -191,8 +169,8 @@ def main(): conf = parse_args() if conf.gir_path == DEFAULT_GIR_PATH: - if not build_gir_if_needed(def_check_submodule(DEFAULT_GIR_DIRECTORY, conf)): - return 1 + update_submodule(DEFAULT_GIR_DIRECTORY, conf) + build_gir() print("=> Regenerating crates...") for path in conf.path: @@ -201,10 +179,13 @@ def main(): for log, p in processes: print("==> {}".format(log)) stdout, stderr = p.communicate() + stdout = stdout.decode("utf-8") + stderr = stderr.decode("utf-8") + assert p.returncode == 0, stderr.strip() # Gir doesn't print anything to stdout. If it does, this is likely out of # order with stderr, unless the printer/logging flushes in between. - assert stdout == b"" - print(stderr.decode("utf-8"), end="") + assert not stdout, "`gir` printed unexpected stdout: {}".format(stdout) + print(stderr, end="") if not conf.no_fmt and not run_command(["cargo", "fmt"]): return 1 @@ -214,4 +195,8 @@ def main(): if __name__ == "__main__": - sys.exit(main()) + try: + main() + except Exception as e: + print("Error: {}".format(e), file=sys.stderr) + sys.exit(1)