= TODO = * documentation * run PreTransaction hooks *after* conflict checks * hook/trigger validation * masking hooks with an empty file or symlink to /dev/null * tests = Hook Directories = ALPM handles keep a list of hook directories to scan. Initially, this list is populated with a single directory: /usr/share/alpm/hooks/. This directory is intended for packages to be able to place hooks in a front-end agnostic manner. Front-ends may specify any number of additional directories to search, with later directories overriding earlier ones. Front-ends can disable hooks altogether by setting an empty list. = Parsing Hooks = Configured directories are scanned for files matching '*.hook'. Hook files must be in pacman-style INI format with the following available options: [Trigger] (multiple Trigger sections allowed) Operation = Sync|Remove (Required) Type = File|Package (Required) Target = <Path|PkgName> (Required, multiple allowed) [Action] (only one Action section allowed) When = PreTransaction|PostTransaction (Required) Exec = <Command> (Required) Depends = <PkgName> (Optional) AbortOnFail (Optional, PreTransaction only) Unlike pacman.conf multiple values are *not* allowed on a single line. Exec is currently limited to the path of the executable to run, arguments are not allowed. This is intended to be a temporary limitation until I decide the best way to go about splitting the arguments, which depends in part on whether we want to try to provide hooks with the packages/files that triggered them. Targets are matched the same as IgnorePkg in pacman.conf, meaning multiple targets can be specified and targets can be negated with a leading '!'. If multiple Trigger sections are specified the hook will run if any of them match the transaction. = Running Hooks = Hooks are not cached after running. Directories are rescanned and hooks reloaded each time. This is to make sure that any hooks added/removed during a transaction are appropriately accounted for. Hooks are run exactly the same as install scriptlets (chroot, output passed to the front-end, etc.). They do *not* have access to which package/file triggered the hook. For the time being, run order is officially undefined. apg Andrew Gregory (4): move strtim to util-common move ini parser into common wip add hooks add example hooks hooks/checkboot.hook | 17 +++ hooks/checkmount | 13 ++ hooks/checkmount.conf | 1 + hooks/checkmount.hook | 17 +++ hooks/sync.hook | 16 +++ lib/libalpm/Makefile.am | 2 + lib/libalpm/alpm.c | 1 + lib/libalpm/alpm.h | 10 ++ lib/libalpm/handle.c | 59 ++++++++ lib/libalpm/handle.h | 1 + lib/libalpm/hook.c | 354 +++++++++++++++++++++++++++++++++++++++++++++++ lib/libalpm/hook.h | 34 +++++ lib/libalpm/trans.c | 6 + src/common/ini.c | 116 ++++++++++++++++ src/common/ini.h | 30 ++++ src/common/util-common.c | 39 ++++++ src/common/util-common.h | 2 + src/pacman/ini.c | 117 +--------------- src/pacman/ini.h | 31 +---- src/pacman/util.c | 39 ------ src/pacman/util.h | 1 - src/util/pactree.c | 36 ----- 22 files changed, 720 insertions(+), 222 deletions(-) create mode 100644 hooks/checkboot.hook create mode 100644 hooks/checkmount create mode 100644 hooks/checkmount.conf create mode 100644 hooks/checkmount.hook create mode 100644 hooks/sync.hook create mode 100644 lib/libalpm/hook.c create mode 100644 lib/libalpm/hook.h create mode 100644 src/common/ini.c create mode 100644 src/common/ini.h mode change 100644 => 120000 src/pacman/ini.c mode change 100644 => 120000 src/pacman/ini.h -- 2.4.5