jw-pkg packages install: Add -x/--exact option #159
Loading…
Reference in a new issue
No description provided.
Delete branch "jan/feature/20261028-jw-pkg-packages-install-add-x-exact-option"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This PR makes dependency resolution explicit throughout the
jw-pkginstall path and adds a direct route for installing packages without resolving their dependencies and automatically installing them along. The commits build on each other:Packagegains a version field so local files can be classified against the installed state, lib.pm.*.install_packages()installs files withrpm -U/dpkg -i(the dpkg route gated on an apt simulation, becausedpkg -ileaves a half-configured package on a missing dependency), theDistroinstall methods takeinstall_deps- the base class raises when a distro offers no direct route - and the command gains-x/--exact: by default local files go through the package manager with dependency resolution,--exactkeeps the direct route.lib.Package: Add and fill version field
Add a version field to the
Packageclass and makequery_packages()fill it. It's very much distribution and package dependent what shape that version has, so fromPackage's perspective, it's just a str-typed member.Further improvements and fixes:
query_packages()accept throw, defaulting to the previous behaviour, so a caller that wants to be prepared for a missing package / an empty result can passthrow = False._run()andrun_dpkg_query()forwardecand the remaining keyword arguments on the sudo path, which dropped them before.Add unit tests for the file type tree and its StatResult predicates.
lib.pm.*.install_packages(): Add functions
Currently,
jw-pkginstall is sometimes left to the high-level package manager, which is allowed to install dependencies along, and that's sometimes unwanted, but there's no backend in the low-level package manager module lib.pm to allow specifying that. This commit adds it: lib.pm.*.install_packages().The functions install a list of local package files using the low-level package managers
rpm/dpkg, bypassing the high-level package managersyum/apt/zypper.pm.rpm runs
rpm -Uand pm.dpkg runsdpkg -i. Every file is classified against the installed state of its package, queried by name: a file for a package that is not installed is installed fresh, a file with another version installed is upgraded, and a file whose version is already installed is reinstalled whenforceis set and skipped otherwise. Onrpm, plain-Urefuses a package that is already installed, and--reinstallaborts the transaction when a file of the incoming package differs from the installed one, so the upgrades run before the reinstalls and the same-version files need force.With
only_update, a file for a package that is not installed raises before anything is installed.The dpkg route is gated on an apt simulation, because
dpkg -ileaves a half-configured package when a dependency is missing: the simulation runs first and the install is refused when it would install or remove anything but the given files' own packages.lib.distros.Distro.install_*(): Add install_deps
The install methods of Distro inconsistently resolve dependencies or don't depending on the descendant's implementation. Pin that more unambigously by adding a new parameter
install_deps, defaulting to True, to the following methods of lib.Distro:_install_local_files()_install_urls()_install_urls_and_names()install()The implementations in lib.distros.* make use of the new lib.pm.*.
install_packages()method introduced by the previous commit.Add a unit test directory per Distro descendant.
cmds.pkg: Add --exact to jw-pkg packages install
Add an additional option
-x, which inhibits dependency resolution during installation of packages.