]> pd.if.org Git - zpackage/blob - zpm-repo
add contents action to zpm repo
[zpackage] / zpm-repo
1 #!/bin/sh
2
3 # control repositories
4
5 # repo ...
6 # add name <url>
7 # del name
8 # pri name <n>
9 # list [-v ] [ name ... ]
10 # note name <note>
11 # url name [url]
12 # packages [ name ... ] -- like zpm list
13 # contents [ name ... ] -- like zpm contents
14 # search [ name ] -- packages
15 # push name ckagefile ...
16 # pull name package ...
17 # extract -- extract metadata from repo
18 # json - extract metadata as json
19 # setpkgurl packageid url
20 # update - pull info from remote
21 # gc [name] - run zpm gc on repo file
22
23 chroot=1
24 pkgroot=
25
26 while getopts :R:d: opt; do
27         case $opt in
28                 R) pkgroot="$OPTARG" ;;
29                 d) ZPMDB="$OPTARG" ;;
30         esac
31 done
32
33 shift $((OPTIND - 1))
34
35 for cf in /etc/zpmrc ~/.zpmrc ./.zpmrc; do
36         test -r $cf && . $cf
37 done
38
39 pkgroot=${pkgroot%/}
40
41 : ${ZPMDB:=$pkgroot/var/lib/zpm/local.db}
42
43 repodir=/var/lib/zpm/repo
44 mkdir -p $repodir
45
46 export ZPMDB
47
48 warn() {
49         printf '%s:' "$0" 1>&2
50         printf ' %s' $* 1>&2
51         printf '\n' 1>&2
52         exit 1
53 }
54
55 die() {
56         printf '%s:' "$0" 1>&2
57         printf ' %s' $* 1>&2
58         printf '\n' 1>&2
59         exit 1
60 }
61
62 set -e
63 zpm test -v $ZPMDB
64
65 if [ $# -gt 0 ]; then
66         action=$1
67         shift
68 else
69         action=list
70 fi
71
72 select() (
73         name=$(zpm quote "$1")
74         cols=$2
75         if [ -n "$name" ]; then
76                 where="where name = '$name'"
77         fi
78         zpm shell -separator ' ' $ZPMDB "select $cols from repository $where order by priority,name"
79 )
80
81 update() (
82         name=$(zpm quote "$1")
83         col=$2
84         val=$(zpm quote "$3")
85         if [ -n "$name" ]; then
86                 where="where name = '$name'"
87         fi
88         zpm shell $ZPMDB "update repository set $col = '$val' $where"
89 )
90
91 refresh() {
92         zpm shell $ZPMDB "update repository set refreshed = strftime('%s', 'now') where name = '$1'"
93 }
94
95 update_info() {
96         if [ $# -eq 0 ]; then
97                 set $(select '' name)
98         fi
99         for repo in "$@"; do
100                 url=$(select "$repo" url)
101                 rf="$repodir/$repo.repo"
102                 if [ -z "$url" ]; then
103                         check_for_repo "$repo" || warn "no url for repo $repo"
104                         return 1
105                 fi
106                 if [ -f "$rf" ]; then
107                         # TODO merge in so packages aren't deleted
108                         curl -f '-#' -z "$rf" -o "$rf.tmp" "$url"
109                         rv=$?
110                 else
111                         curl -f '-#' -o "$rf" "$url" && refresh "$repo"
112                         rv=$?
113                 fi
114                 if [ $rv -eq 0 ]; then
115                         test -f "$rf.tmp" && mv "$rf.tmp" "$rf"
116                         refresh "$repo"
117                 fi
118         done
119 }
120
121 # response=$(curl --write-out %{http_code} --silent --output /dev/null servername)
122 # --head
123
124 head_response_code() {
125         curl --write-out '%{http_code}' --silent --output /dev/null -z $2 $1
126 }
127
128 download() {
129         repo=$1
130         shift
131         url=$(select "$repo" url)
132         base=${url%/*}
133         for package in "$@"; do
134                 pkgid=$(zpm findpkg -f $repodir/$repo.repo $package)
135                 if [ -z "$pkgid" ]; then
136                         warn "no package found for $package"
137                 else
138                         mkdir -p "$repodir/$repo"
139                         dest="$repodir/$repo/$pkgid.zpm"
140                         fetch="$base/packages/$pkgid.zpm"
141
142                         if [ -f "$dest" ]; then
143                                 rc=$(head_response_code $fetch $dest)
144                                 if [ $rc = 304 ]; then
145                                         echo "have $pkgid"
146                                         continue
147                                 fi
148                                 echo downloading $pkgid
149                                 curl -f '-#' -z "$dest" -o "$dest.tmp" $fetch
150                                 mv "$dest.tmp" "$dest"
151                         else
152                                 echo downloading $pkgid
153                                 curl -f '-#' -o "$dest.tmp" $fetch
154                                 mv "$dest.tmp" "$dest"
155                         fi
156                 fi
157         done
158 }
159
160 check_for_repo() {
161         rn=$(select "$1" name)
162         if [ -z "$rn" ]; then
163                 warn "no repository $1"
164                 return 1
165         fi
166         return 0
167 }
168
169 case $action in
170         list)
171                 select '' priority,name,url,refreshed ;;
172         add)
173                 name=$(zpm quote "$1")
174                 url=$(zpm quote "$2")
175                 zpm shell $ZPMDB "insert into repository (name,url) values ('$name', '$url')"
176                 ;;
177         del)
178                 name=$(zpm quote "$1")
179                 zpm shell $ZPMDB "delete from repository where name = '$name'"
180                 rm -f $repodir/$1.repo
181                 # TODO delete caches
182                 ;;
183         url)
184                 if [ -n "$2" ]; then
185                         update "$1" url "$2"
186                 else
187                         select "$1" url
188                 fi
189                 ;;
190         pri*)
191                 if [ -n "$2" ]; then
192                         update "$1" priority "$2"
193                 else
194                         select "$1" priority
195                 fi
196                 ;;
197         fetch|download)
198                 download "$@"
199                 ;;
200         update|pull)
201                 update_info "$@"
202                 ;;
203         packages)
204                 repo=$1
205                 shift
206                 zpm list -f $repodir/$repo.repo "$@"
207                 ;;
208         contents)
209                 repo=$1
210                 shift
211                 zpm contents -f $repodir/$repo.repo "$@"
212                 ;;
213         *)
214                 echo unknown action
215                 exit 1
216                 ;;
217 esac