diff options
Diffstat (limited to 'source/a/pkgtools/scripts/upgradepkg')
-rw-r--r-- | source/a/pkgtools/scripts/upgradepkg | 209 |
1 files changed, 138 insertions, 71 deletions
diff --git a/source/a/pkgtools/scripts/upgradepkg b/source/a/pkgtools/scripts/upgradepkg index 5e0299806..f943f9360 100644 --- a/source/a/pkgtools/scripts/upgradepkg +++ b/source/a/pkgtools/scripts/upgradepkg @@ -13,7 +13,7 @@ # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; @@ -22,24 +22,32 @@ # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # -# Modified to handle either old 8.3 or new package-version-arch-build.tgz -# packages, Sat Nov 17 14:25:58 PST 2001 volkerdi +# Thu May 24 20:23:55 UTC 2018 +# Added --terselength option to set the line length in --terse mode. +# Use a lockfile to prevent output collisions in --terse mode. # -# Rewritten to clean out _all_ old packages of a given basename, not just -# the first one found, Thu Apr 4 01:01:05 PST 2002 volkerdi +# Wed May 23 03:35:28 UTC 2018 +# Added --terse, which limits screen output to one line per package. # -# Added --install-new and --reinstall, Fri May 31 14:11:14 PDT 2002 volkerdi -# Added --dry-run, Sat Apr 26 18:13:29 PDT 2003 +# Sat 17 Jan 16:21:32 UTC 2015 mina86 +# Various optimisation mostly resolving around avoiding having to fork +# and call cut, basename and other helper commands. Slight +# refactoring of code calling removepkg. # # Sat Apr 25 21:18:53 UTC 2009 # Support new compression types and package extensions. # Converted to use new pkgbase() function to remove pathname and # valid package extensions. # -# Sat 17 Jan 16:21:32 UTC 2015 mina86 -# Various optimisation mostly resolving around avoiding having to fork -# and call cut, basename and other helper commands. Slight -# refactoring of code calling removepkg. +# Added --dry-run, Sat Apr 26 18:13:29 PDT 2003 +# +# Added --install-new and --reinstall, Fri May 31 14:11:14 PDT 2002 volkerdi +# +# Rewritten to clean out _all_ old packages of a given basename, not just +# the first one found, Thu Apr 4 01:01:05 PST 2002 volkerdi +# +# Modified to handle either old 8.3 or new package-version-arch-build.tgz +# packages, Sat Nov 17 14:25:58 PST 2001 volkerdi # Return a package name that has been stripped of the dirname portion # and any of the valid extensions (only): @@ -58,20 +66,20 @@ Usage: upgradepkg newpackage [newpackage2 ... ] upgradepkg oldpackage%newpackage [oldpackage2%newpackage2 ... ] Upgradepkg upgrades a Slackware package (.tgz, .tbz, .tlz, .txz) from an -older version to a newer one. It does this by INSTALLING the new package +older version to a newer one. It does this by INSTALLING the new package onto the system, and then REMOVING any files from the old package that -aren't in the new package. If the old and new packages have the same -name, a single argument is all that is required. If the packages have +aren't in the new package. If the old and new packages have the same +name, a single argument is all that is required. If the packages have different names, supply the name of the old package followed by a percent -symbol (%), then the name of the new package. Do not add any extra +symbol (%), then the name of the new package. Do not add any extra whitespace between pairs of old/new package names. Before upgrading a package, save any configuration files (such as in /etc) -that you wish to keep. Sometimes these will be preserved, but it depends -on the package. If you want to force new versions of the config files +that you wish to keep. Sometimes these will be preserved, but it depends +on the package. If you want to force new versions of the config files to be installed, remove the old ones manually prior to running upgradepkg. -To upgrade in a directory other than / (such as /mnt): +To upgrade in a directory other than / (such as /mnt): ROOT=/mnt upgradepkg package.tgz (or .tbz, .tlz, .txz) @@ -103,41 +111,71 @@ if [ "$1" = "" -o "$1" = "--help" -o "$1" = "-?" ]; then exit 1; fi -# Arg processing loop. These must come before any packages are listed. +# Create a lockfile directory if it doesn't exist. We can use it to prevent +# output line collisions in --terse mode. +INSTLOCKDIR=${INSTLOCKDIR:-/run/upgradepkg-lock} +if [ ! -d $INSTLOCKDIR ]; then + mkdir -p $INSTLOCKDIR +fi + +# Set default line length for terse mode: +if which tput 1> /dev/null 2> /dev/null ; then + TERSELENGTH=$(tput cols) +else + TERSELENGTH=80 +fi + +# Arg processing loop. These must come before any packages are listed. while [ 0 ]; do - if [ "$1" = "--no-paranoia" ]; then - # Enable --no-paranoia mode. This is so not-recommended that we're - # not even going to document it. ;) If a file used to be directly + if [ "$1" = "-no-paranoia" -o "$1" = "--no-paranoia" ]; then + # Enable --no-paranoia mode. This is so not-recommended that we're + # not even going to document it. ;) If a file used to be directly # managed and now is moved into place, using --no-paranoia will cause - # it to improperly disappear. It does slightly speed things up, though. + # it to improperly disappear. It does slightly speed things up, though. # Don't use it. NOT_PARANOID="true" shift 1 - elif [ "$1" = "--install-new" ]; then + elif [ "$1" = "-install-new" -o "$1" = "--install-new" ]; then # Install packages that do not already have an installed version. # The usual default is to skip them. INSTALL_NEW="yes" shift 1 - elif [ "$1" = "--reinstall" ]; then + elif [ "$1" = "-reinstall" -o "$1" = "--reinstall" ]; then # Reinstall packages even if the installed one is the same version. REINSTALL="true" shift 1 - elif [ "$1" = "--verbose" -o "$1" = "-v" ]; then + elif [ "$1" = "-verbose" -o "$1" = "--verbose" -o "$1" = "-v" ]; then # We're adding a --verbose mode that doesn't filter removepkg as much VERBOSE="verbose" shift 1 - elif [ "$1" = "--dry-run" ]; then + elif [ "$1" = "-dry-run" -o "$1" = "--dry-run" ]; then # Output a report about which packages would be installed or upgraded # but don't actually perform the upgrades. DRY_RUN="true" shift 1 + elif [ "$1" = "-terse" -o "$1" = "--terse" ]; then + # Output one line per installed/upgraded package by calling installpkg + # with --terse. Use TERSE=0 for true, so we can check with test. + TERSE=0 + shift 1 + elif [ "$1" = "-terselength" -o "$1" = "--terselength" ]; then + # Set line length in --terse mode: + TERSELENGTH=$2 + shift 2 else # no more args break; fi done # processing args +# A couple not-really-documented features to adjust the behavior of --terse +# mode. These need to be used in addition to --terse, and passed in as +# environment variables. +# PLAINTERSE=0 (This outputs the standard terse line from installpkg, rather +# than prefixing it with "Upgrading:" or "Installing:") +# INFOBOX=0 (This outputs the installpkg --infobox instead of a terse line) + # Here's a function to figure out the package name from one of those -# new long filenames. We'll need this to double check the name of the +# new long filenames. We'll need this to double check the name of the # old package. package_name() { @@ -170,7 +208,7 @@ for ARG; do # Simple package integrity check: if ! [ -f "$NEW" ]; then ERRCODE=4 - echo "Cannot install $ARG: file not found" + ! [ $TERSE ] && echo "Cannot install $ARG: file not found" continue; fi @@ -186,7 +224,7 @@ for ARG; do # Make sure the extension is valid: if [ "$NNAME" = "$NEW" ]; then # We won't throw an ERRCODE for this, but the package is skipped: - echo "Cannot install $OLD: invalid package extension" + ! [ $TERSE ] && echo "Cannot install $OLD: invalid package extension" continue; fi @@ -204,31 +242,42 @@ for ARG; do fi # Test to see if both the old and new packages are where we expect them - # to be -- skip to the next package (or package pair) if anything's wrong: + # to be - skip to the next package (or package pair) if anything's wrong: if [ ! -r $ROOT/var/log/packages/$OLD ]; then if [ ! "$INSTALL_NEW" = "yes" ]; then if [ "$DRY_RUN" = "true" ]; then echo "$OLD would not be upgraded (no installed package named $SHORT)." else - echo - echo "Error: there is no installed package named $OLD." - echo " (looking for $ROOT/var/log/packages/$OLD)" - echo + ! [ $TERSE ] && echo + ! [ $TERSE ] && echo "Error: there is no installed package named $OLD." + ! [ $TERSE ] && echo " (looking for $ROOT/var/log/packages/$OLD)" + ! [ $TERSE ] && echo fi ERRCODE=1 else # --install-new was given, so install the new package: if [ "$DRY_RUN" = "true" ]; then echo "$NEW would be installed (new package)." else - cat << EOF + if [ $PLAINTERSE ]; then + /sbin/installpkg --terse --terselength $TERSELENGTH $INCOMINGDIR/$NNAME + elif [ $INFOBOX ]; then + /sbin/installpkg --infobox $INCOMINGDIR/$NNAME + elif [ $TERSE ]; then + OUTPUTLINE="$(/sbin/installpkg --terse --terselength $(expr $TERSELENGTH - 12) $INCOMINGDIR/$NNAME)" + ( flock 9 || exit 11 + echo "Installing: ${OUTPUTLINE}" + ) 9> $INSTLOCKDIR/outputline.lock + else + cat << EOF +============================================================================== | Installing new package $INCOMINGDIR/$NNAME +============================================================================== EOF - /sbin/installpkg $INCOMINGDIR/$NNAME + /sbin/installpkg $INCOMINGDIR/$NNAME + fi fi fi continue; @@ -236,9 +285,9 @@ EOF if [ "$DRY_RUN" = "true" ]; then echo "$NEW incoming package not found (command line)." else - echo - echo "Error: incoming package $INCOMINGDIR/$NNAME not found." - echo + ! [ $TERSE ] && echo + ! [ $TERSE ] && echo "Error: incoming package $INCOMINGDIR/$NNAME not found." + ! [ $TERSE ] && echo fi ERRCODE=1 continue; @@ -251,13 +300,15 @@ EOF if [ "$DRY_RUN" = "true" ]; then echo "$NEW would be skipped (already installed)." else - cat << EOF + if ! [ $TERSE ]; then + cat << EOF +============================================================================== | Skipping package $NEW (already installed) +============================================================================== EOF + fi fi continue; fi @@ -292,57 +343,73 @@ EOF done # Print a banner for the current upgrade: - cat << EOF + if ! [ $TERSE ]; then + cat << EOF +============================================================================== | Upgrading $OLD package using $INCOMINGDIR/$NNAME +============================================================================== - EOF - + fi # Next, the new package is pre-installed: if [ "$VERBOSE" = "verbose" ]; then - /sbin/installpkg $INCOMINGDIR/$NNAME - RETCODE=$? + if ! [ $TERSE ]; then + /sbin/installpkg $INCOMINGDIR/$NNAME + RETCODE=$? + else + /sbin/installpkg $INCOMINGDIR/$NNAME 1> /dev/null + RETCODE=$? + fi else - echo "Pre-installing package $NEW..." - /sbin/installpkg $INCOMINGDIR/$NNAME 1> /dev/null - RETCODE=$? + if [ $PLAINTERSE ]; then + /sbin/installpkg --terse --terselength $TERSELENGTH $INCOMINGDIR/$NNAME + elif [ $INFOBOX ]; then + /sbin/installpkg --infobox $INCOMINGDIR/$NNAME + elif [ $TERSE ]; then + OUTPUTLINE="$(/sbin/installpkg --terse --terselength $(expr $TERSELENGTH - 12) $INCOMINGDIR/$NNAME)" + RETCODE=$? + ( flock 9 || exit 11 + echo "Upgrading: ${OUTPUTLINE}" + ) 9> $INSTLOCKDIR/outputline.lock + else + echo "Pre-installing package $NEW..." + /sbin/installpkg $INCOMINGDIR/$NNAME 1> /dev/null + RETCODE=$? + fi fi # Make sure that worked: if [ ! $RETCODE = 0 ]; then - echo "ERROR: Package $INCOMINGDIR/$NNAME did not install" - echo "correctly. You may need to reinstall your old package" - echo "to avoid problems. Make sure the new package is not" + echo "ERROR: Package $INCOMINGDIR/$NNAME did not install" + echo "correctly. You may need to reinstall your old package" + echo "to avoid problems. Make sure the new package is not" echo "corrupted." - sleep 30 + sleep 15 # Skip this package, but still try to proceed. Good luck... continue; fi - # Now, the leftovers from the old package(s) can go. Pretty simple, huh? :) - for rempkg in "$ROOT/var/log/packages/"*"-$TIMESTAMP"; do - if [ "$VERBOSE" = "verbose" ]; then - /sbin/removepkg "${rempkg##*/}" - else - /sbin/removepkg "${rempkg##*/}" | grep -v 'Skipping\.\|Removing files:' - fi - done - echo - + ( flock 9 || exit 11 + for rempkg in "$ROOT/var/log/packages/"*"-$TIMESTAMP"; do + if [ "$VERBOSE" = "verbose" ]; then + /sbin/removepkg "${rempkg##*/}" + elif ! [ $TERSE ]; then + /sbin/removepkg "${rempkg##*/}" | grep -v 'Skipping\.\|Removing files:' + else + /sbin/removepkg "${rempkg##*/}" > /dev/null + fi + done + ) 9> $INSTLOCKDIR/removepkg.lock # Again! Again! # Seriously, the reinstalling of a package can be crucial if any files # shift location, so we should always reinstall as the final step: if [ ! "$NOT_PARANOID" = "true" ]; then - /sbin/installpkg $INCOMINGDIR/$NNAME + if ! [ $TERSE ]; then + /sbin/installpkg $INCOMINGDIR/$NNAME + else + /sbin/installpkg $INCOMINGDIR/$NNAME 1> /dev/null + fi fi - - echo "Package $OLD upgraded with new package $INCOMINGDIR/$NNAME." + ! [ $TERSE ] && echo "Package $OLD upgraded with new package $INCOMINGDIR/$NNAME." ERRCODE=0 done - -if [ ! "$DRY_RUN" = "true" ]; then - echo -fi exit $ERRCODE - |