GitRoot
craft your forge, build your project, grow your community freely
1#!/usr/bin/env bash
2
3# SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
4#
5# SPDX-License-Identifier: EUPL-1.2
6
7trap 'catch $LINENO' ERR
8
9EXPECTED_ERROR=0
10
11catch() {
12 if [[ $EXPECTED_ERROR == 0 ]]; then
13 echo "🛑 unexpected error line $1"
14 exit 1
15 fi
16 report "🟢 expected err line $1"
17}
18
19quiet_git() {
20 echo "🚀 git $@" >> /tmp/mylog.txt
21 GIT_TRACE=false GIT_TRACE_PACKET=false git "$@" &>> /tmp/mylog.txt
22}
23
24report() {
25 echo "$1" >> /tmp/mylog.txt
26 echo "$1"
27}
28
29mySleep() {
30 echo "🕐 $1" >> /tmp/mylog.txt
31 sleep $1
32}
33
34function wait_for() {
35 start=`date +%s`
36 timeout=100
37 until [ $timeout -le 0 ] || (grep -q $1 $2 &> /dev/null); do
38 sleep 0.1
39 timeout=$(( timeout - 1 ))
40 done
41 if [ $timeout -le 0 ]; then
42 return 1
43 fi
44 end=`date +%s`
45 echo "🕐 $@ in `expr $end - $start` seconds"
46}
47
48function wait_ls() {
49 start=`date +%s`
50 timeout=100
51 until [ $timeout -le 0 ] || [ $(ls $1 | wc -l) -eq 3 ]; do
52 sleep 0.1
53 timeout=$(( timeout - 1 ))
54 done
55 if [ $timeout -le 0 ]; then
56 return 1
57 fi
58 end=`date +%s`
59 echo "🕐 $@ in `expr $end - $start` seconds"
60 mySleep 0.3
61}
62
63EXIT_CODE=0
64
65SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
66
67SERVER_PORT="4545"
68SERVER_URL=${1:-"127.0.0.1:$SERVER_PORT"}
69SERVER_DATA_DIR="/tmp/gitrootData"
70
71ROOT_REPO_NAME="root"
72ROOT_REPO_URL="ssh://user@${SERVER_URL}/${ROOT_REPO_NAME}"
73REPO1_NAME="repo1"
74REPO1_URL="ssh://user@${SERVER_URL}/${REPO1_NAME}"
75REPO2_NAME="repo2"
76REPO2_URL="ssh://user@${SERVER_URL}/${REPO2_NAME}"
77REPO3_NAME="repo3"
78REPO3_URL="ssh://user@${SERVER_URL}/${REPO3_NAME}"
79
80SSH_KEY="${SCRIPT_DIR}/user1/ed25519"
81SSH_KEY2="${SCRIPT_DIR}/user2/ed25519"
82
83##### clean
84report "🏁 clean"
85
86cd /tmp
87rm -rf ${SERVER_DATA_DIR}
88rm -rf ${ROOT_REPO_NAME}
89rm -rf ${ROOT_REPO_NAME}_2
90rm -rf ${REPO1_NAME}
91rm -rf ${REPO2_NAME}
92rm -rf ${REPO1_NAME}_2
93rm -rf ${REPO2_NAME}_2
94rm -rf ${REPO3_NAME}
95rm -f /tmp/mylog.txt
96APP=$(lsof -i tcp:${SERVER_PORT} | awk 'NR!=1 {print $2}')
97if [ -z "$APP" ]; then
98 report "🟢 Gitroot not launched"
99else
100 kill ${APP}
101 report "🟢 Gitroot killed"
102fi
103ssh-keygen -f "$HOME/.ssh/known_hosts" -R "[127.0.0.1]:$SERVER_PORT"
104
105##### launch gitroot
106report "🏁 launch gitroot"
107
108cd ${SCRIPT_DIR}/../server
109GIT_TRACE_PACKET=false go run -race . -data="${SERVER_DATA_DIR}" &>> /tmp/mylog.txt &
110
111wait_for "starting SSH server on" /tmp/mylog.txt
112
113##### forgeConfig
114report "🏁 forgeConfig"
115
116cd /tmp
117quiet_git clone --quiet -c "core.sshCommand=ssh -i ${SSH_KEY} -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new" ${ROOT_REPO_URL}
118cd ${ROOT_REPO_NAME}
119.gitroot/init.sh --pubKey "${SSH_KEY}.pub" --privKey "${SSH_KEY}" --email forgeConfig@gitroot.dev --name forgeConfig >> /tmp/mylog.txt
120
121##### install hop plugin
122report "🏁 hop plugin"
123
124cd /tmp/${ROOT_REPO_NAME}
125sed -i -e 's/enabled: false/enabled: true/' .gitroot/forgeConfig.yml
126sed -i '0,/enabled: true/s//enabled: false/' .gitroot/forgeConfig.yml
127sed -i '0,/enabled: true/s//enabled: false/' .gitroot/forgeConfig.yml
128echo "- url: '${SCRIPT_DIR}/../plugins/grafter/grafter-0.0.3.wasm'" >> .gitroot/plugins.yml
129echo "- url: '${SCRIPT_DIR}/../plugins/hop/hop-0.0.1.wasm'" >> .gitroot/plugins.yml
130quiet_git add .
131quiet_git commit -m "init bwrap executor and hop plugin"
132quiet_git push origin main
133
134wait_ls "${SERVER_DATA_DIR}/data/plugins/hop"
135wait_ls "${SERVER_DATA_DIR}/data/plugins/grafter"
136
137##### stop and start gitroot for new conf
138report "🏁 restart gitroot"
139APP=$(lsof -i tcp:${SERVER_PORT} | awk 'NR!=1 {print $2}')
140kill ${APP}
141rm -f /tmp/mylog.txt
142
143cd ${SCRIPT_DIR}/../server
144GIT_TRACE_PACKET=false go run -race . -data="${SERVER_DATA_DIR}" &>> /tmp/mylog.txt &
145
146wait_for "starting SSH server on" /tmp/mylog.txt
147
148report "🏁 commit"
149
150cd /tmp/${ROOT_REPO_NAME}
151quiet_git pull origin main
152
153sed -i -e 's/active: false/active: true/g' .gitroot/plugins.yml
154quiet_git add .
155quiet_git commit -m "active hop & grafter plugin"
156quiet_git push origin main
157
158mySleep 0.8
159
160quiet_git pull origin main
161
162quiet_git checkout -b testReport
163
164for (( i=0; i<1; i++ ))
165do
166 for (( j=0; j<=10; j++ ))
167 do
168 echo "Change $j" > README.md
169 quiet_git add .
170 quiet_git commit -m "change $i :: $j\\n- first\\n- second"
171 done
172 quiet_git push origin testReport
173done
174
175mySleep 0.5
176
177quiet_git pull origin testReport
178
179cat grafts/testReport.md