From 70fdb9cd9b883de4e3c2d0526d1b6c980f00c7c7 Mon Sep 17 00:00:00 2001 From: Charles Short Date: Tue, 12 Sep 2023 08:26:59 -0400 Subject: [PATCH] repo: Refactor "repo" subcomand Refactor the "repo" sub-command for easier maintenance and readability. No functionality changes were made in this refactoring. As a side affect, this treats apt-ostree more like a library so that other StarlingX projects can use apt-ostree to manage images and/or packages. Test Plan PASSED Installed apt-ostree from git repo. PASSED mkdir -p /var/repository PASSED sudo apt-ostree repo init \ --feed /var/repository --release bullseye --origin starlingx PASSED sudo apt-ostree repo list --release bullseye Story: 2010867 Task: 48556 Change-Id: Iaa5dbf6233b0175eefec67ba666c66b47bc01e66 Signed-off-by: Charles Short --- apt_ostree/cmd/repo/__init__.py | 2 +- apt_ostree/cmd/repo/add.py | 18 ++++++++++-------- apt_ostree/cmd/repo/init.py | 18 ++++++++++-------- apt_ostree/cmd/repo/list.py | 17 +++++++++++------ apt_ostree/cmd/repo/remove.py | 20 +++++++++++--------- apt_ostree/repo.py | 3 ++- 6 files changed, 45 insertions(+), 33 deletions(-) diff --git a/apt_ostree/cmd/repo/__init__.py b/apt_ostree/cmd/repo/__init__.py index 1861903..1738241 100644 --- a/apt_ostree/cmd/repo/__init__.py +++ b/apt_ostree/cmd/repo/__init__.py @@ -13,7 +13,7 @@ from apt_ostree.cmd.repo.list import show from apt_ostree.cmd.repo.remove import remove -@click.group(help="Commands to create/manage Debian package repository") +@click.group(help="Create/manage Debian package repository.") @click.pass_context def repo(ctxt): pass diff --git a/apt_ostree/cmd/repo/add.py b/apt_ostree/cmd/repo/add.py index d6a5a79..b8d6d4c 100644 --- a/apt_ostree/cmd/repo/add.py +++ b/apt_ostree/cmd/repo/add.py @@ -4,7 +4,7 @@ Copyright (c) 2023 Wind River Systems, Inc. SPDX-License-Identifier: Apache-2.0 """ -import shutil +import errno import sys import click @@ -13,7 +13,6 @@ from apt_ostree.cmd.options import feed_option from apt_ostree.cmd.options import packages_option from apt_ostree.cmd.options import release_option from apt_ostree.cmd import pass_state_context -from apt_ostree.log import complete_step from apt_ostree.repo import Repo @@ -23,10 +22,13 @@ from apt_ostree.repo import Repo @release_option @packages_option def add(state, feed, release, packages): - if shutil.which("reprepro") is None: - click.secho("reprepro was not found in your $PATH") - sys.exit(0) - - with complete_step( - f"Adding packages to {state.feed}"): + try: Repo(state).add() + except KeyboardInterrupt: + click.secho("\n" + ("Exiting at your request.")) + sys.exit(130) + except BrokenPipeError: + sys.exit() + except OSError as error: + if error.errno == errno.ENOSPC: + sys.exit("errror - No space left on device.") diff --git a/apt_ostree/cmd/repo/init.py b/apt_ostree/cmd/repo/init.py index 60dcf22..3c6c6bc 100644 --- a/apt_ostree/cmd/repo/init.py +++ b/apt_ostree/cmd/repo/init.py @@ -5,7 +5,7 @@ SPDX-License-Identifier: Apache-2.0 """ -import shutil +import errno import sys import click @@ -15,7 +15,6 @@ from apt_ostree.cmd.options import feed_option from apt_ostree.cmd.options import origin_option from apt_ostree.cmd.options import release_option from apt_ostree.cmd import pass_state_context -from apt_ostree.log import complete_step from apt_ostree.repo import Repo @@ -25,10 +24,13 @@ from apt_ostree.repo import Repo @release_option @origin_option def init(state, feed, release, origin): - if shutil.which("reprepro") is None: - click.secho("reprepro was not found in your $PATH") - sys.exit(0) - - with complete_step( - f"Creating Debian package repository in {state.feed}."): + try: Repo(state).init() + except KeyboardInterrupt: + click.secho("\n" + ("Exiting at your request.")) + sys.exit(130) + except BrokenPipeError: + sys.exit() + except OSError as error: + if error.errno == errno.ENOSPC: + sys.exit("errror - No space left on device.") diff --git a/apt_ostree/cmd/repo/list.py b/apt_ostree/cmd/repo/list.py index 7670783..8d5cf49 100644 --- a/apt_ostree/cmd/repo/list.py +++ b/apt_ostree/cmd/repo/list.py @@ -5,7 +5,7 @@ SPDX-License-Identifier: Apache-2.0 """ -import shutil +import errno import sys import click @@ -21,8 +21,13 @@ from apt_ostree.repo import Repo @feed_option @release_option def show(state, feed, release): - if shutil.which("reprepro") is None: - click.secho("reprepro was not found in your $PATH") - sys.exit(0) - - Repo(state).show() + try: + Repo(state).show() + except KeyboardInterrupt: + click.secho("\n" + ("Exiting at your request.")) + sys.exit(130) + except BrokenPipeError: + sys.exit() + except OSError as error: + if error.errno == errno.ENOSPC: + sys.exit("errror - No space left on device.") diff --git a/apt_ostree/cmd/repo/remove.py b/apt_ostree/cmd/repo/remove.py index 2e661ae..f5914d5 100644 --- a/apt_ostree/cmd/repo/remove.py +++ b/apt_ostree/cmd/repo/remove.py @@ -5,7 +5,7 @@ SPDX-License-Identifier: Apache-2.0 """ -import shutil +import errno import sys import click @@ -14,20 +14,22 @@ from apt_ostree.cmd.options import feed_option from apt_ostree.cmd.options import packages_option from apt_ostree.cmd.options import release_option from apt_ostree.cmd import pass_state_context -from apt_ostree.log import complete_step from apt_ostree.repo import Repo -@click.command(help="Remove debian package(s) from reposiotry") +@click.command(help="Remove debian package(s) from reposiotry.") @pass_state_context @feed_option @release_option @packages_option def remove(state, feed, release, packages): - if shutil.which("reprepro") is None: - click.secho("reprepro was not found in your $PATH") - sys.exit(0) - - with complete_step( - f"Removing packages from {state.feed}"): + try: Repo(state).remove() + except KeyboardInterrupt: + click.secho("\n" + ("Exiting at your request.")) + sys.exit(130) + except BrokenPipeError: + sys.exit() + except OSError as error: + if error.errno == errno.ENOSPC: + sys.exit("errror - No space left on device.") diff --git a/apt_ostree/repo.py b/apt_ostree/repo.py index 1c54bdb..12c0dc5 100644 --- a/apt_ostree/repo.py +++ b/apt_ostree/repo.py @@ -60,7 +60,7 @@ class Repo: ) def add(self): - """Add Debian package(s) to repository""" + """Add Debian package(s) to repository.""" for pkg in self.state.packages: log_step(f"Adding {pkg}") r = run_command( @@ -102,6 +102,7 @@ class Repo: self.console.print(table) def remove(self): + """Remove a Debian package from an archive.""" for pkg in self.state.packages: log_step(f"Removing {pkg}") r = run_command(