home *** CD-ROM | disk | FTP | other *** search
- #!/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
-