summaryrefslogtreecommitdiffstats
path: root/source/a/pkgtools/scripts/upgradepkg
diff options
context:
space:
mode:
Diffstat (limited to 'source/a/pkgtools/scripts/upgradepkg')
-rw-r--r--source/a/pkgtools/scripts/upgradepkg209
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
-