remove HOOK, add trigger builtin

This commit is contained in:
emmett1
2019-05-01 16:42:01 +08:00
parent 5e38bab66d
commit 8a9c4eb185
6 changed files with 239 additions and 155 deletions

View File

@@ -2,14 +2,13 @@
BINDIR=/usr/bin
CONFDIR=/etc
HOOK_DIR=/etc/hooks
CACHE_DIR=/var/cache/scratchpkg
INDEX_DIR=/var/lib/scratchpkg
PORT_DIR=/usr/ports
REVDEPD=/etc/revdep.d
REVDEPCONF=/etc/revdep.conf
mkdir -pv ${DESTDIR}{${BINDIR},${CONFDIR},${HOOK_DIR},${PORT_DIR},${REVDEPD}}
mkdir -pv ${DESTDIR}{${BINDIR},${CONFDIR},${PORT_DIR},${REVDEPD}}
install -m755 revdep pkgadd pkgdel pkgbuild pkgdeplist pkglibdepends scratch pkgbase ${DESTDIR}${BINDIR}
install -m644 scratchpkg.conf scratchpkg.repo ${DESTDIR}${CONFDIR}
install -m755 extra/* ${DESTDIR}${BINDIR}

45
pkgadd
View File

@@ -43,33 +43,6 @@ msgwarn() {
echo -e "==> WARNING: $1"
}
runhooks() {
if [ "$UPGRADE_PKG" ]; then
opr=upgrade
else
opr=install
fi
for hook in $HOOK_DIR/*.hook; do
[ -f $hook ] || continue
description=$(grep "^# description[[:blank:]]*:" $hook | sed 's/^# description[[:blank:]]*:[[:blank:]]*//')
operation=$(grep "^# operation[[:blank:]]*:" $hook | sed 's/^# operation[[:blank:]]*:[[:blank:]]*//')
target=$(grep "^# target[[:blank:]]*:" $hook | sed 's/^# target[[:blank:]]*:[[:blank:]]*//')
if [ -n "$description" ] && [ -n "$operation" ] && [ -n "$target" ]; then
if [ "$(echo $operation | grep -w "$opr" )" ]; then
if [ "$(grep $target $INDEX_DIR/$name/.files)" ]; then
. $hook
if [ "`type -t exechook`" = "function" ]; then
exechook
fi
fi
fi
fi
unset description operation target
unset -f exechook
done
}
help() {
cat << EOF
Usage:
@@ -149,7 +122,6 @@ parse_opts $(extract_opt $@)
INDEX_DIR="$ROOT/var/lib/scratchpkg/index"
PKGADD_DIR="$ROOT/var/lib/scratchpkg"
LOCK_FILE="$PKGADD_DIR/spkg.lock"
HOOK_DIR=/etc/hooks
# show help page
if [ "$SHOWHELP" ] || [ -z "$PKGNAME" ]; then
@@ -240,10 +212,10 @@ if [ "$UPGRADE_PKG" ] || [ "$REINSTALL_PKG" ]; then
fi
### INSTALL PACKAGE INTO SYSTEM ###
opr=Installing
[ "$UPGRADE_PKG" ] && opr=Upgrading
[ "$REINSTALL_PKG" ] && opr=Reinstalling
echo "$opr '$name-$version-$release'..."
opr=install
[ "$UPGRADE_PKG" ] && opr=upgrade
[ "$REINSTALL_PKG" ] && opr=reinstall
echo "$opr: $name-$version-$release..."
#ignore conflict
if [ ! "$IGNORE_CONFLICT" ]; then
@@ -292,7 +264,7 @@ fi
fi
)
installcmd="tar --keep-directory-symlink -p -x -v -f $PKGNAME -C ${ROOT:-/} --exclude=.pkginfo --exclude=.pkginstall --exclude=.pkgreadme"
installcmd="tar --keep-directory-symlink -p -x -v -f $PKGNAME -C ${ROOT:-/} --exclude=.pkginfo --exclude=.pkginstall --exclude=.pkgreadme --exclude=.pkgmkdirs"
rm -f $TMP_PKGINSTALL $TMP_PKGINSTALL_BKP
$installcmd | while IFS=' ' read line; do
@@ -332,7 +304,7 @@ echo "version = $version" >> $INDEX_DIR/$name/.pkginfo
echo "release = $release" >> $INDEX_DIR/$name/.pkginfo
install -m644 $TMP_PKGINSTALL $INDEX_DIR/$name/.files
[ -f $TMP_PKGINSTALL_BKP ] && install -m644 $TMP_PKGINSTALL_BKP $INDEX_DIR/$name/.bkpfiles
tar -x -f $PKGNAME -C $INDEX_DIR/$name .pkginstall .pkgreadme >/dev/null 2>&1
tar -x -f $PKGNAME -C $INDEX_DIR/$name .pkginstall .pkgreadme .pkgmkdirs >/dev/null 2>&1
( cd $ROOT/
if [ ! "$NO_POSTINSTALL" ] && [ ! "$UPGRADE_PKG" ]; then
@@ -350,11 +322,6 @@ tar -x -f $PKGNAME -C $INDEX_DIR/$name .pkginstall .pkgreadme >/dev/null 2>&1
fi
)
if [ "$ROOT" = "" ]; then
[ "$NOHOOK" = "yes" ] || runhooks
[ $(type -p sysusers) ] && sysusers
fi
# running ldconfig
if [ -x /sbin/ldconfig ]; then
/sbin/ldconfig -r $ROOT/

