spk annotate spk-up @ rev 132

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