archco: add option to clone all packages of a maintainer

Query Archweb to retrieve a list of all packages of a maintainer by
their pkgbase. AFterwards loop through all packages and clone them.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
This commit is contained in:
Levente Polyak 2022-09-11 22:08:47 +02:00
parent 5eb09a9cc9
commit 30616c4fde
No known key found for this signature in database
GPG Key ID: FC1B547C8D8172C8
3 changed files with 29 additions and 1 deletions

View File

@ -22,6 +22,7 @@ _archco_cmds=(
)
_archco_clone_args=(
'(-m --maintainer=)'{-m,--maintainer=}'[Clone all packages of the named maintainer]:maintainer:'
'(-u --unprivileged)'{-u,--unprivileged}'[Read-only access without packager info as Git author]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:packages:_devtools_completions_all_packages'

View File

@ -42,6 +42,11 @@ stat_busy() {
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2
}
stat_progress() {
# shellcheck disable=2059
printf "${BOLD}.${ALL_OFF}" >&2
}
stat_done() {
# shellcheck disable=2059
printf "${BOLD}done${ALL_OFF}\n" >&2

View File

@ -46,6 +46,7 @@ usage_clone() {
HTTPS.
OPTIONS
-m, --maintainer=NAME Clone all packages of the named maintainer
-u, --unprivileged Clone package with read-only access and without
packager info as Git author.
-h, --help Show this help text
@ -127,6 +128,15 @@ if (( CLONE )); then
UNPRIVILEGED=1
shift
;;
-m|--maintainer)
(( $# <= 1 )) && die "missing argument for %s" "$1"
MAINTAINER="$2"
shift 2
;;
--maintainer=*)
MAINTAINER="${1#*=}"
shift
;;
--)
shift
break
@ -170,6 +180,8 @@ elif (( CONFIGURE )); then
done
fi
pkgbases=("$@")
# Load makepkg.conf variables to be available
load_makepkg_config
@ -191,7 +203,17 @@ if (( ! UNPRIVILEGED )); then
fi
fi
pkgbases=("$@")
# Query packages of a maintainer
if [[ -n ${MAINTAINER} ]]; then
stat_busy "Query packages for ${MAINTAINER}"
max_pages=$(curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name&maintainer=${MAINTAINER}" | jq -r '.num_pages')
mapfile -t pkgbases < <(for page in $(seq "${max_pages}"); do
curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name&maintainer=${MAINTAINER}&page=${page}" | jq -r '.results[].pkgbase'
stat_progress
done | sort --unique)
stat_done
fi
for pkgbase in "${pkgbases[@]}"; do
if (( CLONE )); then
if [[ ! -d ${pkgbase} ]]; then