Add Section 0 projection wait helper
This commit is contained in:
@@ -7,6 +7,7 @@ COMMAND_DIR="${COMMAND_DIR:-$HOME/.local/bin}"
|
|||||||
COMMAND_NAME="${COMMAND_NAME:-section0-docs}"
|
COMMAND_NAME="${COMMAND_NAME:-section0-docs}"
|
||||||
COMMAND_PATH="$COMMAND_DIR/$COMMAND_NAME"
|
COMMAND_PATH="$COMMAND_DIR/$COMMAND_NAME"
|
||||||
SERVER_URL="${SECTION0_SERVER_URL:-https://ops.virgil.info/md-to-section0-api}"
|
SERVER_URL="${SECTION0_SERVER_URL:-https://ops.virgil.info/md-to-section0-api}"
|
||||||
|
STATUS_URL="${SECTION0_STATUS_URL:-https://ops.virgil.info/section0/projection-status.json}"
|
||||||
|
|
||||||
step() {
|
step() {
|
||||||
printf "\n==> %s\n" "$*"
|
printf "\n==> %s\n" "$*"
|
||||||
@@ -39,6 +40,7 @@ set -eu
|
|||||||
|
|
||||||
REPO_DIR="$TARGET_DIR"
|
REPO_DIR="$TARGET_DIR"
|
||||||
SERVER_URL="$SERVER_URL"
|
SERVER_URL="$SERVER_URL"
|
||||||
|
STATUS_URL="$STATUS_URL"
|
||||||
SESSION_DIR="\${SECTION0_SESSION_DIR:-\$HOME/.config/section0-docs}"
|
SESSION_DIR="\${SECTION0_SESSION_DIR:-\$HOME/.config/section0-docs}"
|
||||||
SESSION_PATH="\$SESSION_DIR/session.json"
|
SESSION_PATH="\$SESSION_DIR/session.json"
|
||||||
EVENTS_PATH="\$SESSION_DIR/events.jsonl"
|
EVENTS_PATH="\$SESSION_DIR/events.jsonl"
|
||||||
@@ -58,6 +60,7 @@ Commands:
|
|||||||
status show Git status
|
status show Git status
|
||||||
commit commit all current changes with MESSAGE
|
commit commit all current changes with MESSAGE
|
||||||
push push current branch
|
push push current branch
|
||||||
|
wait wait for a pushed commit to reach AFFiNE
|
||||||
push-test prove write access with a temporary remote branch
|
push-test prove write access with a temporary remote branch
|
||||||
trace show local/origin state and recent helper events
|
trace show local/origin state and recent helper events
|
||||||
help show this help
|
help show this help
|
||||||
@@ -74,6 +77,7 @@ Examples:
|
|||||||
section0-docs trace
|
section0-docs trace
|
||||||
MESSAGE="Update concept notes" section0-docs commit
|
MESSAGE="Update concept notes" section0-docs commit
|
||||||
section0-docs push
|
section0-docs push
|
||||||
|
section0-docs wait
|
||||||
|
|
||||||
AFFiNE is read-only for these docs. Make lasting changes in Markdown; the
|
AFFiNE is read-only for these docs. Make lasting changes in Markdown; the
|
||||||
AFFiNE copies are refreshed from Git.
|
AFFiNE copies are refreshed from Git.
|
||||||
@@ -147,6 +151,54 @@ http_json() {
|
|||||||
curl --connect-timeout 5 --max-time 15 -fsS "\$@"
|
curl --connect-timeout 5 --max-time 15 -fsS "\$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
projection_status() {
|
||||||
|
http_json "\$STATUS_URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_projection() {
|
||||||
|
expected="\${1:-}"
|
||||||
|
[ -n "\$expected" ] || expected="\$(git -C "\$REPO_DIR" rev-parse --short HEAD)"
|
||||||
|
timeout_seconds="\${SECTION0_WAIT_TIMEOUT_SECONDS:-180}"
|
||||||
|
started_at="\$(date +%s)"
|
||||||
|
echo "Waiting for AFFiNE projection:"
|
||||||
|
echo " commit: \$expected"
|
||||||
|
echo " status: \$STATUS_URL"
|
||||||
|
while :; do
|
||||||
|
status_json="\$(projection_status 2>/dev/null || true)"
|
||||||
|
if [ -n "\$status_json" ]; then
|
||||||
|
state="\$(printf "%s" "\$status_json" | json_get state 2>/dev/null || true)"
|
||||||
|
origin_commit="\$(printf "%s" "\$status_json" | json_get source.originCommit 2>/dev/null || true)"
|
||||||
|
projected_commit="\$(printf "%s" "\$status_json" | json_get projected.commit 2>/dev/null || true)"
|
||||||
|
completed_at="\$(printf "%s" "\$status_json" | json_get projected.completedAt 2>/dev/null || true)"
|
||||||
|
readme_url="\$(printf "%s" "\$status_json" | python3 -c 'import json,sys
|
||||||
|
data=json.load(sys.stdin)
|
||||||
|
for doc in (data.get("projected") or {}).get("docs") or []:
|
||||||
|
if doc.get("sourcePath") == "README.md":
|
||||||
|
print(doc.get("url",""))
|
||||||
|
break' 2>/dev/null || true)"
|
||||||
|
printf " origin=%s projected=%s state=%s%s\n" "\${origin_commit:-unknown}" "\${projected_commit:-none}" "\${state:-unknown}" "\${completed_at:+ completed=\$completed_at}"
|
||||||
|
if [ "\$projected_commit" = "\$expected" ]; then
|
||||||
|
echo "Projected and verified in AFFiNE."
|
||||||
|
[ -z "\$readme_url" ] || echo "Doc: \$readme_url"
|
||||||
|
echo "If a browser tab still shows old content, reload the AFFiNE tab or open the doc URL in a fresh tab."
|
||||||
|
json_log "wait.complete" "\$expected"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " projection status not reachable yet"
|
||||||
|
fi
|
||||||
|
now="\$(date +%s)"
|
||||||
|
elapsed=\$((now - started_at))
|
||||||
|
if [ "\$elapsed" -ge "\$timeout_seconds" ]; then
|
||||||
|
echo "Timed out after \${timeout_seconds}s waiting for projection of \$expected." >&2
|
||||||
|
echo "Run again later: section0-docs wait" >&2
|
||||||
|
json_log "wait.timeout" "\$expected"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
sleep "\${SECTION0_WAIT_INTERVAL_SECONDS:-5}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
install_git_credential() {
|
install_git_credential() {
|
||||||
remote="\$1"
|
remote="\$1"
|
||||||
username="\$2"
|
username="\$2"
|
||||||
@@ -364,7 +416,15 @@ case "\${1:-help}" in
|
|||||||
origin_head="\$(git -C "\$REPO_DIR" rev-parse --short origin/main 2>/dev/null || true)"
|
origin_head="\$(git -C "\$REPO_DIR" rev-parse --short origin/main 2>/dev/null || true)"
|
||||||
json_log "push.complete" "\${origin_head:-\$before}"
|
json_log "push.complete" "\${origin_head:-\$before}"
|
||||||
echo "Pushed commit: \${origin_head:-\$before}"
|
echo "Pushed commit: \${origin_head:-\$before}"
|
||||||
echo "AFFiNE updates after the operator refresh runs."
|
if [ "\${SECTION0_WAIT_AFTER_PUSH:-1}" = "1" ]; then
|
||||||
|
wait_for_projection "\${origin_head:-\$before}"
|
||||||
|
else
|
||||||
|
echo "AFFiNE updates after the operator refresh runs."
|
||||||
|
echo "To watch it: section0-docs wait"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
wait)
|
||||||
|
wait_for_projection "\${2:-}"
|
||||||
;;
|
;;
|
||||||
push-test)
|
push-test)
|
||||||
branch="section0-smoke-\${USER:-user}-\$(date +%Y%m%d%H%M%S)"
|
branch="section0-smoke-\${USER:-user}-\$(date +%Y%m%d%H%M%S)"
|
||||||
@@ -376,6 +436,7 @@ case "\${1:-help}" in
|
|||||||
trace)
|
trace)
|
||||||
echo "Repo: \$REPO_DIR"
|
echo "Repo: \$REPO_DIR"
|
||||||
echo "Remote: \$(git -C "\$REPO_DIR" remote get-url origin)"
|
echo "Remote: \$(git -C "\$REPO_DIR" remote get-url origin)"
|
||||||
|
echo "Projection status: \$STATUS_URL"
|
||||||
echo "Branch: \$(git -C "\$REPO_DIR" branch --show-current)"
|
echo "Branch: \$(git -C "\$REPO_DIR" branch --show-current)"
|
||||||
echo "Local HEAD: \$(git -C "\$REPO_DIR" rev-parse --short HEAD)"
|
echo "Local HEAD: \$(git -C "\$REPO_DIR" rev-parse --short HEAD)"
|
||||||
git -C "\$REPO_DIR" fetch origin >/dev/null 2>&1 || true
|
git -C "\$REPO_DIR" fetch origin >/dev/null 2>&1 || true
|
||||||
@@ -416,12 +477,14 @@ Daily flow:
|
|||||||
$COMMAND_NAME status
|
$COMMAND_NAME status
|
||||||
MESSAGE="Update docs" $COMMAND_NAME commit
|
MESSAGE="Update docs" $COMMAND_NAME commit
|
||||||
$COMMAND_NAME push
|
$COMMAND_NAME push
|
||||||
|
$COMMAND_NAME wait
|
||||||
|
|
||||||
Contributor setup:
|
Contributor setup:
|
||||||
$COMMAND_NAME configure
|
$COMMAND_NAME configure
|
||||||
$COMMAND_NAME push-test
|
$COMMAND_NAME push-test
|
||||||
|
|
||||||
AFFiNE updates after the Markdown docs are refreshed from Git.
|
By default, push waits until the operator projection status says the commit has
|
||||||
|
been projected and verified in AFFiNE.
|
||||||
|
|
||||||
If $COMMAND_DIR is not on PATH, add this to your shell profile:
|
If $COMMAND_DIR is not on PATH, add this to your shell profile:
|
||||||
export PATH="$COMMAND_DIR:\$PATH"
|
export PATH="$COMMAND_DIR:\$PATH"
|
||||||
|
|||||||
Reference in New Issue
Block a user