From: Nathan Wagner Date: Sat, 1 Dec 2018 01:35:47 +0000 (+0000) Subject: add zpm-repo X-Git-Tag: v0.3.0~1 X-Git-Url: https://pd.if.org/git/?p=zpackage;a=commitdiff_plain;h=4f0360dec786865a87b61b2fa6260082c9d42627 add zpm-repo --- diff --git a/zpm-repo b/zpm-repo new file mode 100755 index 0000000..a6afe35 --- /dev/null +++ b/zpm-repo @@ -0,0 +1,188 @@ +#!/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