|
name: Check issue template |
|
|
|
on: |
|
issues: |
|
types: [opened] |
|
|
|
jobs: |
|
check-template: |
|
runs-on: ubuntu-latest |
|
|
|
if: ${{ github.repository_owner == 'facebookresearch' }} |
|
steps: |
|
- uses: actions/checkout@v2 |
|
- uses: actions/github-script@v3 |
|
with: |
|
github-token: ${{secrets.GITHUB_TOKEN}} |
|
script: | |
|
// Arguments available: |
|
// - github: A pre-authenticated octokit/rest.js client |
|
// - context: An object containing the context of the workflow run |
|
// - core: A reference to the @actions/core package |
|
// - io: A reference to the @actions/io package |
|
const fs = require('fs'); |
|
const editDistance = require(`${process.env.GITHUB_WORKSPACE}/.github/workflows/levenshtein.js`).getEditDistance |
|
issue = await github.issues.get({ |
|
owner: context.issue.owner, |
|
repo: context.issue.repo, |
|
issue_number: context.issue.number, |
|
}); |
|
const hasLabel = issue.data.labels.length > 0; |
|
if (hasLabel || issue.state === "closed") { |
|
// don't require template on them |
|
core.debug("Issue " + issue.data.title + " was skipped."); |
|
return; |
|
} |
|
|
|
sameAsTemplate = function(filename, body) { |
|
let tmpl = fs.readFileSync(`.github/ISSUE_TEMPLATE/${filename}`, 'utf8'); |
|
tmpl = tmpl.toLowerCase().split("---").slice(2).join("").trim(); |
|
tmpl = tmpl.replace(/(\r\n|\n|\r)/gm, ""); |
|
let bodyr = body.replace(/(\r\n|\n|\r)/gm, ""); |
|
let dist = editDistance(tmpl, bodyr); |
|
return dist < 8; |
|
}; |
|
|
|
checkFail = async function(msg) { |
|
core.info("Processing '" + issue.data.title + "' with message: " + msg); |
|
await github.issues.addLabels({ |
|
owner: context.issue.owner, |
|
repo: context.issue.repo, |
|
issue_number: context.issue.number, |
|
labels: ["needs-more-info"], |
|
}); |
|
await github.issues.createComment({ |
|
owner: context.issue.owner, |
|
repo: context.issue.repo, |
|
issue_number: context.issue.number, |
|
body: msg, |
|
}); |
|
}; |
|
|
|
const body = issue.data.body.toLowerCase().trim(); |
|
|
|
if (sameAsTemplate("bugs.md", body) || sameAsTemplate("unexpected-problems-bugs.md", body)) { |
|
await checkFail(` |
|
We found that not enough information is provided about this issue. |
|
Please provide details following the [issue template](https://github.com/facebookresearch/detectron2/issues/new/choose).`) |
|
return; |
|
} |
|
|
|
const hasInstructions = body.indexOf("reproduce") != -1; |
|
const hasEnvironment = (body.indexOf("environment") != -1) || (body.indexOf("colab") != -1) || (body.indexOf("docker") != -1); |
|
if (hasInstructions && hasEnvironment) { |
|
core.debug("Issue " + issue.data.title + " follows template."); |
|
return; |
|
} |
|
|
|
let message = "You've chosen to report an unexpected problem or bug. Unless you already know the root cause of it, please include details about it by filling the [issue template](https://github.com/facebookresearch/detectron2/issues/new/choose).\n"; |
|
message += "The following information is missing: "; |
|
if (!hasInstructions) { |
|
message += "\"Instructions To Reproduce the Issue and __Full__ Logs\"; "; |
|
} |
|
if (!hasEnvironment) { |
|
message += "\"Your Environment\"; "; |
|
} |
|
await checkFail(message); |
|
|