X-Git-Url: https://git.ao2.it/config/vcsh.git/blobdiff_plain/e7109b26ca3742d660d77df5a94326297f00eaa0..3535ec27f70d73034e315faf7e3ded8c75c0413d:/.config/vcsh/hooks-available/populate-fully.sh diff --git a/.config/vcsh/hooks-available/populate-fully.sh b/.config/vcsh/hooks-available/populate-fully.sh index 46e155f..ceff12f 100755 --- a/.config/vcsh/hooks-available/populate-fully.sh +++ b/.config/vcsh/hooks-available/populate-fully.sh @@ -2,18 +2,36 @@ set -e -# Only one vcsh instance at a time can have the work dir fully populated. +# If the vcsh repository does not exist, exit without doing anything. +[ -d "$GIT_DIR" ] || exit 0 + +# Only one vcsh instance at a time can have the working tree fully populated. LOCKDIR=/run/lock/vcsh -# Kill the parent process because vcsh does not catch the hook exit value. -# See: https://github.com/RichiH/vcsh/issues/251 -mkdir "$LOCKDIR" 2>/dev/null || { echo "An instance of vcsh already entered a repository." 1>&2; kill -- -$PPID;} +# If mkdir fails it means that the lock dir already exists and the lock is +# already active. +if ! mkdir "$LOCKDIR" 2>/dev/null; +then + echo "An instance of vcsh already entered a repository." 1>&2 + + # Exit vcsh if the process which keeps the lock is still alive. + if kill -0 $(cat "$LOCKDIR/pid") 2>/dev/null; + then + # Kill the parent process instead of just bailing out because vcsh does + # not catch the hook exit value. + # See: https://github.com/RichiH/vcsh/issues/251 + kill -- -$PPID + else + echo "The instance which entered the repository earlier does not exist anymore." 1>&2 + echo "Continuing anyway." 1>&2 + fi +fi # Lock on the parent pid because the hooks are launched as children of vcsh. echo $PPID > "$LOCKDIR/pid" # git read-tree manual page says this is the proper way to fully repopulate -# the working directory +# the working tree. git config core.sparseCheckout true rm -f "$GIT_DIR/info/sparse-checkout" echo "/*" > "$GIT_DIR/info/sparse-checkout"