]> pd.if.org Git - zpackage/blob - zpm-repo
add new files to make targets
[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 die() {
49         printf '%s:' "$0" 1>&2
50         printf ' %s' $* 1>&2
51         printf '\n' 1>&2
52         exit 1
53 }
54
55 set -e
56 zpm test -v $ZPMDB
57
58 if [ $# -gt 0 ]; then
59         action=$1
60         shift
61 else
62         action=list
63 fi
64
65 select() (
66         name=$(zpm quote "$1")
67         cols=$2
68         if [ -n "$name" ]; then
69                 where="where name = '$name'"
70         fi
71         zpm shell -separator ' ' $ZPMDB "select $cols from repository $where order by priority,name"
72 )
73
74 update() (
75         name=$(zpm quote "$1")
76         col=$2
77         val=$(zpm quote "$3")
78         if [ -n "$name" ]; then
79                 where="where name = '$name'"
80         fi
81         zpm shell $ZPMDB "update repository set $col = '$val' $where"
82 )
83
84 refresh() {
85         zpm shell $ZPMDB "update repository set refreshed = strftime('%s', 'now') where name = '$1'"
86 }
87
88 update_info() {
89         if [ $# -eq 0 ]; then
90                 set $(select '' name)
91         fi
92         for repo in "$@"; do
93                 url=$(select "$repo" url)
94                 rf="$repodir/$repo.repo"
95                 if [ -f "$rf" ]; then
96                         # TODO merge in so packages aren't deleted
97                         curl -f '-#' -z "$rf" -o "$rf.tmp" "$url" && 
98                                 mv "$rf.tmp" "$rf" &&
99                                 refresh "$repo"
100                 else
101                         curl -f '-#' -o "$rf" "$url" && refresh "$repo"
102                 fi
103         done
104 }
105
106 # response=$(curl --write-out %{http_code} --silent --output /dev/null servername)
107 # --head
108
109 head_response_code() {
110         curl --write-out '%{http_code}' --silent --output /dev/null -z $2 $1
111 }
112
113 download() {
114         repo=$1
115         shift
116         url=$(select "$repo" url)
117         base=${url%/*}
118         for package in "$@"; do
119                 pkgid=$(zpm findpkg -f $repodir/$repo.repo $package)
120                 if [ -z "$pkgid" ]; then
121                         warn "no package found for $package"
122                 else
123                         mkdir -p "$repodir/$repo"
124                         dest="$repodir/$repo/$pkgid.zpm"
125                         fetch="$base/packages/$pkgid.zpm"
126
127                         if [ -f "$dest" ]; then
128                                 rc=$(head_response_code $fetch $dest)
129                                 if [ $rc = 304 ]; then
130                                         echo "have $pkgid"
131                                         continue
132                                 fi
133                                 echo downloading $pkgid
134                                 curl -f '-#' -z "$dest" -o "$dest.tmp" $fetch
135                                 mv "$dest.tmp" "$dest"
136                         else
137                                 echo downloading $pkgid
138                                 curl -f '-#' -o "$dest.tmp" $fetch
139                                 mv "$dest.tmp" "$dest"
140                         fi
141                 fi
142         done
143 }
144
145 case $action in
146         list)
147                 select '' priority,name,url,refreshed ;;
148         add)
149                 name=$(zpm quote "$1")
150                 url=$(zpm quote "$2")
151                 zpm shell $ZPMDB "insert into repository (name,url) values ('$name', '$url')"
152                 ;;
153         del)
154                 name=$(zpm quote "$1")
155                 zpm shell $ZPMDB "delete from repository where name = '$name'"
156                 rm -f $repodir/$1.repo
157                 # TODO delete caches
158                 ;;
159         url)
160                 if [ -n "$2" ]; then
161                         update "$1" url "$2"
162                 else
163                         select "$1" url
164                 fi
165                 ;;
166         pri*)
167                 if [ -n "$2" ]; then
168                         update "$1" priority "$2"
169                 else
170                         select "$1" priority
171                 fi
172                 ;;
173         fetch|download)
174                 download "$@"
175                 ;;
176         update|pull)
177                 update_info "$@"
178                 ;;
179         packages)
180                 repo=$1
181                 shift
182                 zpm list -f $repodir/$repo.repo "$@"
183                 ;;
184         *)
185                 echo unknown action
186                 exit 1
187                 ;;
188 esac