18 Commits
v1.0 ... v2.4

Author SHA1 Message Date
fbt
7d778ecd66 Better argument handling. 2015-01-31 18:45:47 +03:00
fbt
aa8929ff8e a fix for multiple dependencies. 2015-01-29 12:35:07 +03:00
fbt
2ab2fdd126 usage update 2015-01-28 10:38:56 +03:00
fbt
2c37b9e64e Mention cfg_workdir in the README 2015-01-28 10:13:07 +03:00
fbt
59432612de explicit and implicit action. Removed default one. 2015-01-28 10:11:51 +03:00
fbt
61a9cbd34d usage fix 2015-01-28 00:08:20 +03:00
fbt
8ba3c36d4a config support, README 2015-01-28 00:06:21 +03:00
fbt
3d960cd6e4 Config support 2015-01-28 00:05:27 +03:00
fbt
048d64fc46 stray debug message 2015-01-27 23:58:11 +03:00
fbt
b484a167f4 consistency 2015-01-27 23:52:16 +03:00
fbt
40f797ac20 Getting rid of package-query 2015-01-27 23:50:10 +03:00
fbt
1fdde28724 Use the API derectly. Massive speed boost. Almost as fast as cower \m/ 2015-01-27 23:12:56 +03:00
fbt
5cd8546ece fixes 2015-01-27 20:05:23 +03:00
fbt
e0b175f496 Ask the API for the package base 2015-01-27 19:52:45 +03:00
fbt
9de0ce1e8d Fix for working with package groups 2015-01-27 19:34:57 +03:00
fbt
aa4062634c get AUR deps too 2015-01-27 19:17:26 +03:00
fbt
c1324aeccc Mention the license in the header 2015-01-27 18:52:16 +03:00
fbt
bcf746b858 license 2015-01-27 18:51:41 +03:00
3 changed files with 203 additions and 21 deletions

13
LICENSE Normal file
View File

@@ -0,0 +1,13 @@
Copyright (c) 2012-2014, Jack L. Frost <fbt@fleshless.org>
Permission to use, copy, modify, and/or distribute this software for any purpose with or without
fee is hereby granted, provided that the above copyright notice and this permission notice appear
in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
OF THIS SOFTWARE.

View File

@@ -7,4 +7,11 @@ A very simple AUR/ABS helper. Doesn't build packages, only gets the sources.
Flags: Flags:
-h Show this message. -h Show this message.
-s Search for <package>. -s Search for <package>.
-S Search only in the sync db. Implies -s.
-A Search only in AUR. Implies -s.
-d Get the package sources (default). -d Get the package sources (default).
-D Get the dependencies also. Implies -d.
You can override any value in the script in \$HOME/.config/zpac.rc.sh
By default zpac downloads the sources into the current directory. Controlled by `$cfg_workdir`.

204
zpac
View File

