populate-fully.sh: force entering the repository if the lock not valid anymore
authorAntonio Ospite <ao2@ao2.it>
Thu, 13 Dec 2018 23:10:02 +0000 (00:10 +0100)
committerAntonio Ospite <ao2@ao2.it>
Mon, 17 Dec 2018 09:37:45 +0000 (10:37 +0100)
If the vcsh instance which previously acquired the lock does not exist
anymore, the lock is invalid and can be taken by the current instance
for the repository it is entering.

.config/vcsh/hooks-available/populate-fully.sh

index b038d1e..ceff12f 100755 (executable)
@@ -8,9 +8,24 @@ set -e
 # 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"