From 42c060ba350f3ca4c413f5569fd8d9c6b08dd7ac Mon Sep 17 00:00:00 2001 From: Kivi Kaitaniemi Date: Thu, 25 Apr 2024 03:30:48 +0300 Subject: [PATCH] Code cleanup - Add option to suppress command output - Fix bugs --- src/decman/config.py | 1 + src/decman/lib/__init__.py | 2 +- src/decman/lib/aur.py | 80 +++++++++++++++++++++++--------------- 3 files changed, 51 insertions(+), 32 deletions(-) diff --git a/src/decman/config.py b/src/decman/config.py index ea52375..a8aff4b 100644 --- a/src/decman/config.py +++ b/src/decman/config.py @@ -184,6 +184,7 @@ class Commands: commands: Commands = Commands() debug_output: bool = False quiet_output: bool = False +suppress_command_output: bool = True valid_pkgexts: list[str] = [ ".pkg.tar", diff --git a/src/decman/lib/__init__.py b/src/decman/lib/__init__.py index 16890d8..f8725b9 100644 --- a/src/decman/lib/__init__.py +++ b/src/decman/lib/__init__.py @@ -310,7 +310,7 @@ class Pacman: subprocess.run( conf.commands.set_as_explicitly_installed(as_explicit), check=True, - capture_output=not conf.debug_output) + capture_output=conf.suppress_command_output) except subprocess.CalledProcessError as error: raise UserFacingError( "Failed to install foreign packages.") from error diff --git a/src/decman/lib/aur.py b/src/decman/lib/aur.py index 2a3d6a3..9f2db49 100644 --- a/src/decman/lib/aur.py +++ b/src/decman/lib/aur.py @@ -103,7 +103,7 @@ class PackageInfo: class ForeignPackage: """ - Class used to keep track of AUR/user recursive dependency packages of an AUR/user package. + Class used to keep track of foreign recursive dependency packages of an foreign package. """ def __init__(self, name: str): @@ -512,7 +512,7 @@ class ResolvedDependencies: class ForeignPackageManager: """ - Class for dealing with AUR/user packages. + Class for dealing with foreign packages. """ def __init__(self, store: l.Store, pacman: l.Pacman, @@ -521,9 +521,9 @@ class ForeignPackageManager: self._pacman = pacman self._search = search - def upgrade(self, upgrade_devel: bool = False): + def upgrade(self, upgrade_devel: bool = False, force: bool = False): """ - Upgrades all AUR/user packages. + Upgrades all foreign packages. """ l.print_summary("Determining packages to upgrade.") @@ -553,17 +553,20 @@ class ForeignPackageManager: f"The following foreign packages will be upgraded: {' '.join(as_explicit)}" ) - self.install(as_explicit, as_deps, True) + self.install(as_explicit, as_deps, force) def install(self, foreign_pkgs: list[str], foreign_dep_pkgs: typing.Optional[list[str]] = None, force: bool = False): """ - Installs the given AUR/user packages and their dependencies (both pacman/AUR). + Installs the given foreign packages and their dependencies (both pacman/AUR). """ - if len(foreign_pkgs) == 0: + if foreign_dep_pkgs is None: + foreign_dep_pkgs = [] + + if len(foreign_pkgs) == 0 and len(foreign_dep_pkgs) == 0: return resolved_dependencies = self.resolve_dependencies( @@ -597,8 +600,7 @@ class ForeignPackageManager: if not l.prompt_confirm("Proceed?", default=True): raise l.UserFacingError("Installing aborted.") - l.print_summary( - "Installing AUR/user package dependencies from pacman.") + l.print_summary("Installing foreign package dependencies from pacman.") self._pacman.install_dependencies( list(resolved_dependencies.pacman_deps)) @@ -632,7 +634,7 @@ class ForeignPackageManager: package_files_to_install.append(path) if package_files_to_install or force: - l.print_summary("Installing AUR/user packages.") + l.print_summary("Installing foreign packages.") self._pacman.install_files(package_files_to_install, as_explicit=list( resolved_dependencies.foreign_pkgs)) @@ -645,17 +647,17 @@ class ForeignPackageManager: foreign_dep_pkgs: typing.Optional[list[str]] = None ) -> ResolvedDependencies: """ - Resolves AUR/user dependencies of AUR/user packages. + Resolves foreign dependencies of foreign packages. Returns a tuple of (foreign_packages, pacman_deps) foreign_packages are in the order they should be built (the 1st element should be built 1st) - pacman_deps are dependencies that are required by the AUR/user packages. + pacman_deps are dependencies that are required by the foreign packages. """ - l.print_summary("Resolving AUR / user package dependencies.") + l.print_summary("Resolving foreign package dependencies.") l.print_debug(f"Packages: {foreign_pkgs}") if foreign_dep_pkgs is None: @@ -717,7 +719,7 @@ class ForeignPackageManager: process_dep(pkgname, depname, result.foreign_build_dep_pkgs) total_processed += 1 - l.print_info(f"{total_processed}/{len(seen_packages)}.") + l.print_info(f"Progress: {total_processed}/{len(seen_packages)}.") l.print_summary("Determining build order.") @@ -822,9 +824,13 @@ class PackageBuilder: os.makedirs(pkgbuild_dir) os.chdir(pkgbuild_dir) - git_url = self._search.get_package_info( - self._resolved_deps.get_some_pkgname(pkgbase) - ).git_url # pyright: ignore[reportOptionalMemberAccess] + git_url_info = self._search.get_package_info( + self._resolved_deps.get_some_pkgname(pkgbase)) + + # Because all dependencies and packages should be resolved during the creation + # of ResolvedDependencies. git_url should not be None. + assert git_url_info is not None + git_url = git_url_info.git_url l.print_debug(f"Git URL for '{pkgbase}' is '{git_url}'") self._git_clone_and_review_pkgbuild(pkgbase, git_url) @@ -848,7 +854,7 @@ class PackageBuilder: list(self._resolved_deps.pacman_deps)), env=mkarchroot_env_vars, check=True, - capture_output=conf.quiet_output) + capture_output=conf.suppress_command_output) def remove_build_environment(self): """ @@ -874,7 +880,7 @@ class PackageBuilder: ) return - l.print_summary(f"To build '{' '.join(package_names)}'.") + l.print_summary(f"Building '{' '.join(package_names)}'.") chroot_new_pacman_pkgs, chroot_pkg_files = self._get_chroot_packages( packages) @@ -892,7 +898,7 @@ class PackageBuilder: self.chroot_dir, chroot_new_pacman_pkgs + PackageBuilder.always_included_packages), check=True, - capture_output=conf.quiet_output) + capture_output=conf.suppress_command_output) l.print_info("Making package.") @@ -907,8 +913,12 @@ class PackageBuilder: dest = shutil.copy(file, conf.pkg_cache_dir) - version = self._search.get_package_info( - pkgname).version # pyright: ignore[reportOptionalMemberAccess] + pkg_info = self._search.get_package_info(pkgname) + + # Because all dependencies and packages should be resolved during the creation + # of ResolvedDependencies. git_url should not be None. + assert pkg_info is not None + version = pkg_info.version l.print_debug( f"Adding '{pkgname}', version: '{version}' to cache as file '{dest}'." @@ -918,10 +928,11 @@ class PackageBuilder: l.print_info("Removing build dependencies from chroot.") - subprocess.run(conf.commands.remove_chroot_packages( - self.chroot_dir, chroot_new_pacman_pkgs), - check=True, - capture_output=conf.quiet_output) + if len(chroot_new_pacman_pkgs) != 0: + subprocess.run(conf.commands.remove_chroot_packages( + self.chroot_dir, chroot_new_pacman_pkgs), + check=True, + capture_output=conf.suppress_command_output) l.print_summary(f"Finished building: '{' '.join(package_names)}'.") @@ -931,10 +942,13 @@ class PackageBuilder: if cache_entry is None: return False cached_version, _ = cache_entry - # resolve_dependencies gets info for every package so info cannot be None - fetched_version = self._search.get_package_info( - pkg.name - ).version # pyright: ignore[reportOptionalMemberAccess] + + pkg_info = self._search.get_package_info(pkg.name) + + # Because all dependencies and packages should be resolved during the creation + # of ResolvedDependencies. git_url should not be None. + assert pkg_info is not None + fetched_version = pkg_info.version if cached_version != fetched_version or is_devel(pkg.name): return False @@ -957,6 +971,8 @@ class PackageBuilder: for pkg in pkgs_to_build: info = self._search.get_package_info(pkg.name) + # Because all dependencies and packages should be resolved during the creation + # of ResolvedDependencies. git_url should not be None. assert info is not None add_to_pacman_build_deps(info.pacman_make_dependencies) @@ -968,6 +984,8 @@ class PackageBuilder: # Add pacman deps of foreign packages for dep in foreign_deps: dep_info = self._search.get_package_info(dep) + # Because all dependencies and packages should be resolved during the creation + # of ResolvedDependencies. git_url should not be None. assert dep_info is not None add_to_pacman_build_deps(dep_info.pacman_make_dependencies) @@ -1025,7 +1043,7 @@ class PackageBuilder: try: subprocess.run(conf.commands.git_clone(git_url, "."), check=True, - capture_output=conf.quiet_output) + capture_output=conf.suppress_command_output) if l.prompt_confirm(f"Review PKGBUILD for {pkgbase}?", default=True):