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 >
Linux/UNIX/POSIX Shell Script  |  2006-11-29  |  2KB  |  83 lines

  1. #!/bin/sh
  2.  
  3. # Traditionally, and to some extent still, rpm --freshen upgraded
  4. # packages that matched by RPMTAG_NAME, not RPMTAG_PROVIDENAME.
  5. #
  6. # This freshen.sh script illustrates how to revert to the "traditional"
  7. # behavior for doing, say,
  8. #    rpm -Fvh kernel-bigmem*.rpm
  9. # so that only kernel-bigmem packages are upgraded, rather than
  10. # upgrading (i.e. erasing) every kernel package that contains
  11. #    Provides: kernel = V-R
  12. #
  13. # Copy the freshen.sh script to /usr/lib/rpm, and add the following
  14. # lines to /etc/popt to enable the behavior:
  15. #    rpm alias -F        --freshen
  16. #    rpm exec --freshen    /usr/lib/rpm/freshen.sh
  17. #    
  18.  
  19. dbg=    #echo    # Do "dbg=echo" for debugging
  20. #set -x
  21. #echo "args: $*"
  22.  
  23. # Invoke rpmi from the same directory as freshen.sh.
  24. rpmi="`dirname $0`/rpmi"
  25. rpme="`dirname $0`/rpme"
  26. rpmq="`dirname $0`/rpmq"
  27.  
  28. # Parse out any options and add to new arglist.
  29. # Note: this fails for options with arguments,
  30. # and doesn't detect multiple -i/-e/-U/-F options either.
  31. opts=""
  32. while [ $# -gt 0 ]; do
  33.     case $1 in
  34.     -*) opt="$1"
  35.     opts="$opts $opt" && shift
  36.     [ "$opt" = "--" ] && break
  37.     ;;
  38.     *)    opts="$opts --" && break
  39.     ;;
  40.     esac
  41. done
  42. #echo "opts: $opts"
  43.  
  44. # $opts has the options with final '--', $* has the package files
  45.  
  46. # If no remaining options, just invoke rpm (which will fail).
  47. [ $# = 0 ] && $dbg exec $rpmi -F $opts
  48.  
  49. # Split remaining args into erase/install/upgrade invocations
  50. iargs=
  51. eargs=
  52. Fargs=
  53. for fn in $*; do
  54.     # If not a file, just pass to freshen.
  55.     [ ! -f $fn ] && Fargs="$Fargs $fn" && continue
  56.  
  57.     # For all occurences of identically named packages installed ...
  58.     N="`$rpmq -qp --qf '%{NAME}' $fn`"
  59.     NVR="`$rpmq -qa $N`"
  60.  
  61.     # ... special case kernel packages, ignore packages not installed.
  62.     case $N in
  63.     kernel*)
  64.     # ... if none installed, skip thi kernel package.
  65.     [ "$NVR" = "" ] && continue
  66.  
  67.     # ... else install new package before erasing old package(s).
  68.     iargs="$iargs $fn"
  69.     eargs="$eargs $NVR"
  70.     ;;
  71.     *) Fargs="$Fargs $fn";;    
  72.     esac
  73.  
  74. done
  75.  
  76. set -e        # Exit on any error from here on out.
  77.  
  78. # Install before erase to insure deps are provided.
  79. [ "$iargs" != "" ] && $dbg $rpmi -i $opts $iargs
  80. [ "$eargs" != "" ] && $dbg $rpme -e $opts $eargs
  81. # Other, non-kernel, files passed to --freshen as always.
  82. [ "$Fargs" != "" ] && $dbg $rpmi -F $opts $Fargs
  83.