Skip to content

github: add new checklist workflow #1

github: add new checklist workflow

github: add new checklist workflow #1

Workflow file for this run

name: Checklist
# Produce a list of things that need to be changed
# for the submission to align with CONTRIBUTING.md
on:
pull_request:
types: [ opened, reopened, edited, synchronize ]
permissions:
pull-requests: write
jobs:
checklist:
name: commit
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v7
with:
# An asynchronous javascript function
script: |
/*
* Github's API returns the results in pages of 30, so
* pass the function we want, along with it's arguments,
* to paginate() which will handle gathering all the results.
*/
const comments = await github.paginate(github.rest.issues.listComments, {
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number
});
const commits = await github.paginate(github.rest.pulls.listCommits, {
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number
});
let checklist = {};
let checklist_len = 0;
let comment_id = -1;
const msg_prefix = "Thank you for taking the time to contribute to FreeBSD!\n";
const addToChecklist = (msg, sha) => {
if (!checklist[msg]) {
checklist[msg] = [];
checklist_len++;
}
checklist[msg].push(sha);
}
for (const commit of commits) {
const sob_lines = commit.commit.message.match(/^[^\S\r\n]*signed-off-by:./gim);
if (sob_lines == null && !commit.commit.author.email.endsWith("FreeBSD.org"))
addToChecklist("Missing Signed-off-by lines", commit.sha);
else if (sob_lines != null) {
for (const line of sob_lines) {
if (!line.endsWith("Signed-off-by: "))
addToChecklist("Expected `Signed-off-by: `, got `" + line + "`", commit.sha);
}
}
if (commit.commit.author.email.includes("noreply"))
addToChecklist("Real email address is needed", commit.sha);
}
/* Check if we've commented before. */
for (const comment of comments) {
if (comment.user.login == "github-actions[bot]") {
comment_id = comment.id;
break;
}
}
if (checklist_len != 0) {
let msg = msg_prefix +
"There " + (checklist_len > 1 ? "are a few issues that need " : "is an issue that needs ") +
"to be fixed:\n";
let comment_func = comment_id == -1 ? github.rest.issues.createComment : github.rest.issues.updateComment;
/* Loop for each key in "checklist". */
for (const c in checklist)
msg += "- " + c + "<sup>" + checklist[c].join(", ") + "</sup>\n";
comment_func({
owner: context.repo.owner,
repo: context.repo.repo,
body: msg,
...(comment_id == -1 ? {issue_number: context.issue.number} : {comment_id: comment_id})
});
} else if (comment_id != -1) {
github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: comment_id,
body: msg_prefix + "All issues resolved."
});
}