populate-fully.sh: force entering the repository if the lock not valid anymore
[config/vcsh.git] / .config / vcsh / hooks-available / populate-fully.sh
index 46e155f..ceff12f 100755 (executable)
@@ -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"