summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@parabola.nu>2024-02-21 14:44:39 -0700
committerLuke T. Shumaker <lukeshu@parabola.nu>2024-02-21 14:44:39 -0700
commit15aae08d0f4e2858611fcf73c361cd8641f0b4d3 (patch)
treecd7cc3b7fd4348c78fe093e8f3660c4650389e18
parent3bf33e25b2ce0fbbcd0e4bac27d8a3e7e0a7e34c (diff)
fix: pkgbuild-check-nonfree, blacklist.sh: Get the check-nonfree tests passing
-rwxr-xr-xsrc/lib/blacklist.sh33
-rwxr-xr-xsrc/pkgbuild-check-nonfree32
-rw-r--r--test/cases/lib-blacklist.bats6
-rw-r--r--test/cases/pkgbuild-check-nonfree.bats3
4 files changed, 44 insertions, 30 deletions
diff --git a/src/lib/blacklist.sh b/src/lib/blacklist.sh
index 84333e8..d36502e 100755
--- a/src/lib/blacklist.sh
+++ b/src/lib/blacklist.sh
@@ -99,24 +99,21 @@ blacklist-get-pkg() {
# Usage: blacklist-cat | blacklist-get-rep
# Prints only the replacement package field of the blacklist line(s) on stdin.
blacklist-get-rep() {
- local -a targets=($(blacklist-get-pkg))
- expac -Ss '%r/%n %n %P %R' | awk -v arr="${targets[*]}" '
- {
- gsub("[=<>]+[^[:blank:]]*", "", $0) # discard versioning
- # build pkg -> providers table from pkg -> provides
- for (provided = 2; provided <= NF; ++provided) {
- if (! seen[$1 " " $provided]++) {
- providers[$provided] = providers[$provided] $1 " "
- }
- }
- }
- END {
- split(arr, targets, " ")
- for (pkg in targets) {
- sub("[ \t]+$", "", providers[targets[pkg]])
- print providers[targets[pkg]]
- }
- }'
+ # TODO(lukeshu): I am confident that this could be done more
+ # efficiently with Python+pyalpm than with awk+expac.
+ blacklist-normalize | awk -F: '
+ # trust blacklist.txt for packages re-packaged with the same name
+ # (otherwise there would be a bootstrapping problem).
+ $2 == $1 {
+ print $2
+ }
+ # but otherwise, do not trust blacklist.txt to have an accurate
+ # state of the repos and what replacements exist.
+ $2 != $1 {
+ cmd="expac -S '\''%r/%n %P : %R '\'' | sed -E '\''s/[=<>]+\\S*//g'\'' | grep '\'' " $1 " .*:.* " $1 " '\'' | awk '\''{print $1}'\''"
+ cmd | getline rep
+ print rep
+ }'
}
# Usage: blacklist-cat | blacklist-get-url
diff --git a/src/pkgbuild-check-nonfree b/src/pkgbuild-check-nonfree
index 6215f36..6bec280 100755
--- a/src/pkgbuild-check-nonfree
+++ b/src/pkgbuild-check-nonfree
@@ -221,15 +221,29 @@ check_dep() {
# Checks for ${pkgname} in the blacklist
check_pkg() {
[[ $# == 1 ]] || panic 'malformed call to check_pkg'
- check_dep "$@"
- case $? in
- $_E_OK)
- return $_E_OK;;
- $_E_DEP_NONFREE)
- return $_E_PKG_NONFREE;;
- *)
- panic 'unexpected return code from check_dep';;
- esac
+ local pkg=$1
+
+ local line rep
+ line="$(blacklist-cat|blacklist-lookup "$pkg")"
+ rep="$(blacklist-get-rep <<<"$line")"
+ if [[ -z $line ]]; then
+ # not mentioned in blacklist; free
+ info '%s: not blacklisted' "$pkg"
+ return $_E_OK
+ elif [[ -z $rep ]]; then
+ # non-free with no replacement
+ plain '%s: blacklisted' "$pkg"
+ return $_E_PKG_NONFREE
+ else
+ # non-free with free replacement
+ if [[ "$rep" == "$pkg" ]]; then
+ info '%s: repackaged with the same name' "$pkg"
+ return $_E_OK
+ else
+ info '%s: replaced by %s (update blacklist.txt first if you would like to repackage it with the same name)' "$pkg" "$rep"
+ return $_E_PKG_NONFREE
+ fi
+ fi
panic 'code should never be reached'
}
diff --git a/test/cases/lib-blacklist.bats b/test/cases/lib-blacklist.bats
index 2388b15..ba74d04 100644
--- a/test/cases/lib-blacklist.bats
+++ b/test/cases/lib-blacklist.bats
@@ -130,3 +130,9 @@ load ../lib/common
[[ "$(sed 1q $tmpdir/stdout)" == 'Usage: libreblacklist cat' ]]
empty $tmpdir/stderr
}
+
+@test "libreblacklist checks for replacements from the repos" {
+ libreblacklist get-rep <<<'linux' >$tmpdir/stdout 2>$tmpdir/stderr
+ [[ "$(cat $tmpdir/stdout)" == 'libre/linux-libre' ]]
+ empty $tmpdir/stderr
+}
diff --git a/test/cases/pkgbuild-check-nonfree.bats b/test/cases/pkgbuild-check-nonfree.bats
index 15ef332..ffd8de8 100644
--- a/test/cases/pkgbuild-check-nonfree.bats
+++ b/test/cases/pkgbuild-check-nonfree.bats
@@ -114,7 +114,6 @@ declare -rig EXIT_FAILURE=1
# _E_DEP_NONFREE
@test "pkgbuild-check-nonfree succeeds for repackaged depend" {
- skip # FIXME/BUG
pkgbuild-check-nonfree fixtures/pkgbuild-check-nonfree/PKGBUILD.dep-repackaged >$tmpdir/stdout 2>$tmpdir/stderr || status=$?
empty $tmpdir/stdout
not empty $tmpdir/stderr
@@ -143,14 +142,12 @@ declare -rig EXIT_FAILURE=1
# _E_PKG_NONFREE
@test "pkgbuild-check-nonfree succeeds for repackaged package" {
- skip # FIXME/BUG
pkgbuild-check-nonfree fixtures/pkgbuild-check-nonfree/PKGBUILD.pkg-repackaged >$tmpdir/stdout 2>$tmpdir/stderr || status=$?
empty $tmpdir/stdout
not empty $tmpdir/stderr
[[ $status == $_E_OK ]]
}
@test "pkgbuild-check-nonfree fails for package with replacement" {
- skip # FIXME/BUG
pkgbuild-check-nonfree fixtures/pkgbuild-check-nonfree/PKGBUILD.pkg-nonfree-replacement >$tmpdir/stdout 2>$tmpdir/stderr || status=$?
empty $tmpdir/stdout
not empty $tmpdir/stderr