From: Richard Hartmann Date: Fri, 13 Jan 2012 23:07:24 +0000 (+0100) Subject: Implement hook system X-Git-Url: https://git.madduck.net/code/vcsh.git/commitdiff_plain/c189913f6c8eebaa6f2dcfcd666ccc4b17ec6c26?ds=inline;hp=--cc;pf=code Implement hook system Thanks to Vincent Demeester for this idea. --- c189913f6c8eebaa6f2dcfcd666ccc4b17ec6c26 diff --git a/doc/vcsh.1.ronn b/doc/vcsh.1.ronn index 9e37ca1..c6e0152 100644 --- a/doc/vcsh.1.ronn +++ b/doc/vcsh.1.ronn @@ -111,6 +111,21 @@ an interactive user. As noted earlier, `vcsh` will set <$GIT_DIR> and <$GIT_WORK_TREE> to the appropriate values for fake bare git repositories. +## HOOK SYSTEM + +`vcsh` provides a hook system. Hook scripts need to be executable and placed +in <$XDG_CONFIG_HOME/vcsh/hooks-available>. From there, they should be +soft-linked <$XDG_CONFIG_HOME/vcsh/hooks-enabled>. + +Hooks follow a simple format. `pre-run` will be run before anything is run. +If you want to have more than one script for a certain hook, just append +strings to order them. A system of `pre-run`, `pre-run.10`, `pre-run.20` etc +is suggested. The dot it optional. + +If you want to create hooks for a specific `vcsh` repository, simply prepend +the repository's name, followed by a dot, i.e. `zsh.pre-run`. This dot is +mandatory. + ## DETAILED HOWTO AND FURTHER READING Man pages are intended to be short and thus often useless to glean best diff --git a/vcsh b/vcsh index 52afbe1..bf97cbf 100755 --- a/vcsh +++ b/vcsh @@ -11,6 +11,7 @@ [ -r "$XDG_CONFIG_HOME/vcsh/config" ] && . "$XDG_CONFIG_HOME/vcsh/config" [ -n "$VCSH_DEBUG" ] && set -vx [ -z "$VCSH_REPO_D" ] && VCSH_REPO_D="$XDG_CONFIG_HOME/vcsh/repo.d" +[ -z "$VCSH_HOOK_D" ] && VCSH_HOOK_D="$XDG_CONFIG_HOME/vcsh/hooks-enabled" [ -z "$VCSH_BASE" ] && VCSH_BASE="$HOME" [ -z "$VCSH_GITIGNORE" ] && VCSH_GITIGNORE='exact' @@ -103,14 +104,23 @@ To continue, type \"Yes, do as I say\"" } enter() { + hook pre-enter use $SHELL + hook post-enter } git_dir_exists() { [ -d "$GIT_DIR" ] || fatal "no repository found for '$VCSH_REPO_NAME'" 12 } +hook() { + for f in $VCSH_HOOK_D/$1* $VCSH_HOOK_D/$VCSH_REPO_NAME.$1*; do + [ -x "$f" ] || continue + "$f" + done +} + init() { [ ! -e "$GIT_DIR" ] || fatal "'$GIT_DIR' exists" 10 export GIT_WORK_TREE="$VCSH_BASE" @@ -150,8 +160,10 @@ rename() { } run() { + hook pre-run use $VCSH_EXTERNAL_COMMAND + hook post-run } setup() {