]> pd.if.org Git - zpackage/blob - zpm-repo
refactor syncconflicts view for performance
[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                         rv=$?
99                 else
100                         curl -f '-#' -o "$rf" "$url" && refresh "$repo"
101                         rv=$?
102                 fi
103                 if [ $rv -eq 0 ]; then
104                         test -f "$rf.tmp" && mv "$rf.tmp" "$rf"
105                         refresh "$repo"
106                 fi
107         done
108 }
109
110 # response=$(curl --write-out %{http_code} --silent --output /dev/null servername)
111 # --head
112
113 head_response_code() {
114         curl --write-out '%{http_code}' --silent --output /dev/null -z $2 $1
115 }
116
117 download() {
118         repo=$1
119         shift
120         url=$(select "$repo" url)
121         base=${url%/*}
122         for package in "$@"; do
123                 pkgid=$(zpm findpkg -f $repodir/$repo.repo $package)
124                 if [ -z "$pkgid" ]; then
125                         warn "no package found for $package"
126                 else
127                         mkdir -p "$repodir/$repo"
128                         dest="$repodir/$repo/$pkgid.zpm"
129                         fetch="$base/packages/$pkgid.zpm"
130
131                         if [ -f "$dest" ]; then
132                                 rc=$(head_response_code $fetch $dest)
133                                 if [ $rc = 304 ]; then
134                                         echo "have $pkgid"
135                                         continue
136                                 fi
137                                 echo downloading $pkgid
138                                 curl -f '-#' -z "$dest" -o "$dest.tmp" $fetch
139                                 mv "$dest.tmp" "$dest"
140                         else
141                                 echo downloading $pkgid
142                                 curl -f '-#' -o "$dest.tmp" $fetch
143                                 mv "$dest.tmp" "$dest"
144                         fi
145                 fi
146         done
147 }
148
149 case $action in
150         list)
151                 select '' priority,name,url,refreshed ;;
152         add)
153                 name=$(zpm quote "$1")
154                 url=$(zpm quote "$2")
155                 zpm shell $ZPMDB "insert into repository (name,url) values ('$name', '$url')"
156                 ;;
157         del)
158                 name=$(zpm quote "$1")
159                 zpm shell $ZPMDB "delete from repository where name = '$name'"
160                 rm -f $repodir/$1.repo
161                 # TODO delete caches
162                 ;;
163         url)
164                 if [ -n "$2" ]; then
165                         update "$1" url "$2"
166                 else
167                         select "$1" url
168                 fi
169                 ;;
170         pri*)
171                 if [ -n "$2" ]; then
172                         update "$1" priority "$2"
173                 else
174                         select "$1" priority
175                 fi
176                 ;;
177         fetch|download)
178                 download "$@"
179                 ;;
180         update|pull)
181                 update_info "$@"
182                 ;;
183         packages)
184                 repo=$1
185                 shift
186                 zpm list -f $repodir/$repo.repo "$@"
187                 ;;
188         *)
189                 echo unknown action
190                 exit 1
191                 ;;
192 esac