diff --git a/.github/workflows/check-example-sync-conflict.yml b/.github/workflows/check-example-sync-conflict.yml new file mode 100644 index 00000000..b55fb9b0 --- /dev/null +++ b/.github/workflows/check-example-sync-conflict.yml @@ -0,0 +1,127 @@ +name: Check for example tutorial sync conflicts + +# When a PR touches sdk/next/tutorials/example/, check if any open docs-sync +# PRs on cosmos/example modify the same files. If so, post or update a warning +# comment on this PR. + +on: + pull_request: + paths: + - "sdk/next/tutorials/example/**" + +jobs: + check-conflict: + name: Check for open sync PR conflict + runs-on: ubuntu-latest + permissions: + pull-requests: write + + steps: + - name: Check for conflicting sync PR on cosmos/example + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + EXAMPLE_TOKEN: ${{ secrets.EXAMPLE_REPO_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + # Get files changed in this PR that are in the tutorials folder + THIS_PR_FILES=$(gh pr view "$PR_NUMBER" \ + --repo cosmos/docs \ + --json files \ + --jq '[.files[].path | select(startswith("sdk/next/tutorials/example/"))] | sort') + + echo "Files changed in this PR: $THIS_PR_FILES" + + # Get all open docs-sync PRs on cosmos/example (use cross-repo PAT) + SYNC_PRS=$(GH_TOKEN="$EXAMPLE_TOKEN" gh pr list \ + --repo cosmos/example \ + --label "docs-sync" \ + --state open \ + --json number,url) + + echo "Open sync PRs: $SYNC_PRS" + + if [ "$SYNC_PRS" = "[]" ] || [ -z "$SYNC_PRS" ]; then + echo "No open sync PRs on cosmos/example, all clear." + exit 0 + fi + + # Collect all files from all open sync PRs, mapped to docs site paths + ALL_SYNC_FILES="[]" + SYNC_PR_URLS="" + + while IFS= read -r pr; do + SYNC_PR_NUMBER=$(echo "$pr" | jq -r '.number') + SYNC_PR_URL=$(echo "$pr" | jq -r '.url') + SYNC_PR_URLS="$SYNC_PR_URLS $SYNC_PR_URL" + + SYNC_FILES=$(GH_TOKEN="$EXAMPLE_TOKEN" gh pr view "$SYNC_PR_NUMBER" \ + --repo cosmos/example \ + --json files \ + --jq '[.files[].path + | select(startswith("docs/")) + | sub("^docs/([0-9]+-)?"; "sdk/next/tutorials/example/") + | sub("\\.md$"; ".mdx") + ] | sort') + + ALL_SYNC_FILES=$(jq -n \ + --argjson a "$ALL_SYNC_FILES" \ + --argjson b "$SYNC_FILES" \ + '$a + $b | unique | sort') + done < <(echo "$SYNC_PRS" | jq -c '.[]') + + echo "All sync PR files (mapped): $ALL_SYNC_FILES" + + # Find overlapping files + OVERLAP=$(jq -n \ + --argjson a "$THIS_PR_FILES" \ + --argjson b "$ALL_SYNC_FILES" \ + '[$a[], $b[]] | group_by(.) | map(select(length > 1)) | map(.[0])') + + echo "Overlapping files: $OVERLAP" + + MARKER="" + + if [ "$OVERLAP" = "[]" ] || [ -z "$OVERLAP" ]; then + echo "No overlapping files, all clear." + # If a previous warning comment exists, update it to say all clear + EXISTING_COMMENT=$(gh api "repos/cosmos/docs/issues/$PR_NUMBER/comments" \ + --jq ".[] | select(.body | contains(\"$MARKER\")) | .id" | head -1) + if [ -n "$EXISTING_COMMENT" ]; then + gh api "repos/cosmos/docs/issues/comments/$EXISTING_COMMENT" \ + -X PATCH \ + -f body="$MARKER + ✅ **Sync conflict resolved** — no overlapping files with open sync PRs on \`cosmos/example\`." + fi + exit 0 + fi + + OVERLAP_LIST=$(echo "$OVERLAP" | jq -r '.[] | "- `\(.)`"') + SYNC_PR_LINKS=$(echo "$SYNC_PR_URLS" | tr ' ' '\n' | grep -v '^$' | sed 's/^/- /') + + COMMENT_BODY=$(cat <