diff --git a/INSTALL.sh b/INSTALL.sh index c122a23..002875e 100755 --- a/INSTALL.sh +++ b/INSTALL.sh @@ -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} diff --git a/pkgadd b/pkgadd index 0375d15..c00479d 100755 --- a/pkgadd +++ b/pkgadd @@ -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/ diff --git a/pkgbuild b/pkgbuild index 6888cb5..6badfc9 100755 --- a/pkgbuild +++ b/pkgbuild @@ -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 diff --git a/pkgdel b/pkgdel index 166c6e7..a39757d 100755 --- a/pkgdel +++ b/pkgdel @@ -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/ diff --git a/scratch b/scratch index 4bbeca8..e1c9d2c 100755 --- a/scratch +++ b/scratch @@ -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" diff --git a/scratchpkg.conf b/scratchpkg.conf index 3aff4e0..865ccc0 100644 --- a/scratchpkg.conf +++ b/scratchpkg.conf @@ -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=""