diff options
-rwxr-xr-x | src/lib/blacklist.sh | 19 | ||||
-rwxr-xr-x | test/lib-blacklist-test.sh | 10 |
2 files changed, 23 insertions, 6 deletions
diff --git a/src/lib/blacklist.sh b/src/lib/blacklist.sh index e3d976b..c092ed3 100755 --- a/src/lib/blacklist.sh +++ b/src/lib/blacklist.sh @@ -93,7 +93,24 @@ 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() { - blacklist-normalize | cut -d: -f2 + 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]] + } + }' } # Usage: blacklist-cat | blacklist-get-url diff --git a/test/lib-blacklist-test.sh b/test/lib-blacklist-test.sh index 1f8c518..7b88b72 100755 --- a/test/lib-blacklist-test.sh +++ b/test/lib-blacklist-test.sh @@ -8,16 +8,16 @@ _blacklist_url=https://projects.parabola.nu/blacklist.git/plain/blacklist.txt it_works_with_just_pkgname() { v="$(libreblacklist normalize <<<skype)"; [[ $v == 'skype::::' ]] v="$(libreblacklist get-pkg <<<skype)"; [[ $v == skype ]] - libreblacklist get-rep <<<skype | equals $'\n' + libreblacklist get-rep <<<irreplaceable | equals $'\n' libreblacklist get-url <<<skype | equals $'\n' libreblacklist get-reason <<<skype | equals $'\n' } it_works_with_everything_set() { - line='linux:linux-libre:parabola:id:[semifree] blobs and firmware' + line='linux:conflict:parabola:id:[semifree] blobs and firmware' v="$(libreblacklist normalize <<<"$line")"; [[ $v == "$line" ]] v="$(libreblacklist get-pkg <<<"$line")"; [[ $v == 'linux' ]] - v="$(libreblacklist get-rep <<<"$line")"; [[ $v == 'linux-libre' ]] + v="$(libreblacklist get-rep <<<"$line")"; [[ $v == 'libre/linux-libre' ]] v="$(libreblacklist get-url <<<"$line")"; [[ $v == 'https://labs.parabola.nu/issues/id' ]] v="$(libreblacklist get-reason <<<"$line")"; [[ $v == '[semifree] blobs and firmware' ]] } @@ -37,10 +37,10 @@ it_normalizes_correctly() { } it_works_with_colons_in_reason() { - line='package:replacement:parabola:id:my:reason' + line='package:conflict:parabola:id:my:reason' v="$(libreblacklist normalize <<<"$line")"; [[ $v == "$line" ]] v="$(libreblacklist get-pkg <<<"$line")"; [[ $v == 'package' ]] - v="$(libreblacklist get-rep <<<"$line")"; [[ $v == 'replacement' ]] + libreblacklist get-rep <<<"$line" | equals $'\n' v="$(libreblacklist get-url <<<"$line")"; [[ $v == 'https://labs.parabola.nu/issues/id' ]] v="$(libreblacklist get-reason <<<"$line")"; [[ $v == 'my:reason' ]] } |