#!/bin/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 missing_deps=()
	local ret=0
	for _pkg in "$@"; do

		# Remove the version
		_pkg="${_pkg%%[<>=]*}"

		if [[ -f "${_pkg}/PKGBUILD" ]]; then
			warning "${_pkg} already existed."

			# Store our copy of the PKGBUILD dir
			_diff="${PWD}/${_pkg}"
			pushd $(mktemp --tmpdir -d ${_pkg}.XXXX) &>/dev/null
			msg2 "Downloading PKGBUILD into ${PWD} for diff"
		fi

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

		pushd $_pkg &>/dev/null

		if [[ ! -z $_diff ]]; then
			msg2 "Diffing files"
			# Diff all files with our difftool
			for file in *; do
				"${DIFFTOOL}" "${_diff}/${file}" "${file}"
			done
			read -p "Press enter to continue."

			# Go back to our copy to continue working
			pushd "${_diff}" &>/dev/null
		fi

		. PKGBUILD

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

		pkgbuild-check-nonfree
		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 [[ $s == $(($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

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

		_deps=(
			# depends
			"${depends[@]}" "${makedepends[@]}" "${checkdepends[@]}"
			# mksource depends
			"${mkdepends[@]}" "${mkmakedepends[@]}" "${mkcheckdepends[@]}"
		)
		for _dep in "${_deps[@]}"; do
			_dep=${_dep/[<>=]*/}
			if ! is_built $_dep; then
				if ! pacman -Sddp "$_dep" &>/dev/null ; then
					msg2 "$_dep will be get from AUR"
					missing_deps+=($_dep)
				fi
			else
				msg2 "$_dep is on repos"
			fi
		done

		popd &>/dev/null
	done

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

main "$@"