diff --git a/doc/vcsh.1.ronn b/doc/vcsh.1.ronn
index 9e37ca131314f2e648278e35d0366c9c94439855..c6e0152973a7b123e08506f193efcdfd3b91ab27 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 52afbe174348bdc1d6f1b78baa9136cb73a8cdbc..bf97cbfb0a92a632e5961d9d51c54d5ae8a16ee4 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() {