Update check-example-sync-conflict.yml #6
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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="<!-- docs-sync-conflict-check -->" | ||
| 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="${MARKER} | ||
| ⚠️ **Potential sync conflict detected** | ||
| This PR modifies example tutorial files that are also modified in open sync PR(s) on \`cosmos/example\`: | ||
| ${SYNC_PR_LINKS} | ||
| **Overlapping files:** | ||
| ${OVERLAP_LIST} | ||
| These files are kept in sync between the two repos. Merging this PR before the sync PR is resolved may cause conflicts. Please coordinate with the sync PR author or wait until it is merged first." | ||
| # Update existing comment or post a new one | ||
| 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="$COMMENT_BODY" | ||
| echo "Updated existing warning comment." | ||
| else | ||
| gh pr comment "$PR_NUMBER" --repo cosmos/docs --body "$COMMENT_BODY" | ||
| echo "Posted new warning comment." | ||
| fi | ||