You are not logged in.
This wrapper will evaluate the "upgrade level" of every packages that could be upgraded.
The "upgrade level" is defined as follows:
Assuming version number looks like x.y.z-p. And we consider that:
x is a major version number, y is a normal version number, and z is a minor version number, and p is a packaging version number.
If a version number looks like 1-2, we consider 1 is the major.
And if it looks like 1.2-3, we consider 1 is the major, and 2 is the normal.
And if it looks like 1.2.3.4-5, we consider 1 is the major, 2.3 is the normal, and 4 is the minor.
And,
level 19: packaging change
x1=x2 y1=y2 z1=z2, only p1 != p2
level 25: minor upgrade
x1=x2 y1=y2, z1 != z2, but 1 week old
level 29: minor upgrade
x1=x2 y1=y2, z1 != z2
level 35: normal upgrade
x1=x2, y1!=y2, but 2 weeks old
level 39: normal upgrade
x1=x2, y1!=y2
level 45: major upgrade
x1!=x2, but 4 weeks old
level 49: major upgrade, x1!=x2
While invoking, you should specify a threshold that you think is save to upgrade, and the wrapper - saveSyu, will invoke pacman to upgrade only those packages under the threshold.
Here comes...
#!/bin/bash
# save upgrade
# we can create some upgrade policy, for example:
# the package is one month old, or
# the package is a "packaging upgrade" (which means "the same
# software version", different "packaging version"), or
# the package is a "minor upgrade", x.y.z -> x.y.?
# the package is not in core (nor extra)
# function(s)
# assume version number looks like x.y.z-p
# others include:
# x.y.y.z-p
# x.y-p
# y-p
#
# level 19: packaging change, x1=x2 y1=y2 z1=z2, only p1 != p2
# level 25: minor upgrade, x1=x2 y1=y2, z1 != z2, but 1 week old
# level 29: minor upgrade, x1=x2 y1=y2, z1 != z2
# level 35: normal upgrade, x1=x2, y1!=y2, but 2 weeks old
# level 39: normal upgrade, x1=x2, y1!=y2
# level 45: major upgrade, x1!=x2, but 4 weeks old
# level 49: major upgrade, x1!=x2
# other criteria including:
# which repository (not in core, in community, etc.)
# minor upgrade, but packaging number is not 1 (which means it has been (bug) fixed)
evaluate_upgrade_level() {
# init
ONE_WEEK=$((1 * 7 * 24 * 60 * 60))
TWO_WEEKS=$((2 * $ONE_WEEK))
FOUR_WEEKS=$((4 * $ONE_WEEK))
old_ver=$1
new_ver=$2
repo=$3
date=$(date -d "$4" +%s)
now=$(date +%s)
# parse
old_tmp=${old_ver%-*}
old_pkg=${old_ver#$old_tmp-}
old_major=${old_tmp%%.*}
old_minor=${old_tmp##*.}
old_normal=${old_tmp#$old_major.}
old_normal=${old_normal%.$old_minor}
echo old_ver=$old_ver major=$old_major normal=$old_normal minor=$old_minor pkg=$old_pkg
new_tmp=${new_ver%-*}
new_pkg=${new_ver#$new_tmp-}
new_major=${new_tmp%%.*}
new_minor=${new_tmp##*.}
new_normal=${new_tmp#$new_major.}
new_normal=${new_normal%.$new_minor}
echo new_ver=$new_ver major=$new_major normal=$new_normal minor=$new_minor pkg=$new_pkg
age=$(($now - $date))
echo date=$date now=$now age=$age
if [ "$old_major" = "$new_major" -a "$old_normal" = "$new_normal" -a "$old_minor" = "$new_minor" ] ; then
level=19
elif [ "$old_major" = "$new_major" -a "$old_normal" = "$new_normal" ] ; then
if [ $age -gt $ONE_WEEK ] ; then
level=25
else
level=29
fi
elif [ "$old_major" = "$new_major" ] ; then
if [ $age -gt $TWO_WEEKS ] ; then
level=35
else
level=39
fi
else
if [ $age -gt $FOUR_WEEKS ] ; then
level=45
else
level=49
fi
fi
echo level=$level
return $level
}
# init
SUDO=sudo
PACMAN=pacman
ARCH=i686
TMP_FILE=/tmp/$(basename $0).tmp
if [ 0 -eq $# ] ; then
echo usage: $0 threshold
exit 4
fi
threshold=$1
# get upgrade list
"$SUDO" "$PACMAN" -Syu --print-uris | grep ".pkg.tar.gz$" >"$TMP_FILE"
targets=""
# analyse "upgrade level"
while read uri ; do
pkg=$(basename "$uri")
pkg=${pkg%-$ARCH.pkg.tar.gz}
pkg=${pkg%.pkg.tar.gz}
name=${pkg%-*-*}
new_ver=${pkg#$name-}
old_ver=$("$PACMAN" -Qi "$name" | grep "^Version")
old_ver=$(echo $old_ver)
old_ver=${old_ver#Version : }
repo=$(basename $(dirname $(dirname $(dirname "$uri"))))
date=$("$PACMAN" -Si "$name" | grep "^Build Date")
date=$(echo $date)
date=${date#Build Date : }
echo name=$name repo=$repo old_ver=$old_ver new_ver=$new_ver date=$date
evaluate_upgrade_level "$old_ver" "$new_ver" "$repo" "$date"
level=$?
if [ $level -lt $threshold ] ; then
echo save
targets="$targets $name"
fi
echo
done <"$TMP_FILE"
# do it!
echo $targets
"$SUDO" "$PACMAN" -S $targets
Last edited by bsdson.tw (2008-11-07 10:14:36)
Offline
nice idea! but i like to live life on the edge
will be useful for server stuff. will give it a spin when i set up my server with arch
Offline
This could be essencial for those people how need to save bandwith.
Offline
I just set up a server! Great Idea. Can someone provide a PKGBUILD for this?
Offline