summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/pkgbuild-check-nonfree318
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 "$@"