summaryrefslogtreecommitdiff
path: root/testing/source/pkgtools/scripts/upgradepkg
diff options
context:
space:
mode:
Diffstat (limited to 'testing/source/pkgtools/scripts/upgradepkg')
-rw-r--r--testing/source/pkgtools/scripts/upgradepkg417
1 files changed, 0 insertions, 417 deletions
diff --git a/testing/source/pkgtools/scripts/upgradepkg b/testing/source/pkgtools/scripts/upgradepkg
deleted file mode 100644
index f53d21d9..00000000
--- a/testing/source/pkgtools/scripts/upgradepkg
+++ /dev/null
@@ -1,417 +0,0 @@
-#!/bin/bash
-# Copyright 1999 Patrick Volkerding, Moorhead, Minnesota, USA
-# Copyright 2001, 2002, 2003 Slackware Linux, Inc., Concord, California, USA
-# Copyright 2009, 2015 Patrick J. Volkerding, Sebeka, MN, USA
-# Copyright 2015 Michal Nazarewicz <mina86@mina86.com>
-# All rights reserved.
-#
-# Redistribution and use of this script, with or without modification, is
-# permitted provided that the following conditions are met:
-#
-# 1. Redistributions of this script must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#
-# 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
-# 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;
-# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# Mon Jun 4 21:17:58 UTC 2018
-# Use /var/lib/pkgtools, not /var/log.
-#
-# 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.
-#
-# Wed May 23 03:35:28 UTC 2018
-# Added --terse, which limits screen output to one line per package.
-#
-# 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.
-#
-# 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):
-pkgbase() {
- PKGRETURN=${1##*/}
- case "$PKGRETURN" in *.t[gblx]z)
- PKGRETURN=${PKGRETURN%.*}
- esac
- echo "$PKGRETURN"
-}
-
-usage() {
- cat << EOF
-
-Usage: upgradepkg [options] <newpackage> ...
- upgradepkg [options] <oldpackage%newpackage> ...
-
-Upgrade, install, or reinstall Slackware packages (.tgz, .tbz, .tlz, .txz).
-
-To operate on an alternate directory, such as /mnt:
- ROOT=/mnt upgradepkg package.txz
-
-Options:
- --dry-run only display what would be done
- --install-new install new packages also
- --reinstall upgrade packages of the same version
- --terse display a single line for each package operation
- --terselength <length> maximum line length of terse output
- --verbose display all the gory details of the upgrade
- --help display this help
-
-For more details see upgradepkg(8).
-EOF
-}
-
-# Set the prefix for the package database directories (packages, scripts).
-ADM_DIR="$ROOT/var/lib/pkgtools"
-
-# Make sure there's a proper temp directory:
-TMP=$ADM_DIR/setup/tmp
-# If the $TMP directory doesn't exist, create it:
-if [ ! -d $TMP ]; then
- mkdir -p $TMP
- chmod 700 $TMP # no need to leave it open
-fi
-
-# This script expects an 022 umask:
-umask 022
-
-# $ROOT defined?
-if [ -d "$ROOT" ]; then
- export ROOT
-else
- unset ROOT
-fi
-
-# --help or no args?
-if [ "$1" = "" -o "$1" = "-help" -o "$1" = "--help" -o "$1" = "-?" ]; then
- usage;
- exit 1;
-fi
-
-# Create a lockfile directory if it doesn't exist. We can use it to prevent
-# output line collisions in --terse mode.
-INSTLOCKDIR=${INSTLOCKDIR:-/run/lock/pkgtools}
-if [ ! -d $INSTLOCKDIR ]; then
- mkdir -p $INSTLOCKDIR
-fi
-
-# Set default line length for terse mode:
-if tty -s && 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" -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.
- # Don't use it.
- NOT_PARANOID="true"
- shift 1
- 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" -o "$1" = "--reinstall" ]; then
- # Reinstall packages even if the installed one is the same version.
- REINSTALL="true"
- shift 1
- 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" -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
-# old package.
-
-package_name() {
- STRING=$(pkgbase "$1")
- case "$STRING" in
- *-*-*-*)
- # At least four segments, strip version arch and build and return name:
- echo "${STRING%-*-*-*}"
- # cruft for later ;)
- # BUILD=${STRING##*-}
- # STRING=${STRING%*-}
- # ARCH=${STRING##*-}
- # STRING=${STRING%*-}
- # VER=${STRING%*-}
- ;;
- *)
- # Old style package name with one segment or we don't have four
- # segments: return the old-style (or out of spec) package name.
- echo $STRING
- esac
-}
-
-ERRCODE=0
-
-# Main processing loop:
-for ARG; do
- OLD=${ARG%'%'*} # first segment, = $ARG if no %
- NEW=${ARG#*'%'} # second segment, = $ARG if no %
-
- # Simple package integrity check:
- if ! [ -f "$NEW" ]; then
- ERRCODE=4
- echo "Cannot install $NEW: file not found"
- continue;
- fi
-
- # Figure out the names of the old and new packages:
- INCOMINGDIR=$(dirname $NEW)
- # These are the package names with the extension:
- NNAME=${NEW##*/}
- ONAME=${OLD##*/}
- # These are the package names without the extension:
- OLD=$(pkgbase $OLD)
- NEW=$(pkgbase $NEW)
-
- # 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"
- continue;
- fi
-
- # Check and fix the old package name:
- SHORT="$(package_name $OLD)"
- if [ ! -r $ADM_DIR/packages/$OLD ]; then
- if ls $ADM_DIR/packages/$SHORT* 1> /dev/null 2> /dev/null ; then
- for installed_package in $ADM_DIR/packages/$SHORT* ; do
- if [ "$(package_name $installed_package)" = "$SHORT" ]; then # found one
- OLD="${installed_package##*/}"
- break
- fi
- done
- fi
- 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:
-
- if [ ! -r $ADM_DIR/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
- ! [ $TERSE ] && echo
- echo "Error: there is no installed package named $OLD."
- ! [ $TERSE ] && echo " (looking for $ADM_DIR/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
- 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
- fi
- fi
- fi
- continue;
- elif [ ! -r "$INCOMINGDIR/$NNAME" ]; then
- if [ "$DRY_RUN" = "true" ]; then
- echo "$NEW incoming package not found (command line)."
- else
- ! [ $TERSE ] && echo
- echo "Error: incoming package $INCOMINGDIR/$NNAME not found."
- ! [ $TERSE ] && echo
- fi
- ERRCODE=1
- continue;
- fi
-
- # Unless --reinstall was given, compare the package names
- # and skip any exact matches:
- if [ ! "$REINSTALL" = "true" ]; then
- if [ "$OLD" = "$NEW" ]; then
- if [ "$DRY_RUN" = "true" ]; then
- echo "$NEW would be skipped (already installed)."
- else
- if ! [ $TERSE ]; then
- cat << EOF
-
-+==============================================================================
-| Skipping package $NEW (already installed)
-+==============================================================================
-
-EOF
- fi
- fi
- continue;
- fi
- fi
-
- # Showtime. Let's do the upgrade. First, we will rename all the
- # installed packages with this basename to make them easy to remove later:
-
- TIMESTAMP=$(date +%Y-%m-%d,%T)
- SHORT="$(package_name $OLD)"
- if [ "$DRY_RUN" = "true" ]; then
- echo -n "$NEW would upgrade: "
- for installed_package in $ADM_DIR/packages/$SHORT* ; do
- if [ "$(package_name $installed_package)" = "$SHORT" ]; then
- echo -n "$(pkgbase $installed_package)"
- fi
- done
- echo
- continue
- fi
- for installed_package in $ADM_DIR/packages/$SHORT* ; do
- if [ "$(package_name $installed_package)" = "$SHORT" ]; then
- mv $installed_package ${installed_package}-upgraded-$TIMESTAMP
- fi
- done
- for installed_script in $ADM_DIR/scripts/$SHORT* ; do
- if [ "$(package_name $installed_script)" = "$SHORT" ]; then
- if [ -r $installed_script ]; then
- mv $installed_script ${installed_script}-upgraded-$TIMESTAMP
- fi
- fi
- done
-
- # Print a banner for the current upgrade:
- if ! [ $TERSE ]; then
- cat << EOF
-
-+==============================================================================
-| Upgrading $OLD package using $INCOMINGDIR/$NNAME
-+==============================================================================
-EOF
- fi
- # Next, the new package is pre-installed:
- if [ "$VERBOSE" = "verbose" ]; then
- if ! [ $TERSE ]; then
- /sbin/installpkg $INCOMINGDIR/$NNAME
- RETCODE=$?
- else
- /sbin/installpkg $INCOMINGDIR/$NNAME 1> /dev/null
- RETCODE=$?
- fi
- else
- 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 "corrupted."
- 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? :)
- ( flock 9 || exit 11
- for rempkg in "$ADM_DIR/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
- if ! [ $TERSE ]; then
- /sbin/installpkg $INCOMINGDIR/$NNAME
- else
- /sbin/installpkg $INCOMINGDIR/$NNAME 1> /dev/null
- fi
- fi
- ! [ $TERSE ] && echo "Package $OLD upgraded with new package $INCOMINGDIR/$NNAME."
- ERRCODE=0
-done
-exit $ERRCODE