diff --git a/.github/workflows/typing_conformance_comment.yaml b/.github/workflows/typing_conformance_comment.yaml new file mode 100644 index 0000000000..ce069744f1 --- /dev/null +++ b/.github/workflows/typing_conformance_comment.yaml @@ -0,0 +1,97 @@ +name: PR comment (typing_conformance) + +on: # zizmor: ignore[dangerous-triggers] + workflow_run: + workflows: [Run typing conformance] + types: [completed] + workflow_dispatch: + inputs: + workflow_run_id: + description: The typing_conformance workflow that triggers the workflow run + required: true + +jobs: + comment: + runs-on: ubuntu-24.04 + permissions: + pull-requests: write + steps: + - uses: dawidd6/action-download-artifact@20319c5641d495c8a52e688b7dc5fada6c3a9fbc # v8 + name: Download PR number + with: + name: pr-number + run_id: ${{ github.event.workflow_run.id || github.event.inputs.workflow_run_id }} + if_no_artifact_found: ignore + allow_forks: true + + - name: Parse pull request number + id: pr-number + run: | + if [[ -f pr-number ]] + then + echo "pr-number=$(> "$GITHUB_OUTPUT" + fi + + - uses: dawidd6/action-download-artifact@20319c5641d495c8a52e688b7dc5fada6c3a9fbc # v8 + name: "Download typing_conformance results" + id: download-typing_conformance_diff + if: steps.pr-number.outputs.pr-number + with: + name: typing_conformance_diagnostics_diff + workflow: typing_conformance.yaml + pr: ${{ steps.pr-number.outputs.pr-number }} + path: pr/typing_conformance_diagnostics_diff + workflow_conclusion: completed + if_no_artifact_found: ignore + allow_forks: true + + - name: Generate comment content + id: generate-comment + if: ${{ steps.download-typing_conformance_diff.outputs.found_artifact == 'true' }} + run: | + # Guard against malicious typing_conformance results that symlink to a secret + # file on this runner + if [[ -L pr/typing_conformance_diagnostics_diff/typing_conformance_diagnostics.diff ]] + then + echo "Error: typing_conformance_diagnostics.diff cannot be a symlink" + exit 1 + fi + + # Note this identifier is used to find the comment to update on + # subsequent runs + echo '' >> comment.txt + + echo '## Diagnostic diff on typing conformance tests' >> comment.txt + if [ -s "pr/typing_conformance_diagnostics_diff/typing_conformance_diagnostics.diff" ]; then + echo '
' >> comment.txt + echo 'Changes were detected when running ty on typing conformance tests' >> comment.txt + echo '' >> comment.txt + echo '```diff' >> comment.txt + cat pr/typing_conformance_diagnostics_diff/typing_conformance_diagnostics.diff >> comment.txt + echo '```' >> comment.txt + echo '
' >> comment.txt + else + echo 'No changes detected when running ty on typing conformance tests ✅' >> comment.txt + fi + + echo 'comment<> "$GITHUB_OUTPUT" + cat comment.txt >> "$GITHUB_OUTPUT" + echo 'EOF' >> "$GITHUB_OUTPUT" + + - name: Find existing comment + uses: peter-evans/find-comment@3eae4d37986fb5a8592848f6a574fdf654e61f9e # v3.1.0 + if: steps.generate-comment.outcome == 'success' + id: find-comment + with: + issue-number: ${{ steps.pr-number.outputs.pr-number }} + comment-author: "github-actions[bot]" + body-includes: "" + + - name: Create or update comment + if: steps.find-comment.outcome == 'success' + uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + with: + comment-id: ${{ steps.find-comment.outputs.comment-id }} + issue-number: ${{ steps.pr-number.outputs.pr-number }} + body-path: comment.txt + edit-mode: replace