From 0716528b368a09621a38b1a39ae84dc2b3f5ccff Mon Sep 17 00:00:00 2001 From: Kevin Lyda <kevin@ie.suberic.net> Date: Thu, 17 Nov 2016 11:55:54 +0000 Subject: [PATCH] Make hooks work as advertised. For vcsh commands that loop through repos, hooks were not run correctly. Typically what would be run were: pre-looping-hook* .pre-looping-hook* [command run on repo r1, r2, r3 ... rN] post-looping-hook* rN.post-looping-hook The new, more obvious behaviour is: pre-looping-hook* r1.pre-looping-hook* [command run on repo r1] r1.post-looping-hook [...] rN.pre-looping-hook* [command run on repo r1] rN.post-looping-hook post-looping-hook* I was mainly concerned with the pull command, but I've made changes in all "for VCSH_REPO_NAME" loops. This is my way of resolving issue RichiH/vcsh#213, but as I note there are other options. --- vcsh | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/vcsh b/vcsh index de1b419..fe6af47 100755 --- a/vcsh +++ b/vcsh @@ -185,16 +185,18 @@ clone() { } commit() { - hook pre-commit + global_hook pre-commit for VCSH_REPO_NAME in $(list); do echo "$VCSH_REPO_NAME: " GIT_DIR=$VCSH_REPO_D/$VCSH_REPO_NAME.git; export GIT_DIR use + repo_hook pre-commit git commit --untracked-files=no --quiet $@ + repo_hook post-commit VCSH_COMMAND_RETURN_CODE=$? echo done - hook post-commit + global_hook post-commit } delete() { @@ -224,7 +226,7 @@ enter() { } foreach() { - hook pre-foreach + global_hook pre-foreach # We default to prefixing `git` to all commands passed to foreach, but # allow running in general context with -g @@ -239,23 +241,38 @@ foreach() { echo "$VCSH_REPO_NAME:" GIT_DIR=$VCSH_REPO_D/$VCSH_REPO_NAME.git; export GIT_DIR use + repo_hook pre-foreach $command_prefix "$@" + repo_hook post-foreach done - hook post-foreach + global_hook post-foreach } git_dir_exists() { [ -d "$GIT_DIR" ] || fatal "no repository found for '$VCSH_REPO_NAME'" 12 } -hook() { - for hook in "$VCSH_HOOK_D/$1"* "$VCSH_HOOK_D/$VCSH_REPO_NAME.$1"*; do +global_hook() { + for hook in "$VCSH_HOOK_D/$1"*; do + [ -x "$hook" ] || continue + verbose "executing '$hook'" + "$hook" + done +} + +repo_hook() { + for hook in "$VCSH_HOOK_D/$VCSH_REPO_NAME.$1"*; do [ -x "$hook" ] || continue verbose "executing '$hook'" "$hook" done } +hook() { + global_hook "$1" + repo_hook "$1" +} + init() { hook pre-init [ ! -e "$GIT_DIR" ] || fatal "'$GIT_DIR' exists" 10 @@ -349,29 +366,33 @@ list_untracked_helper() { } pull() { - hook pre-pull + global_hook pre-pull for VCSH_REPO_NAME in $(list); do printf '%s: ' "$VCSH_REPO_NAME" GIT_DIR=$VCSH_REPO_D/$VCSH_REPO_NAME.git; export GIT_DIR use + repo_hook pre-pull git pull + repo_hook post-pull VCSH_COMMAND_RETURN_CODE=$? echo done - hook post-pull + global_hook post-pull } push() { - hook pre-push + global_hook pre-push for VCSH_REPO_NAME in $(list); do printf '%s: ' "$VCSH_REPO_NAME" GIT_DIR=$VCSH_REPO_D/$VCSH_REPO_NAME.git; export GIT_DIR use + repo_hook pre-push git push + repo_hook post-push VCSH_COMMAND_RETURN_CODE=$? echo done - hook post-push + global_hook post-push } retire() { -- GitLab