| 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); |
|
|