@@ -1,8 +1,13 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Author: Jack L. Frost <fbt@fleshless.org>
# Licensed under the Internet Software Consortium (ISC) license.
# See LICENSE for its text.
_self="${0##*/}" _self="${0##*/}"
cfg_workdir="/tmp/$USER/zpac" cfg_workdir="$PWD"
cfg_aur_url='https://aur.archlinux.org'
cfg_aur_api="${cfg_aur_url}/rpc.php"
echo() { printf '%s\n' "$*"; } echo() { printf '%s\n' "$*"; }
err() { echo "$*" >&2; } err() { echo "$*" >&2; }
@@ -13,26 +18,91 @@ usage() {
Flags: Flags:
-h Show this message. -h Show this message.
-s Search for <package>. -s Search for <package>.
-S Search only in the sync db. Implies -s.
-A Search only in AUR. Implies -s.
-d Get the package sources (default). -d Get the package sources (default).
Set twice to also get the dependencies.
EOF EOF
} }
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
}
aur.info() {
local pkg_aur_info=$( curl -skL "${cfg_aur_api}?type=info&arg=${1}" 2>/dev/null )
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() { aur.get() {
local tarball_url=$(package-query -1 -AS -f %u "$1") 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" cd "$cfg_workdir"
echo "Downloading $tarball_url" echo "Downloading ${cfg_aur_url}${tarball_path}"
{ curl "$tarball_url" | gzip -d | tar x; } || { { curl -skL "${cfg_aur_url}${tarball_path}" | gzip -d | tar x; } || {
err "Fail!" err "Fail!"
return 1 return 1
} }
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/[<>=]*}"
aur_api_multireq+="&arg\[\]=$dep_name"
done
aur_deps_api_data=$( curl -skL "${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" ) )
for i in "${aur_deps[@]}"; do
aur.get < <(aur.info "$i") || {
return "$?"
}
done
fi
fi
} }
abs.get() { abs.get() {
local svn_repo local pkg_repo svn_repo
case "$package_repo" in pkg_repo="$2"
case "$pkg_repo" in
(community|multilib) (community|multilib)
svn_repo='community';; svn_repo='community';;
(*) (*)
@@ -42,16 +112,71 @@ abs.get() {
svn checkout "svn://svn.archlinux.org/${svn_repo}/${1}/trunk" "${cfg_workdir}/${1}" svn checkout "svn://svn.archlinux.org/${svn_repo}/${1}/trunk" "${cfg_workdir}/${1}"
} }
args_norm() {
while (( $# )); do
unset -v arg opt c keys
case "$1" in
--) shift; break;;
--*)
IFS='=' read arg opt <<< "$1"
printf '%s\n' "$arg"
[[ "$opt" ]] && {
printf '%s\n' "$opt"
}
;;
-*)
while read -n1 c
do
case "$c" in
-|'') :;;
*) keys+=( "-$c" );;
esac
done <<< "$1"
printf '%s\n' "${keys[@]}"
;;
esac
[[ "$2" && ! "$2" =~ ^- ]] && {
printf '%s\n' "$2"
shift
}
shift
done
}
main() { main() {
if [[ -f "$HOME/.config/zpac.rc.sh" ]]; then
source "$HOME/.config/zpac.rc.sh"
fi
while (( $# )); do while (( $# )); do
case "$1" in case "$1" in
--help|-h) usage; return 0;; (-h) usage; return 0;;
-s) action='search';; (-s) action='search';;
-d) action='get';; (-A)
action='search'
flag_search_aur=1;;
(-S)
action='search'
flag_search_syncdb=1;;
--) shift; break;; (-d)
-*) if [[ "$action" == 'get' ]]; then
flag_get_deps=1
else
action='get'
fi
;;
(--) shift; break;;
(-*)
err "Unknown key: $1" err "Unknown key: $1"
usage usage
return 1 return 1
@@ -62,9 +187,21 @@ main() {
shift shift
done done
action=${action:-"get"} (( flag_search_aur && flag_search_syncdb )) && {
unset flag_search_aur flag_search_syncdb
}
package="$1" [[ "$action" ]] || {
usage
return 1
}
if [[ "$1" ]]; then
package="$1"
else
usage
return 1
fi
case "$action" in case "$action" in
(get) (get)
@@ -75,21 +212,31 @@ main() {
} }
} }
IFS='/' read repo _ < <( package-query -AS -f '%r/%n' "$package" ) pkg_aur_info=$( aur.info "$package" )
if [[ "$?" > 0 ]]; then if (( ! "$?" )); then
err "Can't find package: $package" repo='aur'
return 1 else
while read; do
if [[ "$REPLY" =~ ^Repository ]]; then
repo="${REPLY##* }"
fi
done < <( pacman -Si "$package" )
[[ "$repo" ]] || {
err "Can't find package ${package}"
return 1
}
fi fi
echo "Found ${package} in ${repo}." echo "Found ${package} in ${repo}."
case "$repo" in case "$repo" in
(aur) (aur)
aur.get "$package";; aur.get <<< "$pkg_aur_info";;
(core|extra|community|multilib) (core|extra|community|multilib)
abs.get "$package";; abs.get "$package" "$repo";;
(*) (*)
err "Repository $repo not supported." err "Repository $repo not supported."
@@ -98,9 +245,24 @@ main() {
;; ;;
(search) (search)
package-query -ASs "$package" if (( flag_search_aur )); then
aur.search "$package" || {
err "No packages found."
return 1
}
elif (( flag_search_syncdb )); then
pacman -Ss "$package"
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
;; ;;
esac esac
} }
main "$@" main $(args_norm "$@")