name: Validate and auto-fix script formatting on: push: branches: - main pull_request_target: paths: - "**/*.sh" - "**/*.func" jobs: shfmt: name: Check and fix formatting runs-on: ubuntu-latest permissions: contents: write pull-requests: write steps: - name: Get pull request information if: github.event_name == 'pull_request_target' uses: actions/github-script@v7 id: pr with: script: | const { data: pullRequest } = await github.rest.pulls.get({ ...context.repo, pull_number: context.payload.pull_request.number, }); return pullRequest; - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 ref: ${{ github.event_name == 'pull_request_target' && fromJSON(steps.pr.outputs.result).merge_commit_sha || '' }} - name: Get changed files id: changed-files run: | if [ "${{ github.event_name }}" == "pull_request_target" ]; then echo "files=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ steps.pr.outputs.result && fromJSON(steps.pr.outputs.result).merge_commit_sha }} | grep -E '\.(sh|func)$' | xargs)" >> $GITHUB_OUTPUT else echo "files=$(git diff --name-only ${{ github.event.before }} ${{ github.event.after }} | grep -E '\.(sh|func)$' | xargs)" >> $GITHUB_OUTPUT fi - name: Set up Go if: steps.changed-files.outputs.files != '' uses: actions/setup-go@v5 - name: Install shfmt if: steps.changed-files.outputs.files != '' run: | go install mvdan.cc/sh/v3/cmd/shfmt@latest echo "$GOPATH/bin" >> $GITHUB_PATH - name: Fix formatting if: steps.changed-files.outputs.files != '' run: | shfmt -w ${{ steps.changed-files.outputs.files }} - name: Commit and push changes if: steps.changed-files.outputs.files != '' && github.event_name == 'pull_request_target' run: | git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git add ${{ steps.changed-files.outputs.files }} git commit -m "chore: auto-fix formatting issues" git push - name: Post comment with results if: always() && github.event_name == 'pull_request_target' uses: actions/github-script@v7 with: script: | const result = "${{ job.status }}" === "success" ? "success" : "failure"; const issueNumber = context.payload.pull_request ? context.payload.pull_request.number : null; const commentIdentifier = "validate-formatting"; let newCommentBody = `\n### Script Formatting Results\n\n`; if (result === "failure") { newCommentBody += `:x: Formatting issues were found and automatically fixed.\n`; } else { newCommentBody += `:rocket: All scripts are properly formatted!\n`; } newCommentBody += `\n\n`; if (issueNumber) { const { data: comments } = await github.rest.issues.listComments({ ...context.repo, issue_number: issueNumber, }); const existingComment = comments.find( (comment) => comment.user.login === "github-actions[bot]" && comment.body.includes(commentIdentifier) ); if (existingComment) { await github.rest.issues.updateComment({ ...context.repo, comment_id: existingComment.id, body: newCommentBody, }); } else { await github.rest.issues.createComment({ ...context.repo, issue_number: issueNumber, body: newCommentBody, }); }