]> WPIA git - infra.git/blob - modules/hop/files/join
initial import
[infra.git] / modules / hop / files / join
1 #!/bin/bash
2
3 mkdir -p .join/
4
5 if ! [[ -z "$TMUX" ]]; then
6     printf >&2 'Already in tmux, unset TMUX to force nesting\n'
7     exit 1
8 fi
9
10 name="$1"
11 if [[ $name == "" ]]; then
12     printf >&2 'Usage: %s NAME\n' "$0"
13     exit 1
14 fi
15
16 set -o noclobber
17
18 # duplicate stderr to fd 3
19 exec 3>&2
20 # kill stderr to hide noclobber errors
21 exec 2>/dev/null
22
23 function sessionname {
24     if (($# != 2)); then
25         printf >&3 'sessionname requires exactly two arguments\n'
26         exit 1
27     fi
28     if [[ "$1" < "$2" ]]; then
29         printf '%s\n' "$1-$2"
30     else
31         printf '%s\n' "$2-$1"
32     fi
33 }
34
35 if printf '%s\n' "$name" > .join/join1; then
36     # we're the first
37     name1=$name
38     trap 'rm -f .join/join1' EXIT
39     # wait for second
40     printf 'Waiting for second client...\n'
41     while ! [[ -f .join/join2 ]]; do
42         sleep 1
43     done
44     read -r name2 < .join/join2
45     trap "echo false >| .join/$name1-$name2; rm -f .join/join1" EXIT
46     read -p "Do you want to collaborate with $name2? [Y/n] " -r response 2>&3
47     if [[ "$response" =~ ^[Nn] ]]; then
48         echo false >| .join/"$name1-$name2"
49         exit 1
50     else
51         # set up session
52         if ! tmux has-session -t "$(sessionname "$name1" "$name2")" &> /dev/null; then
53             tmux new-session -s "$(sessionname "$name1" "$name2")" -d
54             tmux set-hook -t "$(sessionname "$name1" "$name2")" client-detached "run 'tmux detach-client -s $(sessionname "$name1" "$name2"); true'"
55         fi
56         echo true >| .join/"$name1-$name2"
57     fi
58     rm -f .join/join1 .join/join2
59     # ready
60 else
61     read -r name1 < .join/join1
62     read -p "Do you want to collaborate with $name1? [Y/n] " -r response 2>&3
63     if [[ "$response" =~ ^[Nn] ]]; then
64         exit 1
65     fi
66     if printf '%s\n' "$name" > .join/join2; then
67         # we're the second
68         trap 'rm -f .join/join2' EXIT
69         read -r name1 < .join/join1
70         name2=$name
71         if [[ "$name1" == "$name2" ]]; then
72             printf >&3 'same client twice not allowed, exiting\n'
73             exit 1
74         fi
75         # wait for first to acknowledge collaboration
76         while ! [[ -f .join/"$name1-$name2" ]]; do
77             if ! read -r name1_ < .join/join1 || ! [[ "$name1_" == "$name1" ]]; then
78                 printf >&3 '%s has aborted collaboration.\n' "$name1"
79                 exit 1
80             fi
81             sleep 1
82         done
83         read -r ack < ".join/$name1-$name2"
84         rm -f ".join/$name1-$name2"
85         if [[ $ack != true ]]; then
86             printf >&3 '%s does not want to collaborate with you\n' "$name1"
87             exit 1
88         fi
89     else
90         # we're the third one, nope
91         printf >&3 'two clients already connected, exiting\n'
92         exit 1
93     fi
94 fi
95 if [[ "$name1" == "$name2" ]]; then
96     printf >&3 'same client twice not allowed, exiting\n'
97     exit 1
98 fi
99 (
100     while tmux has-session -t "$(sessionname "$name1" "$name2")"; do
101         sleep 5
102         [[ -f .join/"$name1-$name2" ]] && rm -f ".join/$name1-$name2"
103         if (($(tmux list-clients -t "$(sessionname "$name1" "$name2")" | wc -l)!=2)); then
104             tmux detach-client -s "$(sessionname "$name1" "$name2")"
105             break
106         fi
107     done
108 ) &
109 exec tmux attach -t "$(sessionname "$name1" "$name2")"