forked from Mirror/pmbootstrap
Here are the changes necessary in pmbootstrap to make proprietary software installed onto the device (firmware and userspace drivers) optional (#756). To full close the issue, we need to apply this concept to all device packages we already have in a follow-up PR. Changes: * New config file options nonfree_firmware and nonfree_userland, which we ask for during "pmbootstrap init" if there are non-free components for the selected device. * We find that out by checking the APKBUILD's subpakages: The non-free packages are called $pkgname-nonfree-firmware and $pkgname-nonfree-userland. * During "pmbootstrap init" we also show the pkgdesc of these subpackages. Parsing that is implemented in pmb.parse._apkbuild.subpkgdesc(). It was not implemented as part of the regular APKBUILD parsing, as this would need a change in the output format, and it is a lot *less* code if done like in this commit. * pmb/parse/apkbuild.py was renamed to _apkbuild.py, and pmb/install/install.py to _install.py: needed to call the function in the usual way (e.g. pmb.parse.apkbuild()) but still being able to test the individual functions from these files in the test suite. We did the same thing for pmb/build/_package.py already. * Install: New function get_nonfree_packages() returns the non-free packages that will be installed, based on the user's choice in "pmbootstrap init" and on the subpackages the device has. * Added test cases and test data (APKBUILDs) for all new code, refactored test/test_questions.py to have multiple functions for testing the various questions / question types from "pmbootstrap init" instead of having it all in one big function. This allows to use another aport folder for testing the new non-free related questions in init.
126 lines
4.2 KiB
Python
126 lines
4.2 KiB
Python
"""
|
|
Copyright 2018 Oliver Smith
|
|
|
|
This file is part of pmbootstrap.
|
|
|
|
pmbootstrap is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
pmbootstrap is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with pmbootstrap. If not, see <http://www.gnu.org/licenses/>.
|
|
"""
|
|
import os
|
|
import sys
|
|
import glob
|
|
import pytest
|
|
|
|
# Import from parent directory
|
|
pmb_src = os.path.realpath(os.path.join(os.path.dirname(__file__) + "/.."))
|
|
sys.path.append(pmb_src)
|
|
import pmb.parse.apkindex
|
|
import pmb.parse
|
|
import pmb.helpers.logging
|
|
|
|
|
|
@pytest.fixture
|
|
def args(request):
|
|
import pmb.parse
|
|
sys.argv = ["pmbootstrap.py", "chroot"]
|
|
args = pmb.parse.arguments()
|
|
args.log = args.work + "/log_testsuite.txt"
|
|
pmb.helpers.logging.init(args)
|
|
request.addfinalizer(args.logfd.close)
|
|
return args
|
|
|
|
|
|
def test_qt_versions(args):
|
|
"""
|
|
Verify, that all postmarketOS qt5- package versions match with Alpine's
|
|
qt5-qtbase version.
|
|
"""
|
|
# Upstream version
|
|
pmb.helpers.repo.update(args)
|
|
repository = args.mirror_alpine + args.alpine_version + "/community"
|
|
hash = pmb.helpers.repo.hash(repository)
|
|
index_path = (args.work + "/cache_apk_armhf/APKINDEX." + hash +
|
|
".tar.gz")
|
|
index_data = pmb.parse.apkindex.package(args, "qt5-qtbase",
|
|
indexes=[index_path])
|
|
pkgver_upstream = index_data["version"].split("-r")[0]
|
|
|
|
# Iterate over our packages
|
|
failed = []
|
|
for path in glob.glob(args.aports + "/*/qt5-*/APKBUILD"):
|
|
# Read the pkgver
|
|
apkbuild = pmb.parse.apkbuild(args, path)
|
|
pkgname = apkbuild["pkgname"]
|
|
pkgver = apkbuild["pkgver"]
|
|
|
|
# When we temporarily override packages from Alpine, we set the pkgver
|
|
# to 9999 and _pkgver contains the real version (see #994).
|
|
if pkgver == "9999":
|
|
pkgver = apkbuild["_pkgver"]
|
|
|
|
# Compare
|
|
if pkgver == pkgver_upstream:
|
|
continue
|
|
failed.append(pkgname + ": " + pkgver + " != " +
|
|
pkgver_upstream)
|
|
|
|
assert [] == failed
|
|
|
|
|
|
def test_aportgen_versions(args):
|
|
"""
|
|
Verify that the packages generated by 'pmbootstrap aportgen' have
|
|
the same version (pkgver *and* pkgrel!) as the upstream packages
|
|
they are based on.
|
|
"""
|
|
|
|
# Get Alpine's "main" repository APKINDEX path
|
|
pmb.helpers.repo.update(args)
|
|
repository = args.mirror_alpine + args.alpine_version + "/main"
|
|
hash = pmb.helpers.repo.hash(repository)
|
|
index_path = (args.work + "/cache_apk_armhf/APKINDEX." + hash +
|
|
".tar.gz")
|
|
|
|
# Alpine packages and patterns for our derivatives
|
|
map = {"binutils": "binutils-*",
|
|
"busybox": "busybox-static-*",
|
|
"gcc": "gcc-*",
|
|
"musl": "musl-*"}
|
|
|
|
# Iterate over Alpine packages
|
|
failed = []
|
|
generated = "# Automatically generated aport, do not edit!"
|
|
for pkgname, pattern in map.items():
|
|
# Upstream version
|
|
index_data = pmb.parse.apkindex.package(args, pkgname,
|
|
indexes=[index_path])
|
|
version_upstream = index_data["version"]
|
|
|
|
# Iterate over our packages
|
|
for path in glob.glob(args.aports + "/*/" + pattern + "/APKBUILD"):
|
|
# Skip non-aportgen APKBUILDs
|
|
with open(path) as handle:
|
|
if generated not in handle.read():
|
|
continue
|
|
|
|
# Compare the version
|
|
print("Checking " + path)
|
|
apkbuild = pmb.parse.apkbuild(args, path)
|
|
version = apkbuild["pkgver"] + "-r" + apkbuild["pkgrel"]
|
|
if version != version_upstream:
|
|
failed.append(apkbuild["pkgname"] + ": " + version +
|
|
" != " + version_upstream +
|
|
" (from " + pkgname + ")")
|
|
continue
|
|
|
|
assert [] == failed
|