#!/bin/bash # pkgbuild-check-nonfree # Copyright 2010 Joshua Ismael Haase Hernández, Joseph Graham # ---------- 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 . # function log_end { # kill "$teepid" # rm "$logpipe" # } # function log { # LOG="pkgbuild-check-nonfree-$(date -u +%Y%m%d).log" # # ensure overridden package variables survive tee with split packages # logpipe="$(mktemp -u "$startdir/logpipe.XXXXXXXX")" # mkfifo "$logpipe" # tee "$LOG" < "$logpipe" & # teepid=$! # trap log_end ERR EXIT # } function 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' } function 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 } function check_replacement { [ $2 ] || return 0 # Free (not found) local needle=$1; shift local item local rep for line in $@; do item="$(echo "$line" | cut -d':' -f1)" 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) } function get_blacklist { # Download the blacklist. 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 } function check_deps { # Check wheter a package depends on non-free unset_pkgbuild if ! assert_pkgbuild "$1"; then return 1 # not PKGBUILD fi msg2 "${pkgbase:-${pkgname[0]}} $pkgver $pkgrel ${epoch:-""}" # > "$logpipe" for pkg in ${pkgname[@]} ${depends[@]} ${makedepends[@]} ${checkdepends[@]}; do lines=($(grep "$pkg" "$XDG_CONFIG_HOME/libretools/blacklist.txt" | tr " " "_")) rep="$(check_replacement $pkg ${lines[@]})" freedom=$? if [ "$freedom" -eq 15 ]; then warning "found $pkg" # > "$logpipe" ev=15 continue elif [ -n "$rep" ]; then if [ "$rep" = "$pkg" ]; then plain "$pkg is repackaged with the same name." # > "$logpipe" continue else plain "$pkg -> $rep" # > "$logpipe" continue fi fi done } function usage { # TODO: implement PKGBUILD arguments echo "" echo "$(basename $0) [options] [PKGBUILD1 PKGBUILD2 ...]" echo "" echo "OPTIONS" echo "" echo " -h : this message" echo "" echo "If no PKGBUILD is specified, one is searched on current directory" exit 1 } while getopts 'h' arg; do case "$arg" in h) usage ;; esac done if [ -w / ]; then error "Run as normal user" fi source /etc/libretools.conf if [ -e "$XDG_CONFIG_HOME/libretools/libretools.conf" ]; then source "$XDG_CONFIG_HOME/libretools/libretools.conf" fi if [ -z "${BLACKLIST}" ]; then error "BLACKLIST variable is not set your libretools.conf file" exit 1 fi if [ ! -d "$XDG_CONFIG_HOME/libretools" ]; then mkdir -p "$XDG_CONFIG_HOME/libretools" fi startdir=`pwd` get_blacklist # log shift $(( OPTIND - 1)) msg "Looking for unfree dependencies" if [ $# -ge 1 ]; then for p in $@; do if [ -n "$p" ]; then check_deps "$p" fi done else check_deps "`pwd`/PKGBUILD" fi exit $ev