diff --git a/TODO b/TODO deleted file mode 100644 index a883d11..0000000 --- a/TODO +++ /dev/null @@ -1,58 +0,0 @@ -# All code moves somewhere else - -- Tests to the tests/ directory -- Everything else away from legacy.py -- Remove version.py completely - -# Update old files - -The following files have just been copied without checking if their content is ok: - -- CHANELOG -- CHANELOG.rst -- README.rst - -The reason for this is to ensure the continuity of the git history. - -# Tool to convert yaml config to toml - -- This is probably just a sub-command of pyaptly -- We probably still want to switch to a modern yaml parser - -# Replace all subprocess commands with a modern one (run_command()) - -# All logging should be done via logging (no stdout/stderr) - -# Remove all top-level `# type: ignore` and all `# type: ignore # TODO` - -# Add good documentation to every function and module, but plan to review all of - it once everything is in place - -# Do all output via logging module - -- Idea show INFO and above, but display info without timestamp etc. - -# latest, maybe repeat: - -- replace all prints with logging -- correctly do getLogger -- is this unit_or_list... thing still needed -- remove codecs.open -- use pathlib.Path -- replace state_reader.state with function -- remove six -- remote test.py completely - -- Build package - - sudo dnf install python3-click python3-frozendict python3-pyyaml python3-tomli python3-tomli-w python3-devel python3-setuptools - -- remove pyp2rpm and just put a spec into build-rpm, like in venv-rpm - -- venv-rpm hardcodes version 2.0.0 in some places - -- review rpm build and improve it later - -- This is string is wrong in several places: - - Automates the creation and managment of aptly mirrors and snapshots based on toml input files diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..78702e6 --- /dev/null +++ b/TODO.md @@ -0,0 +1,18 @@ +# CHANGELOG + +- CHANGELOG convert to toml +- CHANGELOG.rst rename to CHANGELOG.md +- CHANELOG.md generate from toml +- RPM_SPEC generate changelog from toml + +# Docs + +- Remove sphinx-doc tags from documentation -> currently deferred + +# Release + +- remove pyp2rpm and just put a spec into build-rpm, like in venv-rpm (maybe) + +- venv-rpm hardcodes version 2.0.0 in some places + +- review rpm build and improve it later diff --git a/pyaptly/util.py b/pyaptly/util.py index 4ad090c..344ee4c 100644 --- a/pyaptly/util.py +++ b/pyaptly/util.py @@ -3,6 +3,7 @@ import logging import os import subprocess +import sys import traceback from pathlib import Path from subprocess import PIPE, CalledProcessError # noqa: F401 @@ -21,7 +22,7 @@ Command call cmd: {cmd} {color_begin}-> {returncode}{color_end} """.strip() -OUTPUT_LOG = " {out_type}: '{output}'" +OUTPUT_LOG = " {out_type}:{white_space}'{output}'" _indent = " " * 15 _isatty_cache: bool | None = None @@ -84,27 +85,48 @@ def run_command( """ added_stdout = False added_stderr = False - # TODO assert PIPE or None if "stdout" not in kwargs: kwargs["stdout"] = PIPE added_stdout = True + else: + assert kwargs["stdout"] in (PIPE, None) if "stderr" not in kwargs: kwargs["stderr"] = PIPE added_stderr = True + else: + assert kwargs["stdout"] in (PIPE, None) # pragma: no cover + # If we want to log stdout/err before raising CalledProcessError we have to + # check ourselves + check = False + if "check" in kwargs: + check = kwargs["check"] + del kwargs["check"] result = None + tb = "" if decode and "encoding" not in kwargs: kwargs["encoding"] = "UTF-8" try: result = subprocess.run(cmd_args, **kwargs) + if check and result.returncode: + raise CalledProcessError( + result.returncode, + result.args, + output=result.stdout, + stderr=result.stderr, + ) + except Exception: + if "pytest" not in sys.modules: + tb = write_traceback() # pragma: no cover + raise finally: if result: - log_msg = format_run_result(result, result.returncode) + log_msg = format_run_result(result, result.returncode, tb) if result.returncode == 0: lg.info(log_msg) else: if not hide_error or lg.root.level <= 20: lg.error(log_msg) - # Do not change returned result by debug mode + # This function should not alter the returned result if added_stdout: delattr(result, "stdout") if added_stderr: @@ -141,7 +163,7 @@ def indent_out(output: bytes | str) -> str: return "\n".join(result) -def format_run_result(result: subprocess.CompletedProcess, returncode: int): +def format_run_result(result: subprocess.CompletedProcess, returncode: int, tb: str): """Format a CompletedProcess result log.""" color_begin = "" color_end = "" @@ -162,11 +184,20 @@ def format_run_result(result: subprocess.CompletedProcess, returncode: int): stderr=indent_out(result.stderr), ) ] - for out_type, output in [("stdout", result.stdout), ("stderr", result.stderr)]: + for out_type, output in [ + ("stdout", result.stdout), + ("stderr", result.stderr), + ("traceback", tb), + ]: output = output.strip() if output: output = indent_out(output) - msg.append(OUTPUT_LOG.format(out_type=out_type, output=output)) + white_space = " " * (11 - len(out_type)) + msg.append( + OUTPUT_LOG.format( + out_type=out_type, white_space=white_space, output=output + ) + ) pass return "\n".join(msg) diff --git a/tools/venv-rpm b/tools/venv-rpm index 0760a34..5ecd465 100755 --- a/tools/venv-rpm +++ b/tools/venv-rpm @@ -11,7 +11,6 @@ Version: 2.0.0^{revision} Release: 1%{{?dist}} Summary: Automates the creation and managment of aptly mirrors and snapshots based on toml input files License: AGPL-3.0-or-later -BuildArch: noarch Requires: python3.11 %description @@ -41,10 +40,6 @@ rm -rf /opt/pyaptly def main(): os.chdir("/source") - macros = Path("/root/.rpmmacros") - with macros.open("w", encoding="UTF-8") as f: - f.write("%_binaries_in_noarch_packages_terminate_build 0") - f.write("\n") run(["dnf", "install", "-y", "rpm-build", "python3.11", "git"], check=True) date = datetime.now().strftime("%a %b %d %Y") build_id = run(