#!/usr/bin/env bash
# Copyright 2010 Joshua Ismael
# Copyright 2010 Nicolás Reynolds
# Copyright 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

cmd=${0##*/}
usage() {
	echo "Usage: $cmd [-h] pkgname-from-aur1 [pkgname-from-aur2 ...]"
	echo
	echo "This script will download packages from AUR to the current"
	echo "directory and check their license for nonfree issues.  This does"
	echo "not mean that they are free; they may be incorrectly labeled, or"
	echo "have other freedom issues.  It's a tool to help Parabola"
	echo "packagers, not to help users install things directly from AUR."
}

main() {
	while getopts 'h' arg; do
		case $arg in
			h) usage; return 0;;
			*) usage >&2; return 1;;
		esac
	done
	if [[ $# -lt 1 ]]; then
		usage >&2
		return 1
	fi

	. $(librelib conf.sh)
	load_files libretools
	check_vars libretools DIFFTOOL || exit 1

	local startdir="$(pwd)"
	local missing_deps=()
	local ret=0
	local pkg
	local copy_new
	local copy_old
	for pkg in "$@"; do
		pkg="${pkg%%[<>=]*}" # remove the version
		msg "Processing package: %s" "$pkg"
		copy_new="$startdir/$pkg"
		copy_old=

		if [[ -f "${copy_new}/PKGBUILD" ]]; then
			warning "%s already exists, will compare with new version." "$pkg"

			# Store our copy of the PKGBUILD dir
			copy_old=$copy_new
			copy_new="$(mktemp --tmpdir -d aur-${pkg}.new.XXXX)/$pkg"
			cd "${copy_new%/*}"
		fi

		msg2 "Downloading"
		local url="https://aur.archlinux.org/packages/${pkg:0:2}/$pkg/$pkg.tar.gz"
		set -o pipefail
		if ! wget -O- -q "$url" | bsdtar xf -; then
			ret=$(($ret|2))
			error "Couldn't get %s" "$pkg"
			continue
		fi
		set +o pipefail

		if [[ -n $copy_old ]]; then
			msg2 "Diffing files"
			cd "$copy_new"

			# Diff all files with our difftool
			local diffed=false
			for file in *; do
				if ! cmp -s "${copy_old}/${file}" "${copy_new}/${file}" ; then
					warning "%s != %s" "${copy_old}/${file}" "${copy_new}/${file}"
					diffed=true
					"${DIFFTOOL}" "${copy_old}/${file}" "${copy_new}/${file}"
				fi
			done
			if $diffed; then
				read -p "Press enter to continue."
			fi

			# Go back to our copy to continue working
			cd "$copy_old"
			rm -rf -- "${copy_new%/*}"
		else
			cd "$copy_new"
		fi

		load_PKGBUILD

		################################################################

		pkgbuild-check-nonfree -c
		case $? in
			0) :;;
			15) warning "This PKGBUILD links to known unfree packages";;
			*) warning "pkgbuild-check-nonfree failed to run";;
		esac

		################################################################

		local s=0
		pkgbuild-check-licenses || s=$?
		for i in 1 2 4; do
			if [[ $i -eq $(($s & $i)) ]]; then
				case $i in
					1) warning "pkgbuild-check-licenses encountered an error";;
					2) warning "This PKGBUILD has an uncommon license";;
					4) warning "This PKGBUILD has a known nonfree license";;
				esac
			fi
		done
		unset s

		################################################################

		local _deps=(
			# depends
			"${depends[@]}" "${makedepends[@]}" "${checkdepends[@]}"
			# mksource depends
			"${mkdepends[@]}"
		)
		local _dep
		msg2 "Checking dependencies"
		for _dep in "${_deps[@]}"; do
			_dep=${_dep/[<>=]*/}
			if ! is_built $_dep; then
				if ! pacman -Sddp "$_dep" &>/dev/null ; then
					plain "%s: will be downloaded from AUR" "$_dep"
					missing_deps+=($_dep)
				fi
			else
				plain "%s: is on repos" "$_dep"
			fi
		done
		cd "$startdir"
	done

	if [[ ${#missing_deps[*]} -gt 0 ]]; then
		msg "Retrieving missing deps: %s" "${missing_deps[*]}"
		"$0" "${missing_deps[@]}"
		ret=$(($ret|$?))
	fi
	return $ret;
}

main "$@"