fix: update glossaries immutably in updateActiveGlossary #29324
Workflow file for this run
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
| # Copyright 2021 Collate | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| name: UI Checkstyle | |
| on: | |
| merge_group: | |
| pull_request_target: | |
| types: | |
| - opened | |
| - synchronize | |
| - reopened | |
| - ready_for_review | |
| - labeled | |
| paths: | |
| - "openmetadata-ui/src/main/resources/ui/**" | |
| - "openmetadata-spec/src/main/resources/json/schema/**" | |
| - ".github/workflows/ui-checkstyle.yml" | |
| - openmetadata-ui/src/main/resources/ui/playwright/** | |
| - openmetadata-ui/src/main/resources/ui/eslint.config.mjs | |
| - "openmetadata-ui-core-components/src/main/resources/ui/**" | |
| permissions: | |
| contents: read | |
| concurrency: | |
| group: ui-checkstyle-${{ github.head_ref || github.run_id }} | |
| cancel-in-progress: ${{ github.event_name != 'pull_request_target' || github.event.action != 'labeled' || github.event.label.name == 'safe to test' }} | |
| env: | |
| UI_WORKING_DIRECTORY: openmetadata-ui/src/main/resources/ui | |
| CORE_COMPONENTS_WORKING_DIRECTORY: openmetadata-ui-core-components/src/main/resources/ui | |
| jobs: | |
| # ────────────────────────────────────────────────────────────────────────── | |
| # Job 0: Authorize | |
| # ────────────────────────────────────────────────────────────────────────── | |
| authorize: | |
| if: | | |
| github.event_name == 'merge_group' || | |
| (github.event_name == 'pull_request_target' && | |
| (github.event.action != 'labeled' || github.event.label.name == 'safe to test')) | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Wait for the labeler | |
| uses: lewagon/wait-on-check-action@v1.7.0 | |
| if: ${{ github.event_name == 'pull_request_target' }} | |
| with: | |
| ref: ${{ github.event_name == 'merge_group' && github.sha || github.event.pull_request.head.sha }} | |
| check-name: Team Label | |
| repo-token: ${{ secrets.GITHUB_TOKEN }} | |
| wait-interval: 90 | |
| - name: Verify PR labels | |
| uses: jesusvasquez333/verify-pr-label-action@v1.4.0 | |
| if: ${{ github.event_name == 'pull_request_target' }} | |
| with: | |
| github-token: "${{ secrets.GITHUB_TOKEN }}" | |
| valid-labels: "safe to test" | |
| pull-request-number: "${{ github.event.pull_request.number }}" | |
| disable-reviews: true | |
| # ────────────────────────────────────────────────────────────────────────── | |
| # Common setup steps reused across all parallel check jobs via a shared | |
| # composite-like pattern: each job does its own checkout + yarn install | |
| # (fast due to yarn cache from actions/setup-node). | |
| # ────────────────────────────────────────────────────────────────────────── | |
| # ────────────────────────────────────────────────────────────────────────── | |
| # Job 1: Lint — ESLint + Prettier + Organise Imports (src) | |
| # ────────────────────────────────────────────────────────────────────────── | |
| lint-src: | |
| needs: authorize | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| outputs: | |
| changed_files: ${{ steps.lint.outputs.changed_files }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.event_name == 'merge_group' && github.sha || github.event.pull_request.head.sha }} | |
| fetch-depth: 0 | |
| filter: blob:none | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version-file: "${{ env.UI_WORKING_DIRECTORY }}/.nvmrc" | |
| cache: yarn | |
| cache-dependency-path: "${{ env.UI_WORKING_DIRECTORY }}/yarn.lock" | |
| - name: Install Antlr4 CLI | |
| run: sudo make install_antlr_cli | |
| - name: Install Yarn Packages | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| run: yarn install --frozen-lockfile | |
| - name: Get changed src files | |
| id: changed-files | |
| uses: tj-actions/changed-files@22103cc46bda19c2b464ffe86db46df6922fd323 | |
| with: | |
| path: ${{ env.UI_WORKING_DIRECTORY }} | |
| files_ignore: | | |
| src/generated/** | |
| files: | | |
| src/**/*.{ts,tsx,js,jsx,json} | |
| - name: ESLint + Prettier + Organise Imports | |
| id: lint | |
| if: steps.changed-files.outputs.any_changed == 'true' | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| env: | |
| CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} | |
| run: | | |
| if [ -z "$CHANGED_FILES" ]; then | |
| echo "No added or modified files to process." | |
| exit 0 | |
| fi | |
| TS_FILES=$(echo "$CHANGED_FILES" | tr ' ' '\n' | awk '/\.(ts|tsx|js|jsx)$/ { printf "%s ", $0 }') | |
| if [ -n "$TS_FILES" ]; then | |
| yarn organize-imports:cli $TS_FILES | |
| fi | |
| yarn lint:base --fix $CHANGED_FILES | |
| yarn pretty:base --write $CHANGED_FILES | |
| if [ -n "$(git status --porcelain)" ]; then | |
| FILES=$(git status --porcelain | awk '{print " - `" $2 "`"}' | head -30) | |
| echo "changed_files<<EOF" >> "$GITHUB_OUTPUT" | |
| echo "$FILES" >> "$GITHUB_OUTPUT" | |
| echo "EOF" >> "$GITHUB_OUTPUT" | |
| git checkout -- . | |
| git clean -fd | |
| exit 1 | |
| fi | |
| # ────────────────────────────────────────────────────────────────────────── | |
| # Job 2: Licence Header Check (all changed files) | |
| # ────────────────────────────────────────────────────────────────────────── | |
| license-header: | |
| needs: authorize | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| outputs: | |
| changed_files: ${{ steps.license.outputs.changed_files }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.event_name == 'merge_group' && github.sha || github.event.pull_request.head.sha }} | |
| fetch-depth: 0 | |
| filter: blob:none | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version-file: "${{ env.UI_WORKING_DIRECTORY }}/.nvmrc" | |
| cache: yarn | |
| cache-dependency-path: "${{ env.UI_WORKING_DIRECTORY }}/yarn.lock" | |
| - name: Install Antlr4 CLI | |
| run: sudo make install_antlr_cli | |
| - name: Install Yarn Packages | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| run: yarn install --frozen-lockfile | |
| - name: Get all changed files | |
| id: changed-files | |
| uses: tj-actions/changed-files@22103cc46bda19c2b464ffe86db46df6922fd323 | |
| with: | |
| path: ${{ env.UI_WORKING_DIRECTORY }} | |
| - name: Licence Header Check | |
| id: license | |
| if: steps.changed-files.outputs.any_changed == 'true' | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| env: | |
| CHANGED_FILES_ALL: ${{ steps.changed-files.outputs.all_changed_files }} | |
| run: | | |
| if [ -z "$CHANGED_FILES_ALL" ]; then | |
| echo "No added or modified files to process." | |
| exit 0 | |
| fi | |
| yarn license-header-fix $CHANGED_FILES_ALL | |
| if [ -n "$(git status --porcelain)" ]; then | |
| FILES=$(git status --porcelain | awk '{print " - `" $2 "`"}' | head -30) | |
| echo "changed_files<<EOF" >> "$GITHUB_OUTPUT" | |
| echo "$FILES" >> "$GITHUB_OUTPUT" | |
| echo "EOF" >> "$GITHUB_OUTPUT" | |
| git checkout -- . | |
| git clean -fd | |
| exit 1 | |
| fi | |
| # ────────────────────────────────────────────────────────────────────────── | |
| # Job 3: TypeScript Type Check (src) | |
| # ────────────────────────────────────────────────────────────────────────── | |
| tsc-src: | |
| needs: authorize | |
| if: false # TODO: re-enable once tsc errors are resolved | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.event_name == 'merge_group' && github.sha || github.event.pull_request.head.sha }} | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version-file: "${{ env.UI_WORKING_DIRECTORY }}/.nvmrc" | |
| cache: yarn | |
| cache-dependency-path: "${{ env.UI_WORKING_DIRECTORY }}/yarn.lock" | |
| - name: Install Antlr4 CLI | |
| run: sudo make install_antlr_cli | |
| - name: Install Yarn Packages | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| run: yarn install --frozen-lockfile | |
| - name: TypeScript Type Check (src) | |
| id: tsc | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| run: | | |
| if ! yarn tsc:check > /tmp/tsc_output.txt 2>&1; then | |
| ERRORS=$(head -50 /tmp/tsc_output.txt | sed 's/`/\`/g') | |
| echo "tsc_errors<<EOF" >> "$GITHUB_OUTPUT" | |
| echo "$ERRORS" >> "$GITHUB_OUTPUT" | |
| echo "EOF" >> "$GITHUB_OUTPUT" | |
| exit 1 | |
| fi | |
| # ────────────────────────────────────────────────────────────────────────── | |
| # Job 4: I18n Sync | |
| # ────────────────────────────────────────────────────────────────────────── | |
| i18n-sync: | |
| needs: authorize | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| outputs: | |
| changed_files: ${{ steps.i18n.outputs.changed_files }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.event_name == 'merge_group' && github.sha || github.event.pull_request.head.sha }} | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version-file: "${{ env.UI_WORKING_DIRECTORY }}/.nvmrc" | |
| cache: yarn | |
| cache-dependency-path: "${{ env.UI_WORKING_DIRECTORY }}/yarn.lock" | |
| - name: Install Antlr4 CLI | |
| run: sudo make install_antlr_cli | |
| - name: Install Yarn Packages | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| run: yarn install --frozen-lockfile | |
| - name: I18n Sync | |
| id: i18n | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| run: | | |
| yarn i18n | |
| if [ -n "$(git status --porcelain)" ]; then | |
| FILES=$(git status --porcelain | awk '{print " - `" $2 "`"}' | head -20) | |
| echo "changed_files<<EOF" >> "$GITHUB_OUTPUT" | |
| echo "$FILES" >> "$GITHUB_OUTPUT" | |
| echo "EOF" >> "$GITHUB_OUTPUT" | |
| git checkout -- . | |
| git clean -fd | |
| exit 1 | |
| fi | |
| # ────────────────────────────────────────────────────────────────────────── | |
| # Job 5: generate:app-docs | |
| # ────────────────────────────────────────────────────────────────────────── | |
| app-docs: | |
| needs: authorize | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| outputs: | |
| changed_files: ${{ steps.docs.outputs.changed_files }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.event_name == 'merge_group' && github.sha || github.event.pull_request.head.sha }} | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version-file: "${{ env.UI_WORKING_DIRECTORY }}/.nvmrc" | |
| cache: yarn | |
| cache-dependency-path: "${{ env.UI_WORKING_DIRECTORY }}/yarn.lock" | |
| - name: Install Antlr4 CLI | |
| run: sudo make install_antlr_cli | |
| - name: Install Yarn Packages | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| run: yarn install --frozen-lockfile | |
| - name: generate:app-docs | |
| id: docs | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| run: | | |
| yarn generate:app-docs | |
| if [ -n "$(git status --porcelain)" ]; then | |
| FILES=$(git status --porcelain | awk '{print " - `" $2 "`"}' | head -20) | |
| echo "changed_files<<EOF" >> "$GITHUB_OUTPUT" | |
| echo "$FILES" >> "$GITHUB_OUTPUT" | |
| echo "EOF" >> "$GITHUB_OUTPUT" | |
| git checkout -- . | |
| git clean -fd | |
| exit 1 | |
| fi | |
| # ────────────────────────────────────────────────────────────────────────── | |
| # Job 6: Playwright — ESLint + Prettier + Organise Imports | |
| # ────────────────────────────────────────────────────────────────────────── | |
| lint-playwright: | |
| needs: authorize | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| outputs: | |
| changed_files: ${{ steps.lint.outputs.changed_files }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.event_name == 'merge_group' && github.sha || github.event.pull_request.head.sha }} | |
| fetch-depth: 0 | |
| filter: blob:none | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version-file: "${{ env.UI_WORKING_DIRECTORY }}/.nvmrc" | |
| cache: yarn | |
| cache-dependency-path: "${{ env.UI_WORKING_DIRECTORY }}/yarn.lock" | |
| - name: Install Antlr4 CLI | |
| run: sudo make install_antlr_cli | |
| - name: Install Yarn Packages | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| run: yarn install --frozen-lockfile | |
| - name: Get changed Playwright files | |
| id: changed-files | |
| uses: tj-actions/changed-files@22103cc46bda19c2b464ffe86db46df6922fd323 | |
| with: | |
| path: ${{ env.UI_WORKING_DIRECTORY }} | |
| files_ignore: | | |
| playwright/test-data/** | |
| files: | | |
| playwright/**/*.{ts,tsx,js,jsx} | |
| - name: ESLint + Prettier + Organise Imports (playwright) | |
| id: lint | |
| if: steps.changed-files.outputs.any_changed == 'true' | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| env: | |
| CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} | |
| run: | | |
| if [ -z "$CHANGED_FILES" ]; then | |
| echo "No added or modified files to process." | |
| exit 0 | |
| fi | |
| yarn organize-imports:cli $CHANGED_FILES | |
| yarn lint:base --fix $CHANGED_FILES | |
| yarn pretty:base --write $CHANGED_FILES | |
| if [ -n "$(git status --porcelain)" ]; then | |
| FILES=$(git status --porcelain | awk '{print " - `" $2 "`"}' | head -30) | |
| echo "changed_files<<EOF" >> "$GITHUB_OUTPUT" | |
| echo "$FILES" >> "$GITHUB_OUTPUT" | |
| echo "EOF" >> "$GITHUB_OUTPUT" | |
| git checkout -- . | |
| git clean -fd | |
| exit 1 | |
| fi | |
| # ────────────────────────────────────────────────────────────────────────── | |
| # Job 7: Playwright — TypeScript Type Check | |
| # ────────────────────────────────────────────────────────────────────────── | |
| tsc-playwright: | |
| needs: authorize | |
| if: false # TODO: re-enable once playwright tsc errors are resolved | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.event_name == 'merge_group' && github.sha || github.event.pull_request.head.sha }} | |
| fetch-depth: 0 | |
| filter: blob:none | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version-file: "${{ env.UI_WORKING_DIRECTORY }}/.nvmrc" | |
| cache: yarn | |
| cache-dependency-path: "${{ env.UI_WORKING_DIRECTORY }}/yarn.lock" | |
| - name: Install Antlr4 CLI | |
| run: sudo make install_antlr_cli | |
| - name: Install Yarn Packages | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| run: yarn install --frozen-lockfile | |
| - name: Get changed Playwright files | |
| id: changed-files | |
| uses: tj-actions/changed-files@22103cc46bda19c2b464ffe86db46df6922fd323 | |
| with: | |
| path: ${{ env.UI_WORKING_DIRECTORY }} | |
| files_ignore: | | |
| playwright/test-data/** | |
| files: | | |
| playwright/**/*.{ts,tsx,js,jsx} | |
| - name: TypeScript Type Check (playwright) | |
| id: tsc | |
| working-directory: ${{ env.UI_WORKING_DIRECTORY }} | |
| run: | | |
| if [ -z "$CHANGED_FILES" ]; then | |
| echo "No added or modified files to process." | |
| exit 0 | |
| fi | |
| if ! yarn tsc:playwright > /tmp/tsc_output.txt 2>&1; then | |
| ERRORS=$(head -50 /tmp/tsc_output.txt | sed 's/`/\`/g') | |
| echo "tsc_errors<<EOF" >> "$GITHUB_OUTPUT" | |
| echo "$ERRORS" >> "$GITHUB_OUTPUT" | |
| echo "EOF" >> "$GITHUB_OUTPUT" | |
| exit 1 | |
| fi | |
| # ────────────────────────────────────────────────────────────────────────── | |
| # Job 8: Core Components — ESLint + Prettier | |
| # ────────────────────────────────────────────────────────────────────────── | |
| lint-core-components: | |
| needs: authorize | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| outputs: | |
| changed_files: ${{ steps.lint.outputs.changed_files }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.event_name == 'merge_group' && github.sha || github.event.pull_request.head.sha }} | |
| fetch-depth: 0 | |
| filter: blob:none | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version-file: "${{ env.CORE_COMPONENTS_WORKING_DIRECTORY }}/.nvmrc" | |
| cache: yarn | |
| cache-dependency-path: "${{ env.CORE_COMPONENTS_WORKING_DIRECTORY }}/yarn.lock" | |
| - name: Install Yarn Packages | |
| working-directory: ${{ env.CORE_COMPONENTS_WORKING_DIRECTORY }} | |
| run: yarn install --frozen-lockfile | |
| - name: Get changed core-components files | |
| id: changed-files | |
| uses: tj-actions/changed-files@22103cc46bda19c2b464ffe86db46df6922fd323 | |
| with: | |
| path: ${{ env.CORE_COMPONENTS_WORKING_DIRECTORY }} | |
| files: | | |
| src/**/*.{ts,tsx,js,jsx,json} | |
| - name: ESLint + Prettier (core-components) | |
| id: lint | |
| if: steps.changed-files.outputs.any_changed == 'true' | |
| working-directory: ${{ env.CORE_COMPONENTS_WORKING_DIRECTORY }} | |
| env: | |
| CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} | |
| run: | | |
| if [ -z "${CHANGED_FILES// }" ]; then | |
| echo "No added or modified files to process." | |
| exit 0 | |
| fi | |
| yarn lint:base --fix $CHANGED_FILES | |
| yarn pretty:base --write $CHANGED_FILES | |
| if [ -n "$(git status --porcelain)" ]; then | |
| FILES=$(git status --porcelain | awk '{print " - `" $2 "`"}' | head -30) | |
| echo "changed_files<<EOF" >> "$GITHUB_OUTPUT" | |
| echo "$FILES" >> "$GITHUB_OUTPUT" | |
| echo "EOF" >> "$GITHUB_OUTPUT" | |
| git checkout -- . | |
| git clean -fd | |
| exit 1 | |
| fi | |
| # ────────────────────────────────────────────────────────────────────────── | |
| # Job 9: Report — Post single consolidated summary comment | |
| # ────────────────────────────────────────────────────────────────────────── | |
| report: | |
| needs: [authorize, lint-src, license-header, i18n-sync, app-docs, lint-playwright, lint-core-components] | |
| if: ${{ always() && needs.authorize.result == 'success' && github.event_name == 'pull_request_target' }} | |
| runs-on: ubuntu-latest | |
| permissions: | |
| pull-requests: write | |
| steps: | |
| - name: Find existing summary comment | |
| uses: peter-evans/find-comment@v3 | |
| id: fc | |
| with: | |
| issue-number: ${{ github.event.pull_request.number }} | |
| comment-author: github-actions[bot] | |
| body-includes: '<!-- check:ui-checkstyle-summary -->' | |
| - name: Post or update summary comment | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const checks = [ | |
| { | |
| name: 'ESLint + Prettier + Organise Imports (src)', | |
| reason: 'One or more source files have linting or formatting issues.', | |
| result: '${{ needs.lint-src.result }}', | |
| files: ${{ toJSON(needs.lint-src.outputs.changed_files) }} || '', | |
| }, | |
| { | |
| name: 'Licence Header', | |
| reason: 'One or more files are missing or have an outdated Apache 2.0 licence header.', | |
| result: '${{ needs.license-header.result }}', | |
| files: ${{ toJSON(needs.license-header.outputs.changed_files) }} || '', | |
| }, | |
| { | |
| name: 'I18n Sync', | |
| reason: 'Translation locale files are out of sync with `en-us.json`.', | |
| result: '${{ needs.i18n-sync.result }}', | |
| files: ${{ toJSON(needs.i18n-sync.outputs.changed_files) }} || '', | |
| }, | |
| { | |
| name: 'App Docs', | |
| reason: 'Generated application docs are stale and need to be regenerated.', | |
| result: '${{ needs.app-docs.result }}', | |
| files: ${{ toJSON(needs.app-docs.outputs.changed_files) }} || '', | |
| }, | |
| { | |
| name: 'Playwright — ESLint + Prettier + Organise Imports', | |
| reason: 'One or more Playwright test files have linting or formatting issues.', | |
| result: '${{ needs.lint-playwright.result }}', | |
| files: ${{ toJSON(needs.lint-playwright.outputs.changed_files) }} || '', | |
| }, | |
| { | |
| name: 'Core Components — ESLint + Prettier', | |
| reason: 'One or more core-component files have linting or formatting issues.', | |
| result: '${{ needs.lint-core-components.result }}', | |
| files: ${{ toJSON(needs.lint-core-components.outputs.changed_files) }} || '', | |
| }, | |
| ]; | |
| const failures = checks.filter(c => c.result === 'failure'); | |
| const commentId = '${{ steps.fc.outputs.comment-id }}'; | |
| if (failures.length === 0) { | |
| if (commentId) { | |
| await github.rest.issues.deleteComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| comment_id: parseInt(commentId, 10), | |
| }); | |
| } | |
| return; | |
| } | |
| const sections = failures.map(c => { | |
| const lines = [`#### ❌ ${c.name}`, c.reason]; | |
| if (c.files && c.files.trim()) { | |
| lines.push('', '<details><summary>Affected files</summary>', '', c.files.trim(), '', '</details>'); | |
| } | |
| return lines.join('\n'); | |
| }); | |
| const body = [ | |
| '<!-- check:ui-checkstyle-summary -->', | |
| '### ❌ UI Checkstyle Failed', | |
| '', | |
| ...sections.flatMap(s => [s, '']), | |
| '---', | |
| '**Fix locally (fast — only checks files changed in this branch):**', | |
| '```bash', | |
| 'make ui-checkstyle-changed', | |
| '```', | |
| ].join('\n'); | |
| if (commentId) { | |
| await github.rest.issues.updateComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| comment_id: parseInt(commentId, 10), | |
| body, | |
| }); | |
| } else { | |
| await github.rest.issues.createComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: context.issue.number, | |
| body, | |
| }); | |
| } |