#!/bin/sh # control repositories # repo ... # add name # del name # pri name # list [-v ] [ name ... ] # note name # url name [url] # packages [ name ... ] -- like zpm list # contents [ name ... ] -- like zpm contents # search [ name ] -- packages # push name ckagefile ... # pull name package ... # extract -- extract metadata from repo # json - extract metadata as json # setpkgurl packageid url # update - pull info from remote # gc [name] - run zpm gc on repo file chroot=1 pkgroot= while getopts :R:d: opt; do case $opt in R) pkgroot="$OPTARG" ;; d) ZPMDB="$OPTARG" ;; esac done shift $((OPTIND - 1)) for cf in /etc/zpmrc ~/.zpmrc ./.zpmrc; do test -r $cf && . $cf done pkgroot=${pkgroot%/} : ${ZPMDB:=$pkgroot/var/lib/zpm/local.db} repodir=/var/lib/zpm/repo mkdir -p $repodir export ZPMDB die() { printf '%s:' "$0" 1>&2 printf ' %s' $* 1>&2 printf '\n' 1>&2 exit 1 } set -e zpm test -v $ZPMDB if [ $# -gt 0 ]; then action=$1 shift else action=list fi select() ( name=$(zpm quote "$1") cols=$2 if [ -n "$name" ]; then where="where name = '$name'" fi zpm shell -separator ' ' $ZPMDB "select $cols from repository $where order by priority,name" ) update() ( name=$(zpm quote "$1") col=$2 val=$(zpm quote "$3") if [ -n "$name" ]; then where="where name = '$name'" fi zpm shell $ZPMDB "update repository set $col = '$val' $where" ) refresh() { zpm shell $ZPMDB "update repository set refreshed = strftime('%s', 'now') where name = '$1'" } update_info() { if [ $# -eq 0 ]; then set $(select '' name) fi for repo in "$@"; do url=$(select "$repo" url) rf="$repodir/$repo.repo" if [ -f "$rf" ]; then # TODO merge in so packages aren't deleted curl -f '-#' -z "$rf" -o "$rf.tmp" "$url" && mv "$rf.tmp" "$rf" && refresh "$repo" else curl -f '-#' -o "$rf" "$url" && refresh "$repo" fi done } # response=$(curl --write-out %{http_code} --silent --output /dev/null servername) # --head head_response_code() { curl --write-out '%{http_code}' --silent --output /dev/null -z $2 $1 } download() { repo=$1 shift url=$(select "$repo" url) base=${url%/*} for package in "$@"; do pkgid=$(zpm findpkg -f $repodir/$repo.repo $package) if [ -z "$pkgid" ]; then warn "no package found for $package" else mkdir -p "$repodir/$repo" dest="$repodir/$repo/$pkgid.zpm" fetch="$base/packages/$pkgid.zpm" if [ -f "$dest" ]; then rc=$(head_response_code $fetch $dest) if [ $rc = 304 ]; then echo "have $pkgid" continue fi echo downloading $pkgid curl -f '-#' -z "$dest" -o "$dest.tmp" $fetch mv "$dest.tmp" "$dest" else echo downloading $pkgid curl -f '-#' -o "$dest.tmp" $fetch mv "$dest.tmp" "$dest" fi fi done } case $action in list) select '' priority,name,url,refreshed ;; add) name=$(zpm quote "$1") url=$(zpm quote "$2") zpm shell $ZPMDB "insert into repository (name,url) values ('$name', '$url')" ;; del) name=$(zpm quote "$1") zpm shell $ZPMDB "delete from repository where name = '$name'" rm -f $repodir/$1.repo # TODO delete caches ;; url) if [ -n "$2" ]; then update "$1" url "$2" else select "$1" url fi ;; pri*) if [ -n "$2" ]; then update "$1" priority "$2" else select "$1" priority fi ;; fetch|download) download "$@" ;; update|pull) update_info "$@" ;; packages) repo=$1 shift zpm list -f $repodir/$repo.repo "$@" ;; *) echo unknown action exit 1 ;; esac