yuki / okibi
焚き火の仲間だけの自前Gitホスティング(このサイト自身)
#!/usr/bin/env bash
# End-to-end: magic-link login -> create repo -> issue PAT -> git push/pull.
set -uo pipefail
BASE="http://localhost:8799"
JAR=$(mktemp)
WORK=$(mktemp -d)
LOG="${OKIBI_LOG:-/tmp/okibi.log}"
EMAIL="yuki@hamada.tokyo"
HANDLE="yuki"
REPO="hello"
ok(){ echo "✅ $*"; }
die(){ echo "❌ $*"; exit 1; }
echo "== 1. health =="
curl -fsS "$BASE/healthz" >/dev/null && ok "health ok" || die "no server"
echo "== 2. non-member is rejected =="
curl -fsS -d "email=stranger@example.com" "$BASE/login" | grep -q "登録されていません" \
&& ok "stranger rejected" || die "stranger NOT rejected (membership gate broken!)"
echo "== 3. request magic link (member) =="
: > "$LOG.marker" 2>/dev/null || true
curl -fsS -c "$JAR" -d "email=$EMAIL" "$BASE/login" | grep -q "ログインリンク" || die "login submit failed"
sleep 0.5
LINK=$(grep -oE "$BASE/auth/verify\?token=[a-f0-9]+" "$LOG" | tail -1)
[ -n "$LINK" ] && ok "magic link issued" || die "no magic link in log"
echo "== 4. verify -> session =="
curl -fsS -c "$JAR" -b "$JAR" "$LINK" -o /dev/null && ok "verified, session set" || die "verify failed"
grep -q okibi_session "$JAR" || die "no session cookie"
echo "== 5. create repo =="
curl -fsS -c "$JAR" -b "$JAR" -d "name=$REPO&public=1" "$BASE/new" -o /dev/null && ok "repo created" || die "create failed"
echo "== 6. issue PAT =="
PAT=$(curl -fsS -c "$JAR" -b "$JAR" -d "name=e2e" "$BASE/settings/tokens" \
| grep -oE "okibi_[a-f0-9]+" | head -1)
[ -n "$PAT" ] && ok "PAT issued (${PAT:0:12}...)" || die "no PAT"
echo "== 7. git push =="
cd "$WORK"
git init -q -b main proj && cd proj
git config user.email t@t.io; git config user.name t
mkdir -p .okibi
printf 'echo "hello from CI"\nls -la\n' > .okibi/ci.sh
echo "# Hello Okibi" > README.md
git add -A && git commit -qm "first fire"
REMOTE="http://$HANDLE:$PAT@localhost:8799/$HANDLE/$REPO.git"
git push -q "$REMOTE" main 2>&1 && ok "push ok" || die "push failed"
echo "== 8. git clone back =="
cd "$WORK"
git clone -q "$REMOTE" cloned 2>&1 && [ -f cloned/README.md ] \
&& ok "clone ok, README present" || die "clone failed"
grep -q "Hello Okibi" cloned/README.md && ok "content matches" || die "content mismatch"
echo "== 9. unauthorized push is blocked =="
BADREMOTE="http://$HANDLE:okibi_deadbeef@localhost:8799/$HANDLE/$REPO.git"
if git -C "$WORK/proj" push -q "$BADREMOTE" main 2>/dev/null; then
die "bad PAT push SUCCEEDED (auth broken!)"
else
ok "bad PAT push rejected"
fi
echo "== 10. web tree shows file =="
curl -fsS "$BASE/$HANDLE/$REPO" | grep -q "README.md" && ok "README visible in web tree" || die "web tree missing file"
echo
echo "🔥 ALL E2E CHECKS PASSED"
rm -rf "$WORK" "$JAR"