home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2007 January, February, March & April
/
Chip-Cover-CD-2007-02.iso
/
boot
/
i386
/
rescue
/
usr
/
lib
/
rpm
/
freshen.sh
< prev
next >
Wrap
Linux/UNIX/POSIX Shell Script
|
2006-11-29
|
2KB
|
83 lines
#!/bin/sh
# Traditionally, and to some extent still, rpm --freshen upgraded
# packages that matched by RPMTAG_NAME, not RPMTAG_PROVIDENAME.
#
# This freshen.sh script illustrates how to revert to the "traditional"
# behavior for doing, say,
# rpm -Fvh kernel-bigmem*.rpm
# so that only kernel-bigmem packages are upgraded, rather than
# upgrading (i.e. erasing) every kernel package that contains
# Provides: kernel = V-R
#
# Copy the freshen.sh script to /usr/lib/rpm, and add the following
# lines to /etc/popt to enable the behavior:
# rpm alias -F --freshen
# rpm exec --freshen /usr/lib/rpm/freshen.sh
#
dbg= #echo # Do "dbg=echo" for debugging
#set -x
#echo "args: $*"
# Invoke rpmi from the same directory as freshen.sh.
rpmi="`dirname $0`/rpmi"
rpme="`dirname $0`/rpme"
rpmq="`dirname $0`/rpmq"
# Parse out any options and add to new arglist.
# Note: this fails for options with arguments,
# and doesn't detect multiple -i/-e/-U/-F options either.
opts=""
while [ $# -gt 0 ]; do
case $1 in
-*) opt="$1"
opts="$opts $opt" && shift
[ "$opt" = "--" ] && break
;;
*) opts="$opts --" && break
;;
esac
done
#echo "opts: $opts"
# $opts has the options with final '--', $* has the package files
# If no remaining options, just invoke rpm (which will fail).
[ $# = 0 ] && $dbg exec $rpmi -F $opts
# Split remaining args into erase/install/upgrade invocations
iargs=
eargs=
Fargs=
for fn in $*; do
# If not a file, just pass to freshen.
[ ! -f $fn ] && Fargs="$Fargs $fn" && continue
# For all occurences of identically named packages installed ...
N="`$rpmq -qp --qf '%{NAME}' $fn`"
NVR="`$rpmq -qa $N`"
# ... special case kernel packages, ignore packages not installed.
case $N in
kernel*)
# ... if none installed, skip thi kernel package.
[ "$NVR" = "" ] && continue
# ... else install new package before erasing old package(s).
iargs="$iargs $fn"
eargs="$eargs $NVR"
;;
*) Fargs="$Fargs $fn";;
esac
done
set -e # Exit on any error from here on out.
# Install before erase to insure deps are provided.
[ "$iargs" != "" ] && $dbg $rpmi -i $opts $iargs
[ "$eargs" != "" ] && $dbg $rpme -e $opts $eargs
# Other, non-kernel, files passed to --freshen as always.
[ "$Fargs" != "" ] && $dbg $rpmi -F $opts $Fargs