spk view spk-up @ rev 87

spk-up: recharge list by default
author Christophe Lincoln <pankso@slitaz.org>
date Thu May 24 22:12:53 2012 +0200 (2012-05-24)
parents b33832c00a1a
children 51329da37c52
line source
1 #!/bin/sh
2 #
3 # Spk-up - Update packages. Read the README before adding or
4 # modifing any code in spk!
5 #
6 # Copyright (C) SliTaz GNU/Linux - BSD License
7 # Author: See AUTHORS files
8 #
9 . /usr/lib/slitaz/libspk.sh
11 #
12 # Functions
13 #
15 # Help and usage
16 usage() {
17 name=$(basename $0)
18 cat << EOT
20 $(boldify $(gettext "Usage:")) $name [packages|--options]
22 $(gettext "Update packages lists and upgrade the system")
24 $(boldify $(gettext "Options:"))
25 --list $(gettext "Recharges the packages lists")
26 --add $(gettext "Install upgrade automaticaly")
27 --forced $(gettext "Force recharging the lists")
28 --mirror= $(gettext "Specify a mirror to check")
30 $(boldify $(gettext "Examples:"))
31 $name package1 package2
32 $name --list --forced --mirror=main
34 EOT
35 exit 0
36 }
38 # Headers fo system or packages update
39 up_headers() {
40 newline
41 boldify $(gettext "Package") \
42 $(echo -n $(indent 28 $(gettext "Version"))) \
43 $(echo -n $(indent 48 $(gettext "Status"))) \
44 $(echo -n $(indent 68 $(gettext "Mirror")))
45 separator
46 }
48 # Recharges all list from one mirror or all mirrors
49 recharge_lists() {
50 check_root
51 newline
52 boldify $(gettext "Updating packages lists")
53 separator
54 check="$extradb/*/mirror $PKGS_DB/mirror"
55 if [ "$mirror" ]; then
56 check=$extradb/$mirror/mirror
57 [ "$mirror" == "main" ] && check=$PKGS_DB/mirror
58 fi
59 for mirror in $check; do
60 [ -f "$mirror" ] || continue
61 # Skip local mirror
62 [ ! $(readlink $(dirname $mirror)/packages.desc) ] || continue
63 # Get want a mirror name and download url
64 name=$(basename $(dirname $mirror))
65 url=$(cat $mirror)
66 lists="packages.list packages.md5 packages.desc packages.equiv files.list.lzma"
67 [ "$(dirname $mirror)" == "$PKGS_DB" ] && name="main"
68 [ "$quiet" ] && quiet="-q"
70 gettext "Checking mirror:"; colorize 34 " $name"
71 cd $(dirname $mirror)
73 # ID
74 [ -f "ID" ] || echo "$$" > ID
75 mv ID ID.bak
76 wget -q ${url%/}/ID
77 debug "ID: $(cat ID)"
78 debug "ID.bak: $(cat ID.bak)"
79 if [ $(cat ID) == $(cat ID.bak) ] && [ ! "$forced" ]; then
80 gettext "Mirror is up-to-date"; newline
81 continue
82 fi
84 # Backup and get all lists
85 for list in $lists
86 do
87 [ -f "$list" ] && cp -f $list $list.bak
88 debug "url: ${url%/}/$list"
89 rm -f $list
90 busybox wget $quiet ${url%/}/$list
91 done
92 done
93 separator
94 newline
95 }
97 # Repo priority: local, extras then official
98 priority() {
99 extras=$(ls $extradb | sed s"/local//")
100 for i in $extras; do
101 extras="$extradb/$i"
102 done
103 [ -d "$extradb/local" ] && local="$extradb/local"
104 echo "$local $extras $PKGS_DB"
105 }
107 # Types: blocked, new build or new version
108 up_type() {
109 # Jump to next repository if pkg doesn't exists in this one.
110 grep -q "^$PACKAGE |" $dbdesc || continue
112 echo -n "$PACKAGE"
113 echo -n $(indent 28 "$VERSION")
115 # Blocked
116 if $(grep -qs "^$PACKAGE" $blocked); then
117 blocked_count=$(($blocked_count + 1))
118 echo -n $(colorize 31 $(indent 48 $(gettext "Blocked")))
119 indent 68 "$reponame"
120 break
121 fi
123 new=$(grep "^$PACKAGE |" $dbdesc | awk '{print $3}')
125 if [ "$VERSION" == "$new" ]; then
126 build_count=$(($build_count + 1))
127 echo -n $(colorize 34 $(indent 48 $(gettext "New build")))
128 else
129 echo -n $(colorize 32 $(indent 48 $(gettext "New") $new))
130 fi
131 indent 68 "$reponame"
132 echo "$PACKAGE" >> $pkgsup
133 }
135 # Check if we have an upgrade for a package
136 check_pkgup() {
137 unset_receipt
138 . $pkg/receipt
139 localdb=$extradb/local
140 sum=$(fgrep " $PACKAGE-${VERSION}$EXTRAVERSION.tazpkg" \
141 $installed.$SUM | awk '{print $1}')
143 # Skip up-to-date local packages
144 if [ -d "$localdb" ] && fgrep -q "$sum $PACKAGE-" $localdb/packages.$SUM; then
145 reponame=$(gettext "Local")
146 return 0
147 fi
149 for repo in $(priority); do
150 dbdesc=$repo/packages.desc
151 dbsum=$repo/packages.$SUM
153 # Mirror name
154 case $repo in
155 $PKGS_DB) reponame=$(gettext "Official") ;;
156 *) reponame=$(gettext "Extra") ;;
157 esac
158 # Overwrite: Local have priority
159 if [ -d "$localdb" ] && fgrep -q "$sum $PACKAGE-" $localdb/packages.$SUM; then
160 reponame=$(gettext "Local")
161 fi
163 # Sum match or not ?
164 if ! fgrep -q "$sum $PACKAGE-" $dbsum; then
165 up_type
166 break
167 fi
168 done
169 }
171 # Log and install an upgradable package.
172 install_up() {
173 mirrored_pkg $pkg
174 vers=$(echo "$mirrored" | awk '{print $3}')
175 mkdir -p $logdir/$pkg
176 echo "$(date '+%Y-%m-%d %H:%M') : Upgrade to $vers" >> $logdir/$pkg/up.log
177 spk-add $pkg --forced
178 }
180 #
181 # Handle packages and --options
182 #
184 count=0
186 for arg in $@
187 do
188 case "$arg" in
189 *usage|*help) usage ;;
190 --list) recharge_lists && exit 0 ;;
191 --*) continue ;;
192 *)
193 pkg=$arg
194 system=no
195 [ "$count" == 0 ] && up_headers
196 if [ -f "$installed/$pkg/receipt" ]; then
197 count=$(($count +1))
198 cd $installed
199 . $pkg/receipt
200 check=$(check_pkgup)
201 if [ "$check" != "" ]; then
202 echo "$check"
203 [ "$add" ] && install_up
204 else
205 echo -n "$pkg"
206 echo -n $(indent 28 "$VERSION")
207 echo -n $(colorize 32 $(indent 48 $(gettext "up-to-date")))
208 check_pkgup
209 indent 68 "$reponame"
210 fi
211 fi ;;
212 esac
213 done
215 # Skip system-wide upgrade if some packages was updated individually.
216 if [ "$system" ]; then
217 [ "$add" ] || newline
218 exit 0
219 fi
221 #
222 # Check all mirrors list and upgrade system.
223 #
225 time=$(date +%s)
226 build_count=0
227 blocked_count=0
229 recharge_lists
230 up_headers
231 cd $installed
232 newline > $pkgsup
234 # Check all installed packages
235 for pkg in *
236 do
237 check_pkgup
238 done
240 # Remove empty line and count
241 sed -i /^$/d $pkgsup
242 upnb=$(cat $pkgsup | wc -l)
243 pkgs=$(ls | wc -l)
244 time=$(($(date +%s) - $time))
246 if [ "$upnb" == 0 ] && [ "$blocked_count" == 0 ]; then
247 gettext "System is up-to-date..."; newline
248 fi
249 separator
250 echo -n "$pkgs "; gettext "installed packages scanned in"; echo " ${time}s"
251 newline
253 # Summary
254 boldify $(gettext "Packages upgrade summary")
255 separator
256 gettext "New version :"; colorize 32 " $(($upnb - $build_count))"
257 gettext "New build :"; colorize 34 " $build_count"
258 gettext "Blocked :"; colorize 31 " $blocked_count"
259 separator
260 newline
262 # Pkgs to upgrade ? Skip, let --add/--install them all or ask user
263 if [ "$upnb" -gt 0 ]; then
264 if [ "$add" ] || [ "$install" ]; then
265 continue
266 else
267 gettext "Do you wish to upgrade now"
268 if ! confirm; then
269 gettext "Upgrade cancelled"
270 echo -e "\n" && exit 0
271 fi
272 fi
273 # Install and log all upgrade
274 for pkg in $(cat $pkgsup)
275 do
276 install_up
277 done
278 # List is generated each time and must be cleaned so
279 # tazpkg-notify dont find upgrade anymore.
280 rm $pkgsup && touch $pkgsup
281 newline
282 gettext "Handeled upgrades:"; colorize 32 " $upnb"
283 newline
284 fi
286 exit 0