From 1fdde287245500b0c41178b093005ad359e0c969 Mon Sep 17 00:00:00 2001 From: fbt Date: Tue, 27 Jan 2015 23:12:56 +0300 Subject: [PATCH] Use the API derectly. Massive speed boost. Almost as fast as cower \m/ --- zpac | 72 +++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/zpac b/zpac index f08a628..ca11cdb 100755 --- a/zpac +++ b/zpac @@ -19,13 +19,28 @@ usage() { -h Show this message. -s Search for . -d Get the package sources (default). + -D If used with -d, makes $_self download the dependencies from AUR too. EOF } -aur.get() { +aur.info() { local pkg_aur_info=$( curl "${cfg_aur_api}?type=info&arg=${1}" 2>/dev/null ) - local pkg_base=$( jshon -e results -e PackageBase -u <<< "$pkg_aur_info" ) - local tarball_path=$( jshon -e results -e URLPath -u <<< "$pkg_aur_info" ) + 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" ) cd "$cfg_workdir" @@ -38,26 +53,37 @@ aur.get() { echo ": ${cfg_workdir}/${pkg_base}" if (( flag_get_deps )); then + unset depends makedepends + cd "${cfg_workdir}/${pkg_base}" source PKGBUILD for i in "${depends[@]}" "${makedepends[@]}"; do dep_name="${i/[<>=]*}" - dep_repo=$( package-query -1 -A -f '%r' "${dep_name}" ) - - if [[ "$dep_repo" == 'aur' ]]; then - [[ -d "${cfg_workdir}/${dep_name}" ]] || { - aur.get "$dep_name" || { return "$?"; } - } - fi + aur_api_multireq+="&arg\[\]=$dep_name" done + + aur_deps_api_data=$( curl "${cfg_aur_api}?type=multiinfo${aur_api_multireq}" ) + aur_deps_count=$( jshon -e resultcount <<< "$aur_deps_api_data" ) + + if (( aur_deps_count )); then + aur_deps=$( jshon -e results -a -e Name -u <<< "$aur_deps_api_data" ) + + echo "${aur_deps[@]}" + + for i in "${aur_deps[@]}"; do + aur.get < <(aur.info "$i") || { + return "$?" + } + done + fi fi } abs.get() { local svn_repo - case "$package_repo" in + case "$repo" in (community|multilib) svn_repo='community';; (*) @@ -90,7 +116,12 @@ main() { action=${action:-"get"} - package="$1" + if [[ "$1" ]]; then + package="$1" + else + usage + return 1 + fi case "$action" in (get) @@ -101,21 +132,26 @@ main() { } } - IFS='/' read repo _ < <( package-query -AS -f '%r/%n' "$package" ) + pkg_aur_info=$( aur.info "$package" ) - if [[ "$?" > 0 ]]; then - err "Can't find package: $package" - return 1 + if (( ! "$?" )); then + repo='aur' + else + repo=$( package-query -S -f '%r' "$package" ) + (( "$?" )) || { + err "Can't find package ${package}" + return 1 + } fi echo "Found ${package} in ${repo}." case "$repo" in (aur) - aur.get "$package";; + aur.get <<< "$pkg_aur_info";; (core|extra|community|multilib) - abs.get "$package";; + abs.get "${package}" "";; (*) err "Repository $repo not supported."