pmbootstrap install: support _pmb_recommends (MR 1962)
Let UI meta-packages specify apps in "pmb_recommends" to be explicitly installed by default, and not implicitly as dependency of the UI meta-package ("depends"). Therefore make these apps uninstallable, without removing the meta-package. Add pmbootstrap install --no-recommends to disable this feature.
This commit is contained in:
parent
c8d581e749
commit
d8615a9cae
|
@ -250,6 +250,13 @@ apkbuild_package_attributes = {
|
||||||
"pkgdesc": {},
|
"pkgdesc": {},
|
||||||
"depends": {"array": True},
|
"depends": {"array": True},
|
||||||
"provides": {"array": True},
|
"provides": {"array": True},
|
||||||
|
|
||||||
|
# UI meta-packages can specify apps in "_pmb_recommends" to be explicitly
|
||||||
|
# installed by default, and not implicitly as dependency of the UI meta-
|
||||||
|
# package ("depends"). This makes these apps uninstallable, without
|
||||||
|
# removing the meta-package. (#1933). To disable this feature, use:
|
||||||
|
# "pmbootstrap install --no-recommends".
|
||||||
|
"_pmb_recommends": {"array": True},
|
||||||
}
|
}
|
||||||
|
|
||||||
# Variables in APKBUILD files, that get parsed
|
# Variables in APKBUILD files, that get parsed
|
||||||
|
|
|
@ -101,6 +101,36 @@ def get_kernel_package(args, device):
|
||||||
return ["device-" + device + "-kernel-" + args.kernel]
|
return ["device-" + device + "-kernel-" + args.kernel]
|
||||||
|
|
||||||
|
|
||||||
|
def get_recommends_packages(args):
|
||||||
|
""" Get all packages listed in _pmb_recommends of the UI and UI-extras
|
||||||
|
package, unless running with pmbootstrap install --no-recommends.
|
||||||
|
|
||||||
|
:returns: list of pkgnames, e.g. ["chatty", "gnome-contacts"] """
|
||||||
|
ret = []
|
||||||
|
if not args.install_recommends or args.ui == "none":
|
||||||
|
return ret
|
||||||
|
|
||||||
|
# UI package
|
||||||
|
meta = f"postmarketos-ui-{args.ui}"
|
||||||
|
apkbuild = pmb.helpers.pmaports.get(args, meta)
|
||||||
|
recommends = apkbuild["_pmb_recommends"]
|
||||||
|
if recommends:
|
||||||
|
logging.debug(f"{meta}: install _pmb_recommends:"
|
||||||
|
f" {', '.join(recommends)}")
|
||||||
|
ret += recommends
|
||||||
|
|
||||||
|
# UI-extras subpackage
|
||||||
|
meta_extras = f"{meta}-extras"
|
||||||
|
if args.ui_extras and meta_extras in apkbuild["subpackages"]:
|
||||||
|
recommends = apkbuild["subpackages"][meta_extras]["_pmb_recommends"]
|
||||||
|
if recommends:
|
||||||
|
logging.debug(f"{meta_extras}: install _pmb_recommends:"
|
||||||
|
f" {', '.join(recommends)}")
|
||||||
|
ret += recommends
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
def copy_files_from_chroot(args, suffix):
|
def copy_files_from_chroot(args, suffix):
|
||||||
"""
|
"""
|
||||||
Copy all files from the rootfs chroot to /mnt/install, except
|
Copy all files from the rootfs chroot to /mnt/install, except
|
||||||
|
@ -605,7 +635,8 @@ def install(args):
|
||||||
install_packages = (pmb.config.install_device_packages +
|
install_packages = (pmb.config.install_device_packages +
|
||||||
["device-" + args.device] +
|
["device-" + args.device] +
|
||||||
get_kernel_package(args, args.device) +
|
get_kernel_package(args, args.device) +
|
||||||
get_nonfree_packages(args, args.device))
|
get_nonfree_packages(args, args.device) +
|
||||||
|
get_recommends_packages(args))
|
||||||
if not args.install_base:
|
if not args.install_base:
|
||||||
install_packages = [p for p in install_packages if p != "postmarketos-base"]
|
install_packages = [p for p in install_packages if p != "postmarketos-base"]
|
||||||
if args.ui.lower() != "none":
|
if args.ui.lower() != "none":
|
||||||
|
|
|
@ -565,6 +565,10 @@ def arguments():
|
||||||
install.add_argument("--no-local-pkgs", dest="install_local_pkgs",
|
install.add_argument("--no-local-pkgs", dest="install_local_pkgs",
|
||||||
help="do not install locally compiled packages and"
|
help="do not install locally compiled packages and"
|
||||||
" package signing keys", action="store_false")
|
" package signing keys", action="store_false")
|
||||||
|
install.add_argument("--no-recommends", dest="install_recommends",
|
||||||
|
help="do not install packages listed in"
|
||||||
|
" _pmb_recommends of the UI pmaports",
|
||||||
|
action="store_false")
|
||||||
group = install.add_mutually_exclusive_group()
|
group = install.add_mutually_exclusive_group()
|
||||||
group.add_argument("--sparse", help="generate sparse image file"
|
group.add_argument("--sparse", help="generate sparse image file"
|
||||||
" (even if unsupported by device)", default=None,
|
" (even if unsupported by device)", default=None,
|
||||||
|
|
|
@ -44,3 +44,38 @@ def test_get_nonfree_packages(args):
|
||||||
# Device with non-free userland (but user disabled it init)
|
# Device with non-free userland (but user disabled it init)
|
||||||
args.nonfree_userland = False
|
args.nonfree_userland = False
|
||||||
assert func(args, device) == []
|
assert func(args, device) == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_recommends_packages(args):
|
||||||
|
args.aports = pmb_test.const.testdata + "/pmb_recommends"
|
||||||
|
func = pmb.install._install.get_recommends_packages
|
||||||
|
|
||||||
|
# UI: none
|
||||||
|
args.install_recommends = True
|
||||||
|
args.ui = "none"
|
||||||
|
assert func(args) == []
|
||||||
|
|
||||||
|
# UI: test, --no-recommends
|
||||||
|
args.install_recommends = False
|
||||||
|
args.ui = "test"
|
||||||
|
assert func(args) == []
|
||||||
|
|
||||||
|
# UI: test, without -extras
|
||||||
|
args.install_recommends = True
|
||||||
|
args.ui = "test"
|
||||||
|
args.ui_extras = False
|
||||||
|
assert func(args) == ["plasma-camera", "plasma-angelfish"]
|
||||||
|
|
||||||
|
# UI: test, with -extras
|
||||||
|
args.install_recommends = True
|
||||||
|
args.ui = "test"
|
||||||
|
args.ui_extras = True
|
||||||
|
assert func(args) == ["plasma-camera", "plasma-angelfish", "buho",
|
||||||
|
"kaidan"]
|
||||||
|
|
||||||
|
# UI: invalid
|
||||||
|
args.install_recommends = True
|
||||||
|
args.ui = "invalid"
|
||||||
|
with pytest.raises(RuntimeError) as e:
|
||||||
|
func(args)
|
||||||
|
assert str(e.value).startswith("Could not find aport for package")
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
pkgname=postmarketos-ui-test
|
||||||
|
pkgver=1
|
||||||
|
pkgrel=0
|
||||||
|
license="GPL-3.0-or-later"
|
||||||
|
depends=""
|
||||||
|
subpackages="$pkgname-extras"
|
||||||
|
arch="all"
|
||||||
|
|
||||||
|
_pmb_recommends="plasma-camera plasma-angelfish"
|
||||||
|
|
||||||
|
extras() {
|
||||||
|
_pmb_recommends="buho kaidan"
|
||||||
|
}
|
Loading…
Reference in New Issue