spk annotate spk-up @ rev 81

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