diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/pkgbuild-check-nonfree | 318 |
1 files changed, 144 insertions, 174 deletions
diff --git a/src/pkgbuild-check-nonfree b/src/pkgbuild-check-nonfree index 0fd480c..ada95b5 100755 --- a/src/pkgbuild-check-nonfree +++ b/src/pkgbuild-check-nonfree @@ -1,187 +1,157 @@ #!/bin/bash -# pkgbuild-check-nonfree -# Copyright 2010 Joshua Ismael Haase Hernández, Joseph Graham -# Copyright 2012 Luke Shumaker - -# ---------- GNU General Public License 3 ---------- - -# This file is part of Parabola. - -# Parabola 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. - -# Parabola 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 Parabola. If not, see <http://www.gnu.org/licenses/>. - -. /etc/libretools.conf - -cmd=${0##*/} -ev=0 - -# log_end() { -# kill "$teepid" -# rm "$logpipe" -# } - -# log() { -# local LOG="pkgbuild-check-nonfree-$(date -u +%Y%m%d).log" -# # ensure overridden package variables survive tee with split packages -# logpipe="$(mktemp)" -# mkfifo "$logpipe" -# tee "$LOG" < "$logpipe" & -# teepid=$! -# trap log_end ERR EXIT -# } - - -unset_pkgbuild() { - unset 'pkgbase' 'pkgname' 'pkgver' 'pkgrel' 'epoch' 'pkgdesc' \ - 'arch' 'url' 'license' 'groups' 'optdepends' 'provides' \ - 'conflicts' 'replaces' 'backup' 'options' 'install' \ - 'changelog' 'source' 'noextract' 'md5sums' 'build' \ - 'check' 'package' 'depends' 'makedepends' 'checkdepends' -} - -assert_pkgbuild() { - if [ -e "$1" ]; then - - source "$1" - if [ -n "${pkgname[0]}" ]; then - return 0 # valid PKGBUILD - fi - - fi - - error "$1 is not a valid PKGBUILD" - return 1 +# pkgbuild-check-nonfree + +# Copyright 2010 Joshua Ismael Haase Hernández, Joseph Graham +# Copyright 2012-2013 Luke Shumaker +# +# This file is part of Parabola. +# +# Parabola 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. +# +# Parabola 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 Parabola. If not, see <http://www.gnu.org/licenses/>. + +. libremessages +. /usr/share/libretools/conf.sh + +# Unset any PKGBUILD variables inherited from the environment +# I took these from makepkg 4.1.1-1 +unset pkgname pkgbase pkgver pkgrel epoch pkgdesc url license groups provides +unset md5sums replaces depends conflicts backup source install changelog build +unset makedepends optdepends options noextract + +# Usage: blacklist_lookup $pkg +# Look up the blacklist entry for $pkg +blacklist_lookup() { + local pkg=$1 + sed 's/^/^/;s/$/:/' "$XDG_CONFIG_HOME/libretools/blacklist.txt" | + grep -F "^$pkg:" | + sed 's/^^//;s/:*$//' } -check_replacement() { - [ $2 ] || return 0 # Free (not found) - local needle=$1; shift - local item - local rep - for line in $@; do - - local item="$(echo "$line" | cut -d':' -f1)" - local rep="$(echo "$line" | cut -s -d':' -f2)" - - if [ "$item" == "$needle" ]; then - if [ -z "$rep" ]; then - return 15 # Nonfree (found) - else - echo "$rep" - return 0 # Free (has replacement) - fi - fi - - done - return 0 # Free (not found) +# Usage: update_blacklist $url +# Update the cached blacklist file +update_blacklist() { + local remote_blacklist="$1" + local local_blacklist="$XDG_CONFIG_HOME/libretools/blacklist.txt" + + stat_busy "Downloading blacklist of proprietary software packages" + + mkdir -p "${local_blacklist%/*}" + if wget -N -q -O "${local_blacklist}.part" "$remote_blacklist" 2>/dev/null; then + stat_done + mv "${local_blacklist}.part" "$local_blacklist" + else + stat_done + rm "${local_blacklist}.part" + if [[ -e "$XDG_CONFIG_HOME/libretools/blacklist.txt" ]]; then + warning "Using local copy of blacklist" + else + error "Download failed, exiting" + return 1 + fi + + fi } -## -# Download the blacklist. -## -get_blacklist() { - mkdir -p "$XDG_CONFIG_HOME/libretools" - pushd "$XDG_CONFIG_HOME/libretools" >/dev/null - - msg "Downloading the blacklist of proprietary software packages." - - if ! wget -N -q -O blacklist.txt "${BLACKLIST}" 2>/dev/null; then - - if [ -e "$XDG_CONFIG_HOME/libretools/blacklist.txt" ]; then - warning "Using local copy of blacklist" - else - error "Download failed, exiting" - fi - - fi - - popd > /dev/null -} - -## -# Check wheter a package depends on non-free -## -check_deps() { - unset_pkgbuild - if ! assert_pkgbuild "$1"; then - exit 1 # not PKGBUILD - fi - - msg2 "${pkgbase:-${pkgname[0]}} $pkgver $pkgrel ${epoch:-""}" # > "$logpipe" - - for pkg in "${pkgname[@]}" "${depends[@]}" "${makedepends[@]}" "${checkdepends[@]}"; do - - local lines=($(grep "$pkg" "$XDG_CONFIG_HOME/libretools/blacklist.txt" | tr " " "_")) - - local rep="$(check_replacement $pkg ${lines[@]})" - local freedom=$? - - if [[ $freedom = 15 ]]; then - warning "found $pkg" # > "$logpipe" - ev=15 - elif [ -n "$rep" ]; then - if [ "$rep" = "$pkg" ]; then - plain "$pkg is repackaged with the same name." # > "$logpipe" - else - plain "$pkg -> $rep" # > "$logpipe" - fi - fi - done -} +# Usage: check_deps $pkgbuild +# Check whether a PKGBUILD package depends on non-free packages +check_deps() ( + # Note that we use () instead of {} for this function; so that variables + # from the PKBUILD don't bubble up + local pkgbuild=$1 + . "$pkgbuild" + if [[ -z "$pkgname" ]]; then + return 1 # not a PKGBUILD + fi + + msg2 "Looking for unfree dependencies of ${pkgbase:-${pkgname[0]}} $(get_full_version)" + + local pkgs=( + # packages being built + "${pkgname[@]}" + # depends + "${depends[@]}" "${makedepends[@]}" "${checkdepends[@]}" + # mksource depends + "${mkdepends[@]}" "${mkmakedepends[@]}" "${mkcheckdepends[@]}" + ) + local ret=0 + for pkg in "${pkgs[@]}"; do + local line="$(blacklist_lookup $pkg)" + local rep="$(cut -d: -f2 <<<"$line:")" + if [[ -z $line ]]; then + # not mentioned in blacklist; free + plain "$pkg: free" + continue + elif [[ -z $rep ]]; then + # non-free with no replacement + plain "$pkg: non-free" + ret=1 + else + # non-free with free replacement + if [[ "$rep" == "$pkg" ]]; then + plain "$pkg: repackaged with the same name." + else + plain "$pkg: replaced by $rep" + fi + fi + done + return $ret +) +cmd=${0##*/} usage() { - # TODO: implement PKGBUILD arguments - echo "Usage: $cmd [OPTIONS] [PKGBUILD1 PKGBUILD2 ...]" - echo "" - echo "If no PKGBUILD is specified, \`./PKGBUILD' is implied" - echo "" - echo "Options:" - echo " -f Allow running as root user" - echo " -h Show this message" + echo "Usage: $cmd [OPTIONS] [PKGBUILD1 PKGBUILD2 ...]" + echo '' + echo "If no PKGBUILD is specified, \`./PKGBUILD' is implied" + echo '' + echo "Exit status:" + echo " 0: Everything OK, no freedom issues" + echo " 1: Ran with error" + echo " 15: Depends on non-free packages" + echo '' + echo "Options:" + echo ' -f Allow running as root user' + echo ' -h Show this message' } main() { - local asroot=false - while getopts 'fh' arg; do - case "$arg" in - f) asroot=true;; - h) usage; exit 0;; - *) usage; exit 1;; - esac - done - shift $(($OPTIND - 1)) - pkgbuilds=("$@") - if [[ $# < 1 ]]; then - pkgbuilds=("`pwd`/PKGBUILD") - fi - - if [[ -w / ]] && ! $asroot; then - error "Run as normal user" - exit 1 - fi - - get_blacklist - # log - - msg "Looking for unfree dependencies" - - for p in "${pkgbuilds[@]}"; do - if [[ -n "$p" ]]; then - check_deps "$p" - fi - done - - return $ev + local asroot=false + while getopts 'fh' arg; do + case "$arg" in + f) asroot=true;; + h) usage; return 0;; + *) usage; return 1;; + esac + done + shift $(($OPTIND - 1)) + if [[ $# < 1 ]]; then + pkgbuilds=("`pwd`/PKGBUILD") + else + pkgbuilds=("$@") + fi + + if [[ -w / ]] && ! $asroot; then + error "Run as normal user, or use the -f option to run as root." + return 1 + fi + + load_conf_libretools || return 1 # load ${BLACKLIST} + update_blacklist "$BLACKLIST" || return 1 + + local ret=0 + for pkgbuild in "${pkgbuilds[@]}"; do + check_deps "$pkgbuild" || ret=15 + done + return $ret } main "$@" |