Comment with mypy_primer diff #643
This file contains 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
# This workflow runs when the "Run mypy_primer on PR" workflow completes. | |
# It downloads the diff from the other workflow instances and creates | |
# a summary comment in the PR. | |
name: Comment with mypy_primer diff | |
on: | |
workflow_run: | |
workflows: | |
- Run mypy_primer on PR | |
types: | |
- completed | |
permissions: | |
contents: read | |
pull-requests: write | |
jobs: | |
comment: | |
name: Comment PR from mypy_primer | |
runs-on: ubuntu-latest | |
if: ${{ github.event.workflow_run.conclusion == 'success' }} | |
steps: | |
- name: Download diffs | |
uses: actions/github-script@v7 | |
with: | |
script: | | |
const fs = require('fs'); | |
const artifacts = await github.rest.actions.listWorkflowRunArtifacts({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
run_id: ${{ github.event.workflow_run.id }}, | |
}); | |
const matchedArtifacts = artifacts.data.artifacts.filter((artifact) => | |
artifact.name.startsWith("mypy_primer_diffs")); | |
for (let i = 0; i < matchedArtifacts.length; i++) { | |
const matchArtifact = matchedArtifacts[i]; | |
const download = await github.rest.actions.downloadArtifact({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
artifact_id: matchArtifact.id, | |
archive_format: "zip", | |
}); | |
fs.writeFileSync(`diff_${i}.zip`, Buffer.from(download.data)); | |
} | |
- run: unzip diff_\*.zip | |
- run: | | |
cat diff_*.txt | tee fulldiff.txt | |
- name: Post comment | |
id: post-comment | |
uses: actions/github-script@v7 | |
with: | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
script: | | |
const MAX_CHARACTERS = 30000 | |
const MAX_CHARACTERS_PER_PROJECT = MAX_CHARACTERS / 3 | |
const fs = require('fs') | |
let data = fs.readFileSync('fulldiff.txt', { encoding: 'utf8' }) | |
function truncateIfNeeded(original, maxLength) { | |
if (original.length <= maxLength) { | |
return original | |
} | |
let truncated = original.substring(0, maxLength) | |
// further, remove last line that might be truncated | |
truncated = truncated.substring(0, truncated.lastIndexOf('\n')) | |
let lines_truncated = original.split('\n').length - truncated.split('\n').length | |
return `${truncated}\n\n... (truncated ${lines_truncated} lines) ...` | |
} | |
const projects = data.split('\n\n') | |
// don't let one project dominate | |
data = projects.map(project => truncateIfNeeded(project, MAX_CHARACTERS_PER_PROJECT)).join('\n\n') | |
// posting comment fails if too long, so truncate | |
data = truncateIfNeeded(data, MAX_CHARACTERS) | |
console.log("Diff from mypy_primer:") | |
console.log(data) | |
let body | |
if (data.trim()) { | |
body = 'Diff from [mypy_primer](https://github.com/hauntsaninja/mypy_primer), showing the effect of this PR on open source code:\n```diff\n' + data + '```' | |
} else { | |
body = "According to [mypy_primer](https://github.com/hauntsaninja/mypy_primer), this change doesn't affect type check results on a corpus of open source code. ✅" | |
} | |
const prNumber = parseInt(fs.readFileSync("pr_number.txt", { encoding: "utf8" })) | |
await github.rest.issues.createComment({ | |
issue_number: prNumber, | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
body | |
}) | |
return prNumber | |
- name: Hide old comments | |
# v0.4.0 | |
uses: kanga333/comment-hider@c12bb20b48aeb8fc098e35967de8d4f8018fffdf | |
with: | |
github_token: ${{ secrets.GITHUB_TOKEN }} | |
leave_visible: 1 | |
issue_number: ${{ steps.post-comment.outputs.result }} |