X-Git-Url: https://pd.if.org/git/?p=zpackage;a=blobdiff_plain;f=bin%2Fzpm-repo;fp=bin%2Fzpm-repo;h=76359b8e2f6679ae2f80b01ea3779d1acf6a3b30;hp=0000000000000000000000000000000000000000;hb=0419c62f964b259df1c1816f5870ef62eb97ed7c;hpb=0c2216d1e0dc8565a6bf61c9572e47bb1ae1c1fb diff --git a/bin/zpm-repo b/bin/zpm-repo new file mode 100755 index 0000000..76359b8 --- /dev/null +++ b/bin/zpm-repo @@ -0,0 +1,241 @@ +#!/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 + +warn() { + printf '%s:' "$0" 1>&2 + printf ' %s' $* 1>&2 + printf '\n' 1>&2 + exit 1 +} + +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 [ -z "$url" ]; then + check_for_repo "$repo" || warn "no url for repo $repo" + return 1 + fi + if [ -f "$rf" ]; then + # TODO merge in so packages aren't deleted + zpm fetchurl -fpn -z "$rf" -o "$rf.tmp" "$url" + rv=$? + else + zpm fetchurl -fpn -o "$rf.tmp" "$url" && refresh "$repo" + rv=$? + fi + if [ $rv -eq 0 ]; then + test -f "$rf.tmp" && + zpm test "$rf.tmp" && + mv "$rf.tmp" "$rf" + refresh "$repo" + fi + done +} + +head_response_code() { + zpm fetchurl -S -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 + zpm fetchurl -f '-#' -z "$dest" -o "$dest.tmp" $fetch + mv "$dest.tmp" "$dest" + else + echo downloading $pkgid + zpm fetchurl -f '-#' -o "$dest.tmp" $fetch + mv "$dest.tmp" "$dest" + fi + fi + done +} + +purge() { + 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" + + if [ -f "$dest" ]; then + rm $dest + fi + zpm rmpackage -f $repodir/$repo.repo $pkgid + fi + done +} + +check_for_repo() { + rn=$(select "$1" name) + if [ -z "$rn" ]; then + warn "no repository $1" + return 1 + fi + return 0 +} + +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 + test -d "$repodir/$repo" && rm -r "$repodir/$repo" + ;; + 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 "$@" + ;; + contents) + repo=$1 + shift + zpm contents -f $repodir/$repo.repo "$@" + ;; + purge) + purge "$@" + ;; + + *) + echo unknown action + exit 1 + ;; +esac