mirror of
https://github.com/outbackdingo/scratchpkg.git
synced 2026-02-05 08:28:00 +00:00
310 lines
6.8 KiB
Bash
Executable File
310 lines
6.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
export LC_ALL=C
|
|
|
|
. /usr/share/scratchpkg/functions || exit 1
|
|
|
|
spkglock() {
|
|
|
|
if [ ! -f /tmp/spkg.lock ]; then
|
|
touch /tmp/spkg.lock
|
|
else
|
|
rm /tmp/spkg.lock
|
|
fi
|
|
}
|
|
|
|
removepkg() {
|
|
|
|
msg "Removing ${color_green}$ipackagename${color_reset}..."
|
|
|
|
### CHECK DEPENDENCY ###
|
|
if [ ! "$IGNORE_DEP" ]; then
|
|
msg2 "Checking dependencies..."
|
|
checkdeps $RMNAME
|
|
fi
|
|
|
|
# create lock file prevent simultaneous install/remove process running
|
|
spkglock
|
|
|
|
# source .install script
|
|
if [ -f $INDEX_DIR/$1/.pkginstall ]; then
|
|
source $INDEX_DIR/$1/.pkginstall
|
|
fi
|
|
|
|
if [ ! "$NO_PREREMOVE" ]; then
|
|
run_preremove
|
|
fi
|
|
|
|
msg2 "Removing files & dirs..."
|
|
pushd $ROOT_DIR
|
|
while IFS=' ' read -r line; do
|
|
if [ "$VERBOSE_REMOVE" = "yes" ]; then
|
|
rm_silent "$line" && echo "$line" || msgwarn "Failed remove $line"
|
|
else
|
|
rm_silent "$line" || msgwarn "Failed remove $line"
|
|
fi
|
|
done < <(tac $INDEX_DIR/$1/.files | grep -v '/$')
|
|
popd
|
|
|
|
pushd $ROOT_DIR
|
|
while IFS=' ' read -r line; do
|
|
if [ ! "$(grep -R --exclude-dir="$1" -w "$line" "$INDEX_DIR")" ]; then
|
|
if [ "$VERBOSE_REMOVE" = "yes" ]; then
|
|
rmdir_silent "$line" && echo "$line" || msgwarn "Failed remove $line"
|
|
else
|
|
rmdir_silent "$line" || msgwarn "Failed remove $line"
|
|
fi
|
|
fi
|
|
done < <(tac $INDEX_DIR/$1/.files | grep '/$')
|
|
popd
|
|
|
|
if [ ! "$NO_POSTREMOVE" ]; then
|
|
run_postremove
|
|
fi
|
|
|
|
runpreremovehooks $1
|
|
|
|
rm -R $INDEX_DIR/$1
|
|
|
|
if [ -d $INDEX_DIR/$1 ]; then
|
|
msgerr "Error occured while removing ${color_red}$ipackagename${color_reset}."
|
|
spkglock
|
|
exit 1
|
|
else
|
|
msg "Successfully remove ${color_green}$ipackagename${color_reset}."
|
|
fi
|
|
|
|
case $PREREMOVE_STATUS in
|
|
OK) msg "preremove : ${color_green}OK${color_reset}" ;;
|
|
KO) msg "preremove : ${color_red}FAIL${color_reset}" ;;
|
|
esac
|
|
|
|
case $POSTREMOVE_STATUS in
|
|
OK) msg "postremove : ${color_green}OK${color_reset}" ;;
|
|
KO) msg "postremove : ${color_red}FAIL${color_reset}" ;;
|
|
esac
|
|
|
|
runremovehooks
|
|
|
|
# remove lock file
|
|
spkglock
|
|
}
|
|
|
|
run_preremove() {
|
|
|
|
if [ "`type -t pre_remove`" = "function" ]; then
|
|
msg "Running preremove script..."
|
|
pre_remove "$iversion" && PREREMOVE_STATUS=OK || PREREMOVE_STATUS=KO
|
|
fi
|
|
|
|
}
|
|
|
|
run_postremove() {
|
|
|
|
if [ "`type -t post_remove`" = "function" ]; then
|
|
msg "Running postremove script..."
|
|
post_remove "$iversion" && POSTREMOVE_STATUS=OK || POSTREMOVE_STATUS=KO
|
|
fi
|
|
|
|
}
|
|
|
|
getoldname() {
|
|
|
|
iname=$(cat $INDEX_DIR/$1/.pkginfo | grep ^name | cut -d " " -f3)
|
|
iversion=$(cat $INDEX_DIR/$1/.pkginfo | grep ^version | cut -d " " -f3)
|
|
irelease=$(cat $INDEX_DIR/$1/.pkginfo | grep ^release | cut -d " " -f3)
|
|
ibackup=$(cat $INDEX_DIR/$1/.pkginfo | grep ^backup | cut -d " " -f3-)
|
|
idepends=$(cat $INDEX_DIR/$1/.pkginfo | grep ^depends | cut -d " " -f3-)
|
|
imakedepends=$(cat $INDEX_DIR/$1/.pkginfo | grep ^makedepends | cut -d " " -f3-)
|
|
|
|
ipackagename=$iname-$iversion-$irelease
|
|
|
|
}
|
|
|
|
checkdeps() {
|
|
|
|
for installed in $(ls $INDEX_DIR); do
|
|
name=$(cat $INDEX_DIR/$installed/.pkginfo | grep ^name | cut -d " " -f3)
|
|
version=$(cat $INDEX_DIR/$installed/.pkginfo | grep ^version | cut -d " " -f3)
|
|
release=$(cat $INDEX_DIR/$installed/.pkginfo | grep ^release | cut -d " " -f3)
|
|
pkgname="$name-$version-$release"
|
|
depends=$(cat $INDEX_DIR/$installed/.pkginfo | grep ^depends | cut -d " " -f3-)
|
|
for dep in ${depends[@]}; do
|
|
if [ "$dep" = "$1" ]; then
|
|
ERRDEP+=($pkgname)
|
|
fi
|
|
done
|
|
done
|
|
|
|
if [ "${#ERRDEP[@]}" -gt 0 ]; then
|
|
msgwarn "Package ${color_yellow}$iname-$iversion-$irelease${color_reset} is needed for:"
|
|
for pkg in ${ERRDEP[@]}; do
|
|
msg2 "$pkg"
|
|
done
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
checkneworphan() {
|
|
|
|
for dpd in ${idepends[@]}; do
|
|
saferemove $dpd
|
|
done
|
|
|
|
for mdpd in ${imakedepends[@]}; do
|
|
saferemove $mdpd
|
|
done
|
|
|
|
if [ "${#neworphan[@]}" -gt 0 ]; then
|
|
msg "New orphaned package:"
|
|
for list in ${neworphan[@]}; do
|
|
msg2 $list
|
|
done
|
|
fi
|
|
}
|
|
|
|
saferemove() {
|
|
|
|
ORPHAN="yes"
|
|
for all_installed in $(ls $INDEX_DIR); do
|
|
depend=$(cat $INDEX_DIR/$all_installed/.pkginfo | grep ^depends | cut -d " " -f3-)
|
|
for dep in ${depend[@]}; do
|
|
if [ $dep = $1 ]; then
|
|
ORPHAN="no"
|
|
fi
|
|
done
|
|
done
|
|
|
|
[ "$ORPHAN" = "yes" ] && [ -d $INDEX_DIR/$1 ] && neworphan+=($1)
|
|
|
|
}
|
|
|
|
runremovehooks() {
|
|
|
|
if [ "${#runthishook[@]}" -gt 0 ]; then
|
|
for hook in ${runthishook[@]}; do
|
|
description=$(cat "$hook" | grep ^"# Description" | sed 's/\://' | cut -d ' ' -f 3-)
|
|
operation=$(cat "$hook" | grep ^"# Operation" | sed 's/\://' | cut -d ' ' -f 3-)
|
|
target=$(cat "$hook" | grep ^"# Target" | sed 's/\://' | cut -d ' ' -f 3-)
|
|
if [ -n "$description" ] && [ -n "$operation" ] && [ -n "$target" ]; then
|
|
msg "$description"
|
|
. $hook
|
|
if [ "`type -t exechook`" = "function" ]; then
|
|
exechook
|
|
fi
|
|
fi
|
|
unset description operation target exec
|
|
done
|
|
fi
|
|
|
|
}
|
|
|
|
runpreremovehooks() {
|
|
|
|
if [ "$(ls $HOOK_DIR/*.hook 2>/dev/null)" ]; then
|
|
for hook in $(ls $HOOK_DIR/*.hook); do
|
|
operation=$(cat "$hook" | grep ^"# Operation" | sed 's/\://' | cut -d ' ' -f 3-)
|
|
target=$(cat "$hook" | grep ^"# Target" | sed 's/\://' | cut -d ' ' -f 3-)
|
|
if [ "$(echo $operation | grep -w "remove" )" ]; then
|
|
if [ "$(grep -E $target $INDEX_DIR/$1/.files)" ]; then
|
|
runthishook+=($hook)
|
|
fi
|
|
fi
|
|
unset operation target
|
|
done
|
|
fi
|
|
|
|
}
|
|
|
|
parse_options() {
|
|
|
|
while [ "$1" ]; do
|
|
case $1 in
|
|
-id|--ignore-dependency)
|
|
IGNORE_DEP=yes
|
|
;;
|
|
-ds|--disable-script)
|
|
DISABLE_SCRIPT=yes
|
|
;;
|
|
-v|--verbose)
|
|
VERBOSE_REMOVE=yes
|
|
;;
|
|
--no-preremove)
|
|
NO_PREREMOVE=yes
|
|
;;
|
|
--no-postremove)
|
|
NO_POSTREMOVE=yes
|
|
;;
|
|
--no-color)
|
|
NO_COLOR=yes
|
|
;;
|
|
--no-orphan-check)
|
|
NO_ORPHAN_CHECK=yes
|
|
;;
|
|
*)
|
|
RMNAME=$1
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
}
|
|
|
|
main() {
|
|
|
|
parse_options "$@"
|
|
|
|
### DISABLE COLOR ###
|
|
if [ "$NO_COLOR" ]; then
|
|
nocolor
|
|
fi
|
|
|
|
### CHECK FOR ROOT ACCESS ###
|
|
needroot "Removing package"
|
|
|
|
### CHECK DIRECTORY ###
|
|
checkdirexist "$INDEX_DIR" "$BACKUP_DIR" "$REJECTED_DIR"
|
|
checkdirwrite "$INDEX_DIR" "$BACKUP_DIR" "$REJECTED_DIR"
|
|
checkdirread "$INDEX_DIR" "$BACKUP_DIR" "$REJECTED_DIR"
|
|
|
|
### PACKAGE NAME ###
|
|
if [ -z $RMNAME ]; then
|
|
msgerr "Please state package name for remove."
|
|
exit 1
|
|
fi
|
|
|
|
### CHECK PACKAGE IN DATABASE ###
|
|
if [ ! -d $INDEX_DIR/$RMNAME ]; then
|
|
msg "Package ${color_red}$RMNAME${color_reset} not installed."
|
|
exit 1
|
|
fi
|
|
|
|
### CHECK FOR LOCK FILE ###
|
|
if [ -f /tmp/spkg.lock ]; then
|
|
msgerr "Cant install/remove package simultaneously."
|
|
msgerr "remove ${color_yellow}/tmp/spkg.lock${color_reset} if no install/remove package process running."
|
|
exit 1
|
|
fi
|
|
|
|
### GET NAME, VERSION, RELEASE FROM INSTALLED PACKAGE DATABASE ###
|
|
getoldname $RMNAME
|
|
|
|
### REMOVE PACKAGE ###
|
|
removepkg $RMNAME
|
|
|
|
### CHECK NEW ORPHANED PACKAGE ###
|
|
if [ ! "$NO_ORPHAN_CHECK" ]; then
|
|
checkneworphan
|
|
fi
|
|
|
|
# msg2 "Running ldconfig..."
|
|
if [ -x /sbin/ldconfig ]; then
|
|
/sbin/ldconfig
|
|
fi
|
|
|
|
exit 0
|
|
|
|
}
|
|
|
|
main "$@"
|