| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | #!/usr/bin/env bash | 
					
						
							| 
									
										
										
										
											2015-01-27 18:52:16 +03:00
										 |  |  | # Author: Jack L. Frost <fbt@fleshless.org> | 
					
						
							|  |  |  | # Licensed under the Internet Software Consortium (ISC) license. | 
					
						
							|  |  |  | # See LICENSE for its text. | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 18:41:12 +03:00
										 |  |  | _self="${0##*/}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 00:05:27 +03:00
										 |  |  | cfg_workdir="$PWD" | 
					
						
							| 
									
										
										
										
											2015-01-27 20:05:23 +03:00
										 |  |  | cfg_aur_url='https://aur.archlinux.org' | 
					
						
							|  |  |  | cfg_aur_api="${cfg_aur_url}/rpc.php" | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | echo() { printf '%s\n' "$*"; } | 
					
						
							|  |  |  | err() { echo "$*" >&2; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 18:41:12 +03:00
										 |  |  | usage() { | 
					
						
							|  |  |  | 	while read; do echo "$REPLY"; done <<- EOF | 
					
						
							|  |  |  | 		Usage: $_self [flags] <package> | 
					
						
							|  |  |  | 		Flags: | 
					
						
							|  |  |  | 		        -h        Show this message. | 
					
						
							|  |  |  | 		        -s        Search for <package>. | 
					
						
							|  |  |  | 		        -d        Get the package sources (default). | 
					
						
							| 
									
										
										
										
											2015-01-28 00:08:16 +03:00
										 |  |  | 		        -D        If used with -d, makes $_self download the dependencies from AUR too. | 
					
						
							| 
									
										
										
										
											2015-01-27 18:41:12 +03:00
										 |  |  | 	EOF | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 23:50:10 +03:00
										 |  |  | aur.search() { | 
					
						
							|  |  |  | 	local aur_api_search_data aur_search_result_num pkg | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	aur_api_search_data=$( curl -skL "${cfg_aur_api}?type=search&arg=${1}" ) | 
					
						
							|  |  |  | 	aur_search_result_num=$( jshon -e resultcount -u <<< "$aur_api_search_data" ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (( aur_search_result_num )); then | 
					
						
							|  |  |  | 		aur_search_results=( $( jshon -e results -a -e Name -u <<< "$aur_api_search_data" ) ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for i in "${!aur_search_results[@]}"; do | 
					
						
							|  |  |  | 			printf 'aur/%s\n    %s\n' "${aur_search_results[${i}]}" "$( jshon -e results -e $i -e Description -u <<< "$aur_api_search_data" )" | 
					
						
							|  |  |  | 		done | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return 1 | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 23:12:56 +03:00
										 |  |  | aur.info() { | 
					
						
							| 
									
										
										
										
											2015-01-27 23:50:10 +03:00
										 |  |  | 	local pkg_aur_info=$( curl -skL "${cfg_aur_api}?type=info&arg=${1}" 2>/dev/null ) | 
					
						
							| 
									
										
										
										
											2015-01-27 23:12:56 +03:00
										 |  |  | 	local aur_query_result=$( jshon -e resultcount -u <<< "$pkg_aur_info" ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (( aur_query_result )); then | 
					
						
							|  |  |  | 		echo "$pkg_aur_info" | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return 1 | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | aur.get() { | 
					
						
							|  |  |  | 	local dep_name aur_api_multireq aur_deps_api_data aur_deps_count aur_deps pkg_aur_info pkg_base tarball_path | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	read pkg_aur_info | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	pkg_base=$( jshon -e results -e PackageBase -u <<< "$pkg_aur_info" ) | 
					
						
							|  |  |  | 	tarball_path=$( jshon -e results -e URLPath -u <<< "$pkg_aur_info" ) | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	cd "$cfg_workdir" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 20:05:23 +03:00
										 |  |  | 	echo "Downloading ${cfg_aur_url}${tarball_path}" | 
					
						
							|  |  |  | 	{ curl -skL "${cfg_aur_url}${tarball_path}" | gzip -d | tar x; } || { | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 		err "Fail!" | 
					
						
							|  |  |  | 		return 1 | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-01-27 19:17:26 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 19:52:45 +03:00
										 |  |  | 	echo ": ${cfg_workdir}/${pkg_base}" | 
					
						
							| 
									
										
										
										
											2015-01-27 19:17:26 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (( flag_get_deps )); then | 
					
						
							| 
									
										
										
										
											2015-01-27 23:12:56 +03:00
										 |  |  | 		unset depends makedepends | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 19:52:45 +03:00
										 |  |  | 		cd "${cfg_workdir}/${pkg_base}" | 
					
						
							| 
									
										
										
										
											2015-01-27 19:17:26 +03:00
										 |  |  | 		source PKGBUILD | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for i in "${depends[@]}" "${makedepends[@]}"; do | 
					
						
							|  |  |  | 			dep_name="${i/[<>=]*}" | 
					
						
							| 
									
										
										
										
											2015-01-27 23:12:56 +03:00
										 |  |  | 			aur_api_multireq+="&arg\[\]=$dep_name" | 
					
						
							|  |  |  | 		done | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2015-01-27 23:50:10 +03:00
										 |  |  | 		aur_deps_api_data=$( curl -skL "${cfg_aur_api}?type=multiinfo${aur_api_multireq}" ) | 
					
						
							| 
									
										
										
										
											2015-01-27 23:12:56 +03:00
										 |  |  | 		aur_deps_count=$( jshon -e resultcount <<< "$aur_deps_api_data" ) | 
					
						
							| 
									
										
										
										
											2015-01-27 19:17:26 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 23:12:56 +03:00
										 |  |  | 		if (( aur_deps_count )); then | 
					
						
							|  |  |  | 			aur_deps=$( jshon -e results -a -e Name -u <<< "$aur_deps_api_data" ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			for i in "${aur_deps[@]}"; do | 
					
						
							|  |  |  | 				aur.get < <(aur.info "$i") || { | 
					
						
							|  |  |  | 					return "$?" | 
					
						
							| 
									
										
										
										
											2015-01-27 20:05:23 +03:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2015-01-27 23:12:56 +03:00
										 |  |  | 			done | 
					
						
							|  |  |  | 		fi | 
					
						
							| 
									
										
										
										
											2015-01-27 19:17:26 +03:00
										 |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | abs.get() { | 
					
						
							| 
									
										
										
										
											2015-01-27 23:52:16 +03:00
										 |  |  | 	local pkg_repo svn_repo | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 23:52:16 +03:00
										 |  |  | 	pkg_repo="$2" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	case "$pkg_repo" in | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 		(community|multilib) | 
					
						
							|  |  |  | 			svn_repo='community';; | 
					
						
							|  |  |  | 		(*) | 
					
						
							|  |  |  | 			svn_repo='packages';; | 
					
						
							|  |  |  | 	esac | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	svn checkout "svn://svn.archlinux.org/${svn_repo}/${1}/trunk" "${cfg_workdir}/${1}" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | main() { | 
					
						
							| 
									
										
										
										
											2015-01-28 00:05:27 +03:00
										 |  |  | 	if [[ -f "$HOME/.config/zpac.rc.sh" ]]; then | 
					
						
							|  |  |  | 		source "$HOME/.config/zpac.rc.sh" | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 	while (( $# )); do | 
					
						
							|  |  |  | 		case "$1" in | 
					
						
							| 
									
										
										
										
											2015-01-28 10:11:51 +03:00
										 |  |  | 			(-h) usage; return 0;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			(-s) action='search';; | 
					
						
							|  |  |  | 			(-A) | 
					
						
							|  |  |  | 				action='search' | 
					
						
							|  |  |  | 				flag_search_aur=1;; | 
					
						
							|  |  |  | 			(-S) | 
					
						
							|  |  |  | 				action='search' | 
					
						
							|  |  |  | 				flag_search_syncdb=1;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			(-d) action='get';; | 
					
						
							|  |  |  | 			(-D) | 
					
						
							|  |  |  | 				action='get' | 
					
						
							|  |  |  | 				flag_get_deps=1;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			(--) shift; break;; | 
					
						
							|  |  |  | 			(-*) | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 				err "Unknown key: $1" | 
					
						
							|  |  |  | 				usage | 
					
						
							|  |  |  | 				return 1 | 
					
						
							|  |  |  | 			;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			*) break;; | 
					
						
							|  |  |  | 		esac | 
					
						
							|  |  |  | 		shift | 
					
						
							|  |  |  | 	done | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-28 10:11:51 +03:00
										 |  |  | 	(( flag_search_aur && flag_search_syncdb )) && { | 
					
						
							|  |  |  | 		unset flag_search_aur flag_search_syncdb | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	[[ "$action" ]] || { | 
					
						
							|  |  |  | 		usage | 
					
						
							|  |  |  | 		return 1 | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 23:12:56 +03:00
										 |  |  | 	if [[ "$1" ]]; then | 
					
						
							|  |  |  | 		package="$1" | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		usage | 
					
						
							|  |  |  | 		return 1 | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	case "$action" in | 
					
						
							|  |  |  | 		(get) | 
					
						
							|  |  |  | 			[[ -d "$cfg_workdir" ]] || { | 
					
						
							|  |  |  | 				mkdir -p "$cfg_workdir" || { | 
					
						
							|  |  |  | 					err "Can't create workdir: ${cfg_workdir}." | 
					
						
							|  |  |  | 					return 1 | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 23:12:56 +03:00
										 |  |  | 			pkg_aur_info=$( aur.info "$package" ) | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-27 23:12:56 +03:00
										 |  |  | 			if (( ! "$?" )); then | 
					
						
							|  |  |  | 				repo='aur' | 
					
						
							|  |  |  | 			else | 
					
						
							| 
									
										
										
										
											2015-01-27 23:50:10 +03:00
										 |  |  | 				while read; do | 
					
						
							|  |  |  | 					if [[ "$REPLY" =~ ^Repository ]]; then | 
					
						
							|  |  |  | 						repo="${REPLY##* }" | 
					
						
							|  |  |  | 					fi | 
					
						
							|  |  |  | 				done < <( pacman -Si "$package" ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				[[ "$repo" ]] || { | 
					
						
							| 
									
										
										
										
											2015-01-27 23:12:56 +03:00
										 |  |  | 					err "Can't find package ${package}" | 
					
						
							|  |  |  | 					return 1 | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 			fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			echo "Found ${package} in ${repo}." | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case "$repo" in | 
					
						
							|  |  |  | 				(aur) | 
					
						
							| 
									
										
										
										
											2015-01-27 23:12:56 +03:00
										 |  |  | 					aur.get <<< "$pkg_aur_info";; | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				(core|extra|community|multilib) | 
					
						
							| 
									
										
										
										
											2015-01-27 23:52:16 +03:00
										 |  |  | 					abs.get "$package" "$repo";; | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				(*) | 
					
						
							|  |  |  | 					err "Repository $repo not supported." | 
					
						
							|  |  |  | 					return 1;; | 
					
						
							|  |  |  | 			esac | 
					
						
							|  |  |  | 		;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		(search) | 
					
						
							| 
									
										
										
										
											2015-01-28 10:11:51 +03:00
										 |  |  | 			if (( flag_search_aur )); then | 
					
						
							|  |  |  | 				aur.search "$package" || { | 
					
						
							|  |  |  | 					err "No packages found." | 
					
						
							|  |  |  | 					return 1 | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			elif (( flag_search_syncdb )); then | 
					
						
							|  |  |  | 				pacman -Ss "$package" | 
					
						
							| 
									
										
										
										
											2015-01-27 23:50:10 +03:00
										 |  |  | 			else | 
					
						
							|  |  |  | 				aur.search "$package" || { flag_aur_search_fail=1; } | 
					
						
							|  |  |  | 				pacman -Ss "$package" 2>/dev/null || { flag_pacman_search_fail=1; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (( flag_aur_search_fail && flag_pacman_search_fail )); then | 
					
						
							|  |  |  | 					err "No packages found." | 
					
						
							|  |  |  | 					return 1 | 
					
						
							|  |  |  | 				fi | 
					
						
							|  |  |  | 			fi | 
					
						
							| 
									
										
										
										
											2015-01-27 18:37:40 +03:00
										 |  |  | 		;; | 
					
						
							|  |  |  | 	esac | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | main "$@" |