# 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"