diff options
author | Patrick J Volkerding <volkerdi@slackware.com> | 2018-05-28 19:12:29 +0000 |
---|---|---|
committer | Eric Hameleers <alien@slackware.com> | 2018-05-31 23:39:35 +0200 |
commit | 646a5c1cbfd95873950a87b5f75d52073a967023 (patch) | |
tree | b8b8d2ab3b0d432ea69ad1a64d1c789649d65020 /source/a/pkgtools/scripts/removepkg | |
parent | d31c50870d0bee042ce660e445c9294a59a3a65b (diff) | |
download | current-646a5c1cbfd95873950a87b5f75d52073a967023.tar.gz |
Mon May 28 19:12:29 UTC 201820180528191229
a/pkgtools-15.0-noarch-13.txz: Rebuilt.
installpkg: default line length for --terselength is the number of columns.
removepkg: added --terse mode.
upgradepkg: default line length for --terselength is the number of columns.
upgradepkg: accept -option in addition to --option.
ap/vim-8.1.0026-x86_64-1.txz: Upgraded.
d/bison-3.0.5-x86_64-1.txz: Upgraded.
e/emacs-26.1-x86_64-1.txz: Upgraded.
kde/kopete-4.14.3-x86_64-8.txz: Rebuilt.
Recompiled against libidn-1.35.
n/conntrack-tools-1.4.5-x86_64-1.txz: Upgraded.
n/libnetfilter_conntrack-1.0.7-x86_64-1.txz: Upgraded.
n/libnftnl-1.1.0-x86_64-1.txz: Upgraded.
n/links-2.16-x86_64-2.txz: Rebuilt.
Rebuilt to enable X driver for -g mode.
n/lynx-2.8.9dev.19-x86_64-1.txz: Upgraded.
n/nftables-0.8.5-x86_64-1.txz: Upgraded.
n/p11-kit-0.23.11-x86_64-1.txz: Upgraded.
n/ulogd-2.0.7-x86_64-1.txz: Upgraded.
n/whois-5.3.1-x86_64-1.txz: Upgraded.
xap/network-manager-applet-1.8.12-x86_64-1.txz: Upgraded.
xap/vim-gvim-8.1.0026-x86_64-1.txz: Upgraded.
Diffstat (limited to 'source/a/pkgtools/scripts/removepkg')
-rw-r--r-- | source/a/pkgtools/scripts/removepkg | 175 |
1 files changed, 100 insertions, 75 deletions
diff --git a/source/a/pkgtools/scripts/removepkg b/source/a/pkgtools/scripts/removepkg index 2813fc3c..14af10f3 100644 --- a/source/a/pkgtools/scripts/removepkg +++ b/source/a/pkgtools/scripts/removepkg @@ -1,6 +1,50 @@ #!/bin/sh # Slackware remove package script # +# Copyright 1994, 1995, 1998 Patrick Volkerding, Moorhead, Minnesota USA +# Copyright 2001, Slackware Linux, Inc., Concord, CA USA +# Copyright 2009, 2015, 2016 Patrick J. Volkerding, Sebeka, MN, USA +# 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. +# + +# Sun May 27 18:02:23 UTC 2018 +# Added --terse mode to print one line per removed package. +# +# Wed May 23 17:31:23 UTC 2018 +# Use file locking to prevent more than one copy of ldconfig from running at +# a time. +# +# Thu Sep 15 17:46:28 UTC 2016 <volkerdi> +# If removepkg is called with a short package name (no -$VERSION-$ARCH-$BUILD), +# remove the most recently installed matching package, not the oldest one. +# +# Thu Sep 15 08:09:01 BST 2016 <mozes> +# - Handle finding >1 match for a package. Thanks to SeB on LQ for the feedback. +# +# Wed Sep 14 20:44:00 BST 2016 <mozes> +# - Modify package_name function to cater for package file names that contain +# >=4 hyphens. +# Thanks to coralfang on LQ for the report and to Jim Hawkins for the patch. +# - Modified to handle packages that contain file names with backslashes +# Thanks to aaazen on LQ for the report and the patch. +# # Thu Sep 24 03:31:58 UTC 2015 <alphageek> # extract_links() sed adjusted to handle symlinks with spaces. # @@ -76,28 +120,8 @@ # Original Version from Slackware 3.0 # -# Copyright 1994, 1995, 1998 Patrick Volkerding, Moorhead, Minnesota USA -# Copyright 2001, Slackware Linux, Inc., Concord, CA USA -# Copyright 2009, 2015 Patrick J. Volkerding, Sebeka, MN, USA -# 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. -# +# Needed to find package names within the 'remove_packages' function: +shopt -s extglob # Return a package name that has been stripped of the dirname portion # and any of the valid extensions (only): @@ -120,6 +144,13 @@ fi ADM_DIR=$ROOT/var/log PRES_DIR=$TMP/preserved_packages +# Lock directory for ldconfig... share it with installpkg so that upgradepkg +# becomes properly ldconfig-locked, too. +INSTLOCKDIR=${INSTLOCKDIR:-/run/installpkg-lock} +if [ ! -d $INSTLOCKDIR ]; then + mkdir -p $INSTLOCKDIR +fi + # This simple cat_except() should be used on the installer, # since the busybox "find" can't handle the complex find # syntax: @@ -131,8 +162,8 @@ PRES_DIR=$TMP/preserved_packages # removed when ROOT= is used: cat_except() { ( cd "$1" && \ - if [ $(find . -type f -maxdepth 1 | wc -l) -ne 1 ]; then - cat $(find . -type f -maxdepth 1 | grep -v "$2") + if [ $(find . -type f -maxdepth 1 2> /dev/null | wc -l) -ne 1 ]; then + cat $(find . -type f -maxdepth 1 2> /dev/null | grep -v "$2") 2> /dev/null fi ) } @@ -166,11 +197,11 @@ keep_files() { while read FILE ; do if [ ! -d "$ROOT/$FILE" ]; then if [ -r "$ROOT/$FILE" ]; then - echo " --> $ROOT/$FILE was found in another package. Skipping." + ! [ $TERSE ] && echo " --> $ROOT/$FILE was found in another package. Skipping." preserve_file "$FILE" else if [ "$(echo $FILE | cut -b1-8)" != "install/" ]; then - echo "WARNING: Nonexistent $ROOT/$FILE was found in another package. Skipping." + ! [ $TERSE ] && echo "WARNING: Nonexistent $ROOT/$FILE was found in another package. Skipping." fi fi else @@ -182,29 +213,31 @@ keep_files() { keep_links() { while read LINK ; do if [ -L "$ROOT/$LINK" ]; then - echo " --> $ROOT/$LINK (symlink) was found in another package. Skipping." + ! [ $TERSE ] && echo " --> $ROOT/$LINK (symlink) was found in another package. Skipping." else - echo "WARNING: Nonexistent $ROOT/$LINK (symlink) was found in another package. Skipping." + ! [ $TERSE ] && echo "WARNING: Nonexistent $ROOT/$LINK (symlink) was found in another package. Skipping." fi done } delete_files() { - while read FILE ; do + local unset LC_ALL # Locally (within this delete_files function) allow handling of backslashes + while read -r AFILE ; do # do not expand backslashes on read + FILE=$(printf "%b" "$AFILE") # unescape octal characters if [ ! -d "$ROOT/$FILE" ]; then if [ -r "$ROOT/$FILE" ]; then if [ "$ROOT/$FILE" -nt "$ADM_DIR/packages/$PKGNAME" ]; then - echo "WARNING: $ROOT/$FILE changed after package installation." + ! [ $TERSE ] && echo "WARNING: $ROOT/$FILE changed after package installation." fi if [ ! "$WARN" = "true" ]; then - echo " --> Deleting $ROOT/$FILE" + ! [ $TERSE ] && echo " --> Deleting $ROOT/$FILE" preserve_file "$FILE" && rm -f "$ROOT/$FILE" else - echo " --> $ROOT/$FILE would be deleted" + ! [ $TERSE ] && echo " --> $ROOT/$FILE would be deleted" preserve_file "$FILE" fi else - echo " --> $ROOT/$FILE no longer exists. Skipping." + ! [ $TERSE ] && echo " --> $ROOT/$FILE no longer exists. Skipping." fi else preserve_dir "$FILE" @@ -216,13 +249,13 @@ delete_links() { while read LINK ; do if [ -L "$ROOT/$LINK" ]; then if [ ! "$WARN" = "true" ]; then - echo " --> Deleting symlink $ROOT/$LINK" + ! [ $TERSE ] && echo " --> Deleting symlink $ROOT/$LINK" rm -f "$ROOT/$LINK" else - echo " --> $ROOT/$LINK (symlink) would be deleted" + ! [ $TERSE ] && echo " --> $ROOT/$LINK (symlink) would be deleted" fi else - echo " --> $ROOT/$LINK (symlink) no longer exists. Skipping." + ! [ $TERSE ] && echo " --> $ROOT/$LINK (symlink) no longer exists. Skipping." fi done } @@ -233,13 +266,13 @@ delete_dirs() { if [ -d "$ROOT/$DIR" ]; then if [ ! "$WARN" = "true" ]; then if [ $(ls -a "$ROOT/$DIR" | wc -l) -eq 2 ]; then - echo " --> Deleting empty directory $ROOT/$DIR" + ! [ $TERSE ] && echo " --> Deleting empty directory $ROOT/$DIR" rmdir "$ROOT/$DIR" else - echo "WARNING: Unique directory $ROOT/$DIR contains new files" + ! [ $TERSE ] && echo "WARNING: Unique directory $ROOT/$DIR contains new files" fi else - echo " --> $ROOT/$DIR (dir) would be deleted if empty" + ! [ $TERSE ] && echo " --> $ROOT/$DIR (dir) would be deleted if empty" fi fi done @@ -250,33 +283,21 @@ delete_cats() { while read FILE ; do if [ -f "$ROOT/$FILE" ]; then if [ ! "$WARN" = "true" ]; then - echo " --> Deleting $ROOT/$FILE (fmt man page)" + ! [ $TERSE ] && echo " --> Deleting $ROOT/$FILE (fmt man page)" rm -f $ROOT/$FILE else - echo " --> $ROOT/$FILE (fmt man page) would be deleted" + ! [ $TERSE ] && echo " --> $ROOT/$FILE (fmt man page) would be deleted" fi fi done } -package_name() { - STRING=$(pkgbase $1 | sed 's?-[^-]*-[^-]*-[^-]*$??') - # If we don't do this, commands run later will take the '-' to be an option - # and will destroy the package database. Packages should not contain spaces - # in them. Normally this type of problem results from a command line typo. - if [ "$(echo $STRING | cut -b 1)" = "-" ]; then - STRING="malformed-package-name-detected" - fi - echo $STRING -} - # Conversion to 'comm' utility by Mark Wisdom. # is pretty nifty! :^) remove_packages() { - for PKGLIST in $* + for PKGLIST in $* do PKGNAME=$(pkgbase $PKGLIST) - echo # If we don't have a package match here, then we will attempt to find # a package using the long name format (name-version-arch-build) for # which the base package name was given. On a properly-managed machine, @@ -285,24 +306,22 @@ remove_packages() { # be removed. If you want to remove them all, you'll need to run # removepkg again until it removes all the same-named packages. if [ ! -e $ADM_DIR/packages/$PKGNAME ]; then - SHORT="$(package_name $PKGNAME)" - for long_package in $ADM_DIR/packages/${PKGNAME}* ; do - if [ "$SHORT" = "$(package_name $long_package)" ]; then - PKGNAME="$(basename $long_package)" - fi - done - fi - - if [ ! -e $ADM_DIR/packages/$PKGNAME ]; then - long_package=$(ls -1 $ADM_DIR/packages/${PKGNAME}* | grep -m 1 "^${PKGNAME}-[^-]*-[^-]*-[^-]*$") - if [ -e "$long_package" ]; then - PKGNAME=$(basename $long_package) + # Short name not found - finally try looking for full name - e.g. foo-1.0-arm-1 + pushd $ADM_DIR/packages > /dev/null + # Don't set PKGNAME if there are no matches: + if [ ! "$( ls -1 $PKGNAME-+([^-])-+([^-])-+([^-]) 2>/dev/null | wc -l )" = "0" ]; then + # If there is more than one package with the same name, set PKGNAME to the + # most recently installed version. This does not affect the behavior of + # upgradepkg, which always removes all other existing versions of the + # same package. + PKGNAME=$( ls -1t $PKGNAME-+([^-])-+([^-])-+([^-]) 2> /dev/null | head -n1 ) fi + popd > /dev/null fi if [ -r $ADM_DIR/packages/$PKGNAME ]; then if [ ! "$WARN" = true ]; then - echo "Removing package $ADM_DIR/packages/$PKGNAME..." + echo "Removing package: $(basename $ADM_DIR/packages/$PKGNAME)" fi if fgrep "./" $ADM_DIR/packages/$PKGNAME 1> /dev/null 2>&1; then TRIGGER="^\.\/" @@ -310,7 +329,7 @@ remove_packages() { TRIGGER="FILE LIST:" fi if [ ! "$WARN" = true ]; then - echo "Removing files:" + ! [ $TERSE ] && echo "Removing files:" fi sed -n "/$TRIGGER/,/^$/p" < $ADM_DIR/packages/$PKGNAME | \ fgrep -v "FILE LIST:" | sort -u > $TMP/delete_list$$ @@ -325,7 +344,7 @@ remove_packages() { comm -12 $TMP/del_link_list$$ $TMP/required_list$$ | keep_links comm -23 $TMP/del_link_list$$ $TMP/required_list$$ | delete_links else - cat $ADM_DIR/scripts/* | extract_links | \ + cat $ADM_DIR/scripts/* 2> /dev/null | extract_links | \ sort -u > $TMP/required_links$$ mv $TMP/required_list$$ $TMP/required_files$$ sort -u $TMP/required_links$$ $TMP/required_files$$ >$TMP/required_list$$ @@ -348,22 +367,27 @@ remove_packages() { fi fi if [ ! "$WARN" = "true" ]; then - for DIR in $ADM_DIR/removed_packages $ADM_DIR/removed_scripts ; do - if [ ! -d $DIR ] ; then mkdir -p $DIR ; chmod 755 $DIR ; fi - done + mkdir -p $ADM_DIR/removed_packages $ADM_DIR/removed_scripts mv $ADM_DIR/packages/$PKGNAME $ADM_DIR/removed_packages if [ -r $ADM_DIR/scripts/$PKGNAME ]; then mv $ADM_DIR/scripts/$PKGNAME $ADM_DIR/removed_scripts fi fi else - echo "No such package: $ADM_DIR/packages/$PKGNAME. Can't remove." + echo "No such package: $(basename $ADM_DIR/packages/$PKGNAME). Can't remove." + fi + # In the case where a library and symlink are removed but an earlier version + # remains on the machine, this will link it up and save potential problems: + if [ "$ROOT" = "" ] && [ -x /sbin/ldconfig ]; then + ( flock 9 || exit 11 + /sbin/ldconfig 2> /dev/null + ) 9> $INSTLOCKDIR/ldconfig.lock fi done } if [ "$#" = "0" ]; then - echo "Usage: $(basename $0) [-copy] [-keep] [-preserve] [-warn] packagename ..."; exit 1 + echo "Usage: $(basename $0) [--copy] [--keep] [--preserve] [--terse] [--warn] packagename ..."; exit 1 fi while : ; do @@ -371,6 +395,7 @@ while : ; do -copy | --copy) WARN=true; PRESERVE=true; shift;; -keep | --keep) KEEP=true; shift;; -preserve | --preserve) PRESERVE=true; shift;; + -terse | --terse) TERSE=0; shift;; -warn | --warn) WARN=true; shift;; -* | --*) echo "Usage: $(basename $0) [-copy] [-keep] [-preserve] [-warn] packagename ..."; exit 1;; *) break @@ -378,6 +403,7 @@ while : ; do done if [ "$WARN" = "true" ]; then + unset TERSE echo "Only warning... not actually removing any files." if [ "$PRESERVE" = "true" ]; then echo "Package contents is copied to $PRES_DIR." @@ -392,4 +418,3 @@ else fi remove_packages $* - |