spk annotate 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
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@83 103 [ -d "$extradb/local" ] && local="$extradb/local"
pankso@83 104 echo "$local $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 # Blocked
pankso@81 116 if $(grep -qs "^$PACKAGE" $blocked); then
pankso@81 117 blocked_count=$(($blocked_count + 1))
pankso@81 118 echo -n $(colorize 31 $(indent 48 $(gettext "Blocked")))
pankso@81 119 indent 68 "$reponame"
pankso@81 120 break
pankso@81 121 fi
pankso@81 122
pankso@81 123 new=$(grep "^$PACKAGE |" $dbdesc | awk '{print $3}')
pankso@81 124
pankso@81 125 if [ "$VERSION" == "$new" ]; then
pankso@81 126 build_count=$(($build_count + 1))
pankso@81 127 echo -n $(colorize 34 $(indent 48 $(gettext "New build")))
pankso@81 128 else
pankso@81 129 echo -n $(colorize 32 $(indent 48 $(gettext "New") $new))
pankso@81 130 fi
pankso@81 131 indent 68 "$reponame"
pankso@81 132 echo "$PACKAGE" >> $pkgsup
pankso@81 133 }
pankso@81 134
pankso@81 135 # Check if we have an upgrade for a package
pankso@81 136 check_pkgup() {
pankso@81 137 unset_receipt
pankso@81 138 . $pkg/receipt
pankso@82 139 localdb=$extradb/local
pankso@81 140 sum=$(fgrep " $PACKAGE-${VERSION}$EXTRAVERSION.tazpkg" \
pankso@81 141 $installed.$SUM | awk '{print $1}')
pankso@81 142
pankso@81 143 # Skip up-to-date local packages
pankso@83 144 if [ -d "$localdb" ] && fgrep -q "$sum $PACKAGE-" $localdb/packages.$SUM; then
pankso@82 145 reponame=$(gettext "Local")
pankso@82 146 return 0
pankso@81 147 fi
pankso@81 148
pankso@81 149 for repo in $(priority); do
pankso@81 150 dbdesc=$repo/packages.desc
pankso@81 151 dbsum=$repo/packages.$SUM
pankso@81 152
pankso@82 153 # Mirror name
pankso@82 154 case $repo in
pankso@82 155 $PKGS_DB) reponame=$(gettext "Official") ;;
pankso@82 156 *) reponame=$(gettext "Extra") ;;
pankso@82 157 esac
pankso@82 158 # Overwrite: Local have priority
pankso@83 159 if [ -d "$localdb" ] && fgrep -q "$sum $PACKAGE-" $localdb/packages.$SUM; then
pankso@82 160 reponame=$(gettext "Local")
pankso@82 161 fi
pankso@82 162
pankso@81 163 # Sum match or not ?
pankso@81 164 if ! fgrep -q "$sum $PACKAGE-" $dbsum; then
pankso@81 165 up_type
pankso@81 166 break
pankso@81 167 fi
pankso@81 168 done
pankso@81 169 }
pankso@81 170
pankso@81 171 # Log and install an upgradable package.
pankso@81 172 install_up() {
pankso@81 173 mirrored_pkg $pkg
pankso@81 174 vers=$(echo "$mirrored" | awk '{print $3}')
pankso@81 175 mkdir -p $logdir/$pkg
pankso@81 176 echo "$(date '+%Y-%m-%d %H:%M') : Upgrade to $vers" >> $logdir/$pkg/up.log
pankso@81 177 spk-add $pkg --forced
pankso@81 178 }
pankso@81 179
pankso@81 180 #
pankso@81 181 # Handle packages and --options
pankso@81 182 #
pankso@81 183
pankso@81 184 count=0
pankso@81 185
pankso@81 186 for arg in $@
pankso@81 187 do
pankso@81 188 case "$arg" in
pankso@81 189 *usage|*help) usage ;;
pankso@81 190 --list) recharge_lists && exit 0 ;;
pankso@81 191 --*) continue ;;
pankso@81 192 *)
pankso@81 193 pkg=$arg
pankso@81 194 system=no
pankso@81 195 [ "$count" == 0 ] && up_headers
pankso@81 196 if [ -f "$installed/$pkg/receipt" ]; then
pankso@81 197 count=$(($count +1))
pankso@81 198 cd $installed
pankso@82 199 . $pkg/receipt
pankso@81 200 check=$(check_pkgup)
pankso@81 201 if [ "$check" != "" ]; then
pankso@81 202 echo "$check"
pankso@81 203 [ "$add" ] && install_up
pankso@81 204 else
pankso@82 205 echo -n "$pkg"
pankso@82 206 echo -n $(indent 28 "$VERSION")
pankso@82 207 echo -n $(colorize 32 $(indent 48 $(gettext "up-to-date")))
pankso@82 208 check_pkgup
pankso@82 209 indent 68 "$reponame"
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@87 229 recharge_lists
pankso@81 230 up_headers
pankso@81 231 cd $installed
pankso@81 232 newline > $pkgsup
pankso@81 233
pankso@81 234 # Check all installed packages
pankso@81 235 for pkg in *
pankso@81 236 do
pankso@81 237 check_pkgup
pankso@81 238 done
pankso@81 239
pankso@81 240 # Remove empty line and count
pankso@81 241 sed -i /^$/d $pkgsup
pankso@81 242 upnb=$(cat $pkgsup | wc -l)
pankso@81 243 pkgs=$(ls | wc -l)
pankso@81 244 time=$(($(date +%s) - $time))
pankso@81 245
pankso@84 246 if [ "$upnb" == 0 ] && [ "$blocked_count" == 0 ]; then
pankso@81 247 gettext "System is up-to-date..."; newline
pankso@81 248 fi
pankso@81 249 separator
pankso@81 250 echo -n "$pkgs "; gettext "installed packages scanned in"; echo " ${time}s"
pankso@81 251 newline
pankso@81 252
pankso@81 253 # Summary
pankso@81 254 boldify $(gettext "Packages upgrade summary")
pankso@81 255 separator
pankso@81 256 gettext "New version :"; colorize 32 " $(($upnb - $build_count))"
pankso@81 257 gettext "New build :"; colorize 34 " $build_count"
pankso@81 258 gettext "Blocked :"; colorize 31 " $blocked_count"
pankso@81 259 separator
pankso@81 260 newline
pankso@81 261
pankso@81 262 # Pkgs to upgrade ? Skip, let --add/--install them all or ask user
pankso@81 263 if [ "$upnb" -gt 0 ]; then
pankso@81 264 if [ "$add" ] || [ "$install" ]; then
pankso@81 265 continue
pankso@81 266 else
pankso@81 267 gettext "Do you wish to upgrade now"
pankso@81 268 if ! confirm; then
pankso@81 269 gettext "Upgrade cancelled"
pankso@81 270 echo -e "\n" && exit 0
pankso@81 271 fi
pankso@81 272 fi
pankso@81 273 # Install and log all upgrade
pankso@81 274 for pkg in $(cat $pkgsup)
pankso@81 275 do
pankso@81 276 install_up
pankso@81 277 done
pankso@81 278 # List is generated each time and must be cleaned so
pankso@81 279 # tazpkg-notify dont find upgrade anymore.
pankso@81 280 rm $pkgsup && touch $pkgsup
pankso@81 281 newline
pankso@81 282 gettext "Handeled upgrades:"; colorize 32 " $upnb"
pankso@81 283 newline
pankso@81 284 fi
pankso@81 285
pankso@81 286 exit 0