]> pd.if.org Git - zpackage/blob - zpm-repo
more contents docs
[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 purge() {
161         repo=$1
162         shift
163         url=$(select "$repo" url)
164         base=${url%/*}
165         for package in "$@"; do
166                 pkgid=$(zpm findpkg -f $repodir/$repo.repo $package)
167                 if [ -z "$pkgid" ]; then
168                         warn "no package found for $package"
169                 else
170                         mkdir -p "$repodir/$repo"
171                         dest="$repodir/$repo/$pkgid.zpm"
172
173                         if [ -f "$dest" ]; then
174                                 rm $dest
175                         fi
176                         zpm rmpackage -f $repodir/$repo.repo $pkgid
177                 fi
178         done
179 }
180
181 check_for_repo() {
182         rn=$(select "$1" name)
183         if [ -z "$rn" ]; then
184                 warn "no repository $1"
185                 return 1
186         fi
187         return 0
188 }
189
190 case $action in
191         list)
192                 select '' priority,name,url,refreshed ;;
193         add)
194                 name=$(zpm quote "$1")
195                 url=$(zpm quote "$2")
196                 zpm shell $ZPMDB "insert into repository (name,url) values ('$name', '$url')"
197                 ;;
198         del)
199                 name=$(zpm quote "$1")
200                 zpm shell $ZPMDB "delete from repository where name = '$name'"
201                 rm -f $repodir/$1.repo
202                 # TODO delete caches
203                 ;;
204         url)
205                 if [ -n "$2" ]; then
206                         update "$1" url "$2"
207                 else
208                         select "$1" url
209                 fi
210                 ;;
211         pri*)
212                 if [ -n "$2" ]; then
213                         update "$1" priority "$2"
214                 else
215                         select "$1" priority
216                 fi
217                 ;;
218         fetch|download)
219                 download "$@"
220                 ;;
221         update|pull)
222                 update_info "$@"
223                 ;;
224         packages)
225                 repo=$1
226                 shift
227                 zpm list -f $repodir/$repo.repo "$@"
228                 ;;
229         contents)
230                 repo=$1
231                 shift
232                 zpm contents -f $repodir/$repo.repo "$@"
233                 ;;
234         purge)
235                 purge "$@"
236                 ;;
237
238         *)
239                 echo unknown action
240                 exit 1
241                 ;;
242 esac