View File

@@ -344,6 +344,7 @@ packaging() {
[ -f install ] && install -m644 install $PKG/.pkginstall
[ -f readme ] && install -m644 readme $PKG/.pkgreadme
[ -f mkdirs ] && install -m644 mkdirs $PKG/.pkgmkdirs
pushd $PKG >/dev/null
@@ -358,7 +359,7 @@ packaging() {
backupconf
fi
for FILE in .pkginstall .pkgreadme; do
for FILE in .pkginstall .pkgreadme .pkgmkdirs; do
if [ -f $FILE ]; then
addtotar+=($FILE)
fi

43
pkgdel
View File

@@ -43,38 +43,6 @@ msgwarn() {
echo -e "==> WARNING: $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
. $hook
if [ "`type -t exechook`" = "function" ]; then
exechook
fi
fi
unset description operation target
unset -f exechook
done
fi
}
runpreremovehooks() {
for hook in $HOOK_DIR/*.hook; do
[ -f $hook ] || continue
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 $target $INDEX_DIR/$1/.files)" ]; then
runthishook+=($hook)
fi
fi
unset operation target
done
}
help() {
cat << EOF
Usage:
@@ -140,7 +108,6 @@ parse_opts $(extract_opt $@)
INDEX_DIR="$ROOT/var/lib/scratchpkg/index"
PKGDEL_DIR="$ROOT/var/lib/scratchpkg"
LOCK_FILE="$PKGDEL_DIR/spkg.lock"
HOOK_DIR="/etc/hooks"
# show help page
if [ "$SHOWHELP" ] || [ -z "$RMNAME" ]; then
@@ -181,7 +148,7 @@ if [ -z $name ] && [ -z $version ] && [ -z $release ]; then
ret 1
fi
echo "Removing '$name-$version-$release'..."
echo "remove: $name-$version-$release..."
# source .install script
if [ "$ROOT" = "" ]; then
@@ -196,10 +163,6 @@ if [ ! "$NO_PREREMOVE" ]; then
fi
fi
if [ "$ROOT" = "" ] && [ "$NOHOOK" != "yes" ]; then
runpreremovehooks $name &>/dev/null
fi
if [ -f "$INDEX_DIR/$name/.bkpfiles" ]; then
while IFS=' ' read -r line; do
if [ -e "$ROOT/$line" ] || [ -L "$ROOT/$line" ]; then
@@ -233,10 +196,6 @@ fi
rm -rf $INDEX_DIR/$name
if [ "$ROOT" = "" ] && [ "$NOHOOK" != "yes" ]; then
runremovehooks
fi
# running ldconfig
if [ -x /sbin/ldconfig ]; then
/sbin/ldconfig -r $ROOT/

299
scratch
View File

@@ -460,75 +460,235 @@ scratch_foreignpkg() {
done
}
srunhooks() {
local hooks
if [ "$mode" = "upgrade" ] || [ "$mode" = "sysup" ]; then
opr=upgrade
else
opr=install
scratch_trigger() {
needroot "Run trigger"
needarg $@
pre_triggers $@
post_triggers
}
post_triggers() {
if [ "$trig_12" = 1 ]; then
echo "trigger: Running mkdirs..."
for mkd in $INDEX_DIR/*/.pkgmkdirs; do
[ -s $mkd ] || continue
while read dir mode uid gid junk; do
# Ignore comments and blank lines
case "$dir" in
""|\#*) continue ;;
esac
mkdir -p "$dir"
if [ "$uid" != '-' ]; then
getent passwd $uid >/dev/null
if [[ "$?" = 0 ]]; then
chown "$uid" "$dir"
fi
fi
if [ "$gid" != '-' ]; then
getent group $gid >/dev/null
if [[ "$?" = 0 ]]; then
chgrp "$gid" "$dir"
fi
fi
if [ "$mode" != '-' ]; then
chmod "$mode" "$dir"
fi
done < "$mkd"
done
fi
for hook in $HOOK_DIR/*.hook; do
[ -f $hook ] || continue
description=$(grep "^# description[[:blank:]]*:" $hook | sed 's/^# description[[:blank:]]*:[[:blank:]]*//')
operation=$(grep "^# operation[[:blank:]]*:" $hook | sed 's/^# operation[[:blank:]]*:[[:blank:]]*//')
target=$(grep "^# target[[:blank:]]*:" $hook | sed 's/^# target[[:blank:]]*:[[:blank:]]*//')
if [ -n "$description" ] && [ -n "$operation" ] && [ -n "$target" ]; then
if [ "$(echo $operation | grep -w "$opr" )" ]; then
for pn in $@; do
if [ -s $INDEX_DIR/$pn/.files ] && [ "$(grep $target $INDEX_DIR/$pn/.files)" ]; then
[ "$ee" != 1 ] && { echo; ee=1; }
echo "$description"
. $hook
if [ "`type -t exechook`" = "function" ]; then
exechook
fi
break
fi
done
if [ "$trig_11" = 1 ] && [ $(type -p fc-cache) ]; then
echo "trigger: Updating fontconfig cache..."
fc-cache -s
fi
if [ "$trig_10" = 1 ] && [ $(type -p gdk-pixbuf-query-loaders) ]; then
echo "trigger: Probing GDK-Pixbuf loader modules..."
gdk-pixbuf-query-loaders --update-cache
fi
if [ "$trig_9" = 1 ] && [ $(type -p gio-querymodules) ]; then
echo "trigger: Updating GIO module cache..."
gio-querymodules /usr/lib/gio/modules
fi
if [ "$trig_8" = 1 ] && [ $(type -p glib-compile-schemas) ]; then
echo "trigger: Compiling GSettings XML schema files..."
glib-compile-schemas /usr/share/glib-2.0/schemas
fi
if [ "$trig_7" = 1 ] && [ $(type -p gtk-query-immodules-2.0) ]; then
echo "trigger: Probing GTK2 input method modules..."
gtk-query-immodules-2.0 --update-cache
fi
if [ "$trig_6" = 1 ] && [ $(type -p gtk-query-immodules-3.0) ]; then
echo "trigger: Probing GTK3 input method modules..."
gtk-query-immodules-3.0 --update-cache
fi
if [ "$trig_5" = 1 ] && [ $(type -p gtk-update-icon-cache) ]; then
echo "trigger: Updating icon theme caches..."
for dir in /usr/share/icons/* ; do
if [[ -e $dir/index.theme ]]; then
gtk-update-icon-cache -q $dir &>/dev/null
else
rm -f $dir/icon-theme.cache
rmdir --ignore-fail-on-non-empty $dir
fi
fi
unset description operation target
unset -f exechook
done
}
srunremovehooks() {
local hook
if [ "${#runthishook[@]}" -gt 0 ]; then
echo
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
echo "$description"
. $hook
if [ "`type -t exechook`" = "function" ]; then
exechook
fi
fi
unset description operation target
unset -f exechook
done
fi
fi
if [ "$trig_4" = 1 ] && [ $(type -p udevadm) ]; then
echo "trigger: Updating hardware database..."
udevadm hwdb --update
fi
if [ "$trig_3" = 1 ] && [ $(type -p mkfontdir) ] && [ $(type -p mkfontscale) ]; then
echo "trigger: Updating X fontdir indices..."
for dir in $(find /usr/share/fonts -maxdepth 1 -type d \( ! -path /usr/share/fonts -a ! -name X11 \)) /usr/share/fonts/X11/*; do
rm -f $dir/fonts.{scale,dir} $dir/.uuid
rmdir --ignore-fail-on-non-empty $dir
[[ -d $dir ]] || continue
mkfontdir $dir
mkfontscale $dir
done
fi
if [ "$trig_2" = 1 ] && [ $(type -p update-desktop-database) ]; then
echo "trigger: Updating desktop file MIME type cache..."
update-desktop-database --quiet
fi
if [ "$trig_1" = 1 ] && [ $(type -p update-mime-database) ]; then
echo "trigger: Updating the MIME type database..."
update-mime-database /usr/share/mime
fi
}
srunpreremovehooks() {
local hook
for hook in $HOOK_DIR/*.hook; do
[ -f $hook ] || continue
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 $target $INDEX_DIR/$1/.files)" ]; then
if [ ! $(echo ${runthishook[@]} | tr ' ' '\n' | grep -x $hook) ]; then
runthishook+=($hook)
fi
pre_triggers() {
local pkg
# mime db
if [ "$trig_1" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/mime/$ $INDEX_DIR/$pkg/.files)" ]; then
trig_1=1
break
fi
fi
unset operation target
done
done
fi
# desktop db
if [ "$trig_2" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/applications/$ $INDEX_DIR/$pkg/.files)" ]; then
trig_2=1
break
fi
done
fi
# mkfontdir
if [ "$trig_3" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/fonts/[^/]*/$ $INDEX_DIR/$pkg/.files)" ]; then
trig_3=1
break
fi
done
fi
# hwdb
if [ "$trig_4" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^etc/udev/hwdb.d/$ $INDEX_DIR/$pkg/.files)" ]; then
trig_4=1
break
fi
done
fi
# icon caches
if [ "$trig_5" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/icons/[^/]*/$ $INDEX_DIR/$pkg/.files)" ]; then
trig_5=1
break
fi
done
fi
# gtk3 immodules
if [ "$trig_6" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/lib/gtk-3.0/3.0.0/immodules/.*.so $INDEX_DIR/$pkg/.files)" ]; then
trig_6=1
break
fi
done
fi
# gtk2 immodules
if [ "$trig_7" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/lib/gtk-2.0/2.10.0/immodules/.*.so $INDEX_DIR/$pkg/.files)" ]; then
trig_7=1
break
fi
done
fi
# gsettings schema
if [ "$trig_8" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/glib-2.0/schemas/$ $INDEX_DIR/$pkg/.files)" ]; then
trig_8=1
break
fi
done
fi
# gio modules
if [ "$trig_9" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/lib/gio/modules/.*.so $INDEX_DIR/$pkg/.files)" ]; then
trig_9=1
break
fi
done
fi
# gdk-pixbuf
if [ "$trig_10" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/lib/gdk-pixbuf-2.0/2.10.0/loaders/.*.so $INDEX_DIR/$pkg/.files)" ]; then
trig_10=1
break
fi
done
fi
# font caches
if [ "$trig_11" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.files" ] && [ "$(grep ^usr/share/fonts/[^/]*/$ $INDEX_DIR/$pkg/.files)" ]; then
trig_11=1
break
fi
done
fi
# makedirs
if [ "$trig_12" != "1" ]; then
for pkg in $@; do
if [ -s "$INDEX_DIR/$pkg/.pkgmkdirs" ]; then
trig_12=1
break
fi
done
fi
}
scratch_build() {
@@ -613,7 +773,7 @@ scratch_install() {
fi
done
settermtitle "Triggering install hook"
srunhooks ${done_pkg[@]}
scratch_trigger ${done_pkg[@]}
settermtitle "Reinstalling done"
[ "$error" = 1 ] && return 1 || return 0
fi
@@ -637,7 +797,7 @@ scratch_install() {
fi
done
settermtitle "Triggering install hook"
srunhooks ${done_pkg[@]}
scratch_trigger ${done_pkg[@]}
settermtitle "Installing done"
[ "$error" = 1 ] && return 1 || return 0
fi
@@ -694,7 +854,7 @@ scratch_install() {
unset portpathh
done
settermtitle "Triggering install hook"
srunhooks ${done_pkg[@]}
scratch_trigger ${done_pkg[@]}
settermtitle "$count/$total package(s) installed"
return "$error"
fi
@@ -768,12 +928,12 @@ scratch_remove() {
fi
for pkg in ${IPKG[@]}; do
count=$(( $count + 1 ))
srunpreremovehooks $pkg
pre_triggers $pkg
settermtitle "[ $count/$pkgcount ] Removing $pkg..."
pkgdel --no-hook $pkg ${OPTS[@]} || return 1
done
settermtitle "Triggering remove hook"
srunremovehooks
post_triggers
settermtitle "$pkgcount package(s) removed"
fi
}
@@ -873,7 +1033,7 @@ scratch_sysup() {
done_pkg+=($inst)
done
settermtitle "Triggering install hook"
srunhooks ${done_pkg[@]}
scratch_trigger ${done_pkg[@]}
settermtitle "$count/$total package(s) upgraded"
return $error
}
@@ -976,7 +1136,7 @@ scratch_upgrade() {
popd
done
settermtitle "triggering upgrade hook"
srunhooks ${done_pkg[@]}
scratch_trigger ${done_pkg[@]}
settermtitle "$count/$total package(s) upgraded"
return $error
}
@@ -1302,7 +1462,6 @@ main() {
BUILD_SCRIPT="spkgbuild"
INDEX_DIR="/var/lib/scratchpkg/index"
REPO_FILE="/etc/scratchpkg.repo"
HOOK_DIR="/etc/hooks"
SOURCE_DIR="/var/cache/scratchpkg/sources"
PACKAGE_DIR="/var/cache/scratchpkg/packages"

View File

@@ -10,7 +10,6 @@ MAKEFLAGS="-j$(nproc)"
# PACKAGE_DIR="/var/cache/scratchpkg/packages"
# LOG_DIR="/var/cache/scratchpkg/log"
# WORK_DIR="/tmp"
# HOOK_DIR="/etc/hooks"
# DOWNLOAD_PROG="wget"
# WGET_OPTS=""
# CURL_OPTS=""