# HG changeset patch
# User František Kučera <franta-hg@frantovo.cz>
# Date 1555876175 -7200
# Node ID 7bdf24cc2e9e85663a15f2f8a0ac6e6dbfeeb810
# Parent  d46ed3f5c72b9dcfe7a7e44b6c0e59dfc90ca4a8
do not stuck when cloning already mirrored repository

diff -r d46ed3f5c72b -r 7bdf24cc2e9e vcs-backup.sh
--- a/vcs-backup.sh	Sun Apr 21 00:05:19 2019 +0200
+++ b/vcs-backup.sh	Sun Apr 21 21:49:35 2019 +0200
@@ -106,7 +106,6 @@
 		echo "submited" > "$absolutePath/state.txt"
 		setfacl -m u:${VCS_BACKUP_USER}:r  "$absolutePath/url.txt"
 		setfacl -m u:${VCS_BACKUP_USER}:rw "$absolutePath/state.txt"
-		echo "$relativePath" | socat -u - unix-send:${VCS_BACKUP_SUBVOLUME_SOCKET};
 
 		if [[ "$3" == "public" ]]; then
 			cd "$VCS_BACKUP_PUBLIC_DIR";
@@ -115,9 +114,18 @@
 		fi
 
 		if [[ "$4" == "clone" ]]; then
-			socat -u "unix-recvfrom:$absolutePath/${VCS_BACKUP_CLONE_CALLBACK_SOCKET},mode=777" - | while read m; do # TODO: ,group=${VCS_BACKUP_USER} and no 777
-				echo "Message from the clone service: $m";
-			done;
+			callBackSocket=$absolutePath/${VCS_BACKUP_CLONE_CALLBACK_SOCKET}
+			socat -u "unix-recvfrom:$callBackSocket,mode=777" - | while read m; do # TODO: ,group=${VCS_BACKUP_USER} and no 777 ?
+				echo "Message from the service: $m";
+			done &
+			callBackPID=$!;
+		fi
+
+		echo "$relativePath" | socat -u - unix-send:${VCS_BACKUP_SUBVOLUME_SOCKET};
+
+		if [[ "$4" == "clone" ]]; then
+			echo "Waiting for a message from the service on $callBackSocket (PID $callBackPID)";
+			wait -n $callBackPID;
 		fi
 	else
 		echo "Unsupported VCS type: '$1' or URL: '$2'" >&2;
@@ -133,10 +141,17 @@
 vcs_backup_public_serverStartSubvolumeService() {
 	socat -u "unix-recv:${VCS_BACKUP_SUBVOLUME_SOCKET},group=${VCS_BACKUP_MANAGER},mode=770" - | while read d; do
 		mkdir -p $(dirname "$VCS_BACKUP_CURRENT_DIR/$d");
-		btrfs subvolume create "$VCS_BACKUP_CURRENT_DIR/$d" && \
-		echo "subvolumeCreated" > "$VCS_BACKUP_CONFIG_DIR/$d/state.txt" && \
-		chown "${VCS_BACKUP_USER}:${VCS_BACKUP_USER}" "$VCS_BACKUP_CURRENT_DIR/$d" && \
-		echo "$d" | socat -u - unix-send:${VCS_BACKUP_CLONE_SOCKET};
+		if [[ -e "$VCS_BACKUP_CURRENT_DIR/$d" ]]; then
+			callBackSocket="$VCS_BACKUP_CONFIG_DIR/$d/$VCS_BACKUP_CLONE_CALLBACK_SOCKET";
+			if [[ -e "$callBackSocket" ]]; then
+				echo "alreadyDone" | socat -u - unix-send:"$callBackSocket";
+			fi
+		else
+			btrfs subvolume create "$VCS_BACKUP_CURRENT_DIR/$d" && \
+			echo "subvolumeCreated" > "$VCS_BACKUP_CONFIG_DIR/$d/state.txt" && \
+			chown "${VCS_BACKUP_USER}:${VCS_BACKUP_USER}" "$VCS_BACKUP_CURRENT_DIR/$d" && \
+			echo "$d" | socat -u - unix-send:${VCS_BACKUP_CLONE_SOCKET};
+		fi
 	done
 }