makepkg: improve removal of installed dependencies

Compare a list of packages on the system before and after dependency
resolution in order to get a complete list of packages to remove.  This
allows makepkg to remove packages installed due to provides.

Bail in cases where packages that were on the system originally have been
removed as there is a risk of breaking the system when removing the new
packages.

Fixes FS#15144.

Signed-off-by: Allan McRae <allan@archlinux.org>
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Allan McRae 2009-10-23 15:30:47 +10:00 committed by Dan McGee
parent df99495b82
commit ccbef232c9
2 changed files with 23 additions and 19 deletions

View File

@ -174,9 +174,9 @@ Environment Variables
---------------------
*PACMAN*::
The command that will be used to check for missing dependencies and to
install and remove packages. Pacman's -U, -T, -S and -Rns operations
must be supported by this command. If the variable is not set or
empty, makepkg will fall back to `pacman'.
install and remove packages. Pacman's -Qq, -Rns, -S, -T, and -U
operations must be supported by this command. If the variable is not
set or empty, makepkg will fall back to `pacman'.
**PKGDEST=**"/path/to/folder"::
Folder where the resulting packages will be stored. Overrides the

View File

@ -344,7 +344,7 @@ download_file() {
run_pacman() {
local ret=0
if (( ! ASROOT )) && [[ $1 != "-T" ]] && sudo -l $PACMAN &>/dev/null; then
if (( ! ASROOT )) && [[ $1 != "-T" && $1 != "-Qq" ]] && sudo -l $PACMAN &>/dev/null; then
sudo $PACMAN $PACMAN_OPTS "$@" || ret=$?
else
$PACMAN $PACMAN_OPTS "$@" || ret=$?
@ -399,7 +399,6 @@ handle_deps() {
}
resolve_deps() {
# $pkgdeps is a GLOBAL variable, used by remove_deps()
local R_DEPS_SATISFIED=0
local R_DEPS_MISSING=1
@ -409,7 +408,6 @@ resolve_deps() {
fi
if handle_deps $deplist; then
pkgdeps="$pkgdeps $deplist"
# check deps again to make sure they were resolved
deplist="$(check_deps $*)"
[[ -z $deplist ]] && return $R_DEPS_SATISFIED
@ -426,23 +424,24 @@ resolve_deps() {
return $R_DEPS_MISSING
}
# fix flyspray bug #5923
remove_deps() {
# $pkgdeps is a GLOBAL variable, set by resolve_deps()
(( ! RMDEPS )) && return
[[ -z $pkgdeps ]] && return
local dep depstrip deplist
deplist=""
for dep in $pkgdeps; do
depstrip="${dep%%[<=>]*}"
deplist="$deplist $depstrip"
done
# check for packages removed during dependency install (e.g. due to conflicts)
# removing all installed packages is risky in this case
if [[ -n $(comm -23 <(printf "%s\n" "${original_pkglist[@]}") \
<(printf "%s\n" "${current_pkglist[@]}")) ]]; then
warning "$(gettext "Failed to remove installed dependencies.")"
return 0
fi
local deplist=($(comm -13 <(printf "%s\n" "${original_pkglist[@]}") \
<(printf "%s\n" "${current_pkglist[@]}")))
(( ${#deplist[@]} == 0 )) && return
msg "Removing installed dependencies..."
# exit cleanly on failure to remove deps as package has been built successfully
if ! run_pacman -Rns $deplist; then
if ! run_pacman -Rn ${deplist[@]}; then
warning "$(gettext "Failed to remove installed dependencies.")"
return 0
fi
@ -1866,14 +1865,15 @@ if (( SOURCEONLY )); then
exit 0
fi
# fix flyspray bug #5973
if (( NODEPS || NOBUILD || REPKG )); then
# no warning message needed for nobuild, repkg
if (( NODEPS )); then
warning "$(gettext "Skipping dependency checks.")"
fi
elif [ $(type -p "${PACMAN%% *}") ]; then
unset pkgdeps # Set by resolve_deps() and used by remove_deps()
if (( RMDEPS )); then
original_pkglist=($(run_pacman -Qq | sort)) # required by remove_dep
fi
deperr=0
msg "$(gettext "Checking Runtime Dependencies...")"
@ -1882,6 +1882,10 @@ elif [ $(type -p "${PACMAN%% *}") ]; then
msg "$(gettext "Checking Buildtime Dependencies...")"
resolve_deps ${makedepends[@]} || deperr=1
if (( RMDEPS )); then
current_pkglist=($(run_pacman -Qq | sort)) # required by remove_deps
fi
if (( deperr )); then
error "$(gettext "Could not resolve all dependencies.")"
exit 1