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 |