bot: "webpack-bot"
rules:
  # Add ci-ok, ci-not-ok labels depending on travis status
  # comment to point the user to the results
  # comment in case of success
  - filters:
      open: true
      pull_request:
        mergeable: true
      status_1:
        context: "continuous-integration/travis-ci/pr"
      status_2:
        context: "continuous-integration/appveyor/pr"
      ensure_1:
        value: "{{status_1.state}}"
        equals: "success"
      ensure_2:
        value: "{{status_2.state}}"
        equals: "success"
    actions:
      label:
        add: "PR: CI-ok"
        remove: "PR: CI-not-ok"
      comment:
        identifier: "ci-result"
        message: |-
          Thank you for your pull request! The most important CI builds succeeded, we’ll review the pull request soon.
  - filters:
      open: true
      pull_request:
        mergeable: true
      status_1:
        context: "continuous-integration/travis-ci/pr"
      status_2:
        context: "continuous-integration/appveyor/pr"
      any:
        ensure_1:
          value: "{{status_1.state}}"
          equals: "failure"
        ensure_2:
          value: "{{status_2.state}}"
          equals: "failure"
      not:
        any:
          ensure_3:
            value: "{{status_1.state}}"
            equals: "pending"
          ensure_4:
            value: "{{status_2.state}}"
            equals: "pending"
    actions:
      label:
        add: "PR: CI-not-ok"
        remove: "PR: CI-ok"
      set:
        id: report_ci
        value: yep

  # Report specific error message if jest for basic tests fails
  - filters:
      ensure:
        value: "{{report_ci}}"
        equals: yep
      commit: true
      status:
        context: "continuous-integration/travis-ci/pr"
      travis_job:
        state: "failed"
        allow_failure: false
        config:
          env: JOB_PART=basic
      fetch: travis_job.log
      string_cleanup:
        id: logResult
        value: "{{{fetch}}}"
        remove:
          - ".\\[2K.\\[1G|.\\[999D.\\[K"
          - "^[\\s\\S]+?\\$ yarn travis:\\$JOB_PART.*\n"
          - "\\$ node --max-old-space-size=4096.*\n"
          - ".+rimraf coverage"
          - "yarn run.+\n"
          - "\\(node:\\d+\\) (\\[DEP0005\\]|DeprecationWarning).+\n"
          - "\\$ yarn (cover|test):.+\n"
          - "Ran all test suites.\n[\\s\\S]*"
          - "error Command failed with exit code \\d+.\n"
          - "info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.\n"
          - "Force exiting Jest\n\nHave you considered.+"
          - "=============================== Coverage summary ===============================[\\s\\S]+?================================================================================"
          - " *PASS *test/.*\n"
          - "^\\s+\n|\\s+$"
      string_cleanup_1:
        id: firstError
        value: "{{{logResult}}}"
        remove:
          - "\n\n(  ●| FAIL)[\\s\\S]*"
          - "Test Suites:[\\s\\S]*"
          - "\\s+$"
      string_cleanup_2:
        id: remainingErrors
        value: "{{{logResult}}}"
        remove:
          - "^[\\s\\S]+?(?=\n\n(  ●| FAIL)|$)"
          - "^\n+"
          - "Test Suites:[\\s\\S]*"
          - "\\s+$"
      string_cleanup_3:
        id: summary
        value: "{{{logResult}}}"
        remove:
          - "^[\\s\\S]+?(?=Test Suites:)"
          - "\\s+$"
    actions:
      comment:
        identifier: "ci-result"
        message: |-
          The basic integration tests failed.

          @{{commit.author.login}} Please review the following output log for errors:

          ```text
          {{{firstError}}}
          ```
          {{#if remainingErrors}}
          <details>
            <summary>Show remaining errors</summary>

          ```text
          {{{remainingErrors}}}
          ```
          </details>
          {{/if}}

          ```text
          {{{summary}}}
          ```

          See [complete report here]({{status.target_url}}).
      set:
        id: report_ci
        value: nope

  # Report specific error message if jest for integration tests fails
  - filters:
      ensure:
        value: "{{report_ci}}"
        equals: yep
      commit: true
      status:
        context: "continuous-integration/travis-ci/pr"
      travis_job:
        state: "failed"
        allow_failure: false
        config:
          env: JOB_PART=integration
      fetch: travis_job.log
      string_cleanup:
        id: logResult
        value: "{{{fetch}}}"
        remove:
          - ".\\[2K.\\[1G|.\\[999D.\\[K"
          - "^[\\s\\S]+?\\$ yarn travis:\\$JOB_PART.*\n"
          - "\\$ node --max-old-space-size=4096.*\n"
          - ".+rimraf coverage"
          - "yarn run.+\n"
          - "\\(node:\\d+\\) (\\[DEP0005\\]|DeprecationWarning).+\n"
          - "\\$ yarn (cover|test):.+\n"
          - "The command \"yarn travis:\\$JOB_PART\" exited[\\s\\S]*"
          - "Ran all test suites.+\n"
          - "error Command failed with exit code \\d+.\n"
          - "info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.\n"
          - "Force exiting Jest\n\nHave you considered.+"
          - "=============================== Coverage summary ===============================[\\s\\S]+?================================================================================"
          - " *PASS *test/.*\n"
          - "^\\s+\n|\\s+$"
      string_cleanup_1:
        id: firstError
        value: "{{{logResult}}}"
        remove:
          - "\n\n(  ●| FAIL)[\\s\\S]*"
          - "Test Suites:[\\s\\S]*"
          - "\\s+$"
      string_cleanup_2:
        id: remainingErrors
        value: "{{{logResult}}}"
        remove:
          - "^[\\s\\S]+?(?=\n\n(  ●| FAIL)|$)"
          - "^\n+"
          - "Test Suites:[\\s\\S]*"
          - "\\s+$"
      string_cleanup_3:
        id: summary
        value: "{{{logResult}}}"
        remove:
          - "^[\\s\\S]+?(?=Test Suites:)"
          - "\\s+$"
    actions:
      comment:
        identifier: "ci-result"
        message: |-
          The basic integration tests succeeded, but the full suite failed.

          @{{commit.author.login}} Please review the following output log for errors:

          ```text
          {{{firstError}}}
          ```
          {{#if remainingErrors}}
          <details>
            <summary>Show remaining errors</summary>

          ```text
          {{{remainingErrors}}}
          ```
          </details>
          {{/if}}

          ```text
          {{{summary}}}
          ```

          See [complete report here]({{status.target_url}}).
      set:
        id: report_ci
        value: nope

  # Report specific error message if jest for unit tests or liniting fails
  - filters:
      ensure:
        value: "{{report_ci}}"
        equals: yep
      commit: true
      status:
        context: "continuous-integration/travis-ci/pr"
      travis_job:
        state: "failed"
        allow_failure: false
        config:
          env: JOB_PART=lint-unit
      fetch: travis_job.log
      string_cleanup:
        id: logResult
        value: "{{{fetch}}}"
        remove:
          - ".\\[2K.\\[1G|.\\[999D.\\[K"
          - "^[\\s\\S]+?\\$ yarn travis:\\$JOB_PART.*\n"
          - "\\$ node --max-old-space-size=4096.*\n"
          - ".+rimraf coverage"
          - "yarn run.+\n"
          - "\\(node:\\d+\\) (\\[DEP0005\\]|DeprecationWarning).+\n"
          - "\\$ yarn (unit|lint).+\n"
          - "The command \"yarn travis:\\$JOB_PART\" exited[\\s\\S]*"
          - "Ran all test suites.+\n"
          - "error Command failed with exit code \\d+.\n"
          - "info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.\n"
          - "Force exiting Jest\n\nHave you considered.+"
          - "=============================== Coverage summary ===============================[\\s\\S]+?================================================================================"
          - " *PASS *test/.*\n"
          - "^\\s+\n|\\s+$"
    actions:
      comment:
        identifier: "ci-result"
        message: |-
          The integration tests look fine, but there are code style issues or unit test failures in the Pull Request.

          @{{commit.author.login}} Please review the following output log for errors:

          ``` text
          {{{logResult}}}
          ```

          If the unit tests are outdated, you can choose to delete them and add integration tests instead. That would be great.

          See [complete report here]({{status.target_url}}).
      set:
        id: report_ci
        value: nope

  # Report a general error message
  - filters:
      ensure:
        value: "{{report_ci}}"
        equals: yep
      commit: true
      status_1:
        context: "continuous-integration/travis-ci/pr"
      status_2:
        context: "continuous-integration/appveyor/pr"
    actions:
      comment:
        identifier: "ci-result"
        message: |-
          @{{commit.author.login}} The most important CI builds failed. This way your PR can't be merged.

          Please take a look at the CI results from [travis]({{status_1.target_url}}) ({{status_1.state}}) and [appveyor]({{status_2.target_url}}) ({{status_2.state}}) and fix these issues.

  # Add tests-needed label depending on codecov status
  # comment to point the user writing test cases
  # comment in case of success
  - filters:
      open: true
      pull_request:
        mergeable: true
      status:
        context: "codecov/patch/integration"
      ensure:
        value: "{{status.state}}"
        equals: "success"
      label: "PR: tests-needed"
    actions:
      label:
        remove: "PR: tests-needed"
      comment:
        identifier: "tests-result"
        message: |-
          The minimum test ratio has been reached. Thanks!
  - filters:
      open: true
      pull_request:
        mergeable: true
      status:
        context: "codecov/patch/integration"
      ensure:
        value: "{{status.state}}"
        equals: "failure"
    actions:
      label:
        add: "PR: tests-needed"
  - filters:
      open: true
      pull_request:
        mergeable: true
      status:
        context: "codecov/patch/integration"
      ensure:
        value: "{{status.state}}"
        equals: "failure"
      age:
        value: "{{status.created_at}}"
        minimum: 1h
      permission: "read|none"
    actions:
      comment:
        identifier: "tests-result"
        message: |-
          It looks like this Pull Request doesn't include [enough test cases]({{status.target_url}}) (based on Code Coverage analysis of the PR diff).

          A PR need to be covered by tests if you add a new feature (we want to make sure that your feature is working) or if you fix a bug (we want to make sure that we don't run into a regression in future).

          @{{issue.user.login}} Please check if this is appliable to your PR and if you can add more test cases.

          Read the [test readme](https://github.com/webpack/webpack/blob/master/test/README.md) for details how to write test cases.

  # add conflict label to pull requests with conflict
  # on conflict all result labels are removed
  - filters:
      open: true
      pull_request:
        mergeable: false
    actions:
      label:
        add: "PR: conflict"
        remove:
          - "PR: tests-needed"
          - "PR: CI-ok"
          - "PR: CI-not-ok"
  - filters:
      open: true
      pull_request:
        mergeable: true
    actions:
      label:
        remove: "PR: conflict"

  # add unreviewed, reviewed, review-outdated labels
  # comment to ping reviewer
  # comment on new PR
  - filters:
      open: true
      in_order:
        commit: true
        review:
          state: APPROVED|CHANGES_REQUESTED
      ensure:
        value: "{{review.state}}"
        equals: APPROVED
      permission:
        user: "{{review.user.login}}"
    actions:
      label:
        add: "PR: reviewed-approved"
        remove:
          - "PR: review-outdated"
          - "PR: unreviewed"
          - "PR: reviewed"
  - filters:
      open: true
      in_order:
        commit: true
        review:
          state: APPROVED|CHANGES_REQUESTED
      permission:
        user: "{{review.user.login}}"
      ensure:
        value: "{{review.state}}"
        equals: CHANGES_REQUESTED
    actions:
      label:
        add: "PR: reviewed-changes-requested"
        remove:
          - "PR: review-outdated"
          - "PR: unreviewed"
          - "PR: reviewed"
  - filters:
      open: true
      in_order:
        review:
          state: APPROVED|CHANGES_REQUESTED
        commit: true
      permission:
        user: "{{review.user.login}}"
      not:
        label: "review-outdated"
      ensure:
        value: "{{commit.author.login}}"
        notEquals: "{{review.user.login}}"
    actions:
      label:
        add: "PR: review-outdated"
        remove:
          - "PR: reviewed-approved"
          - "PR: reviewed-changes-requested"
          - "PR: unreviewed"
          - "PR: reviewed"
      comment:
        identifier: "review-outdated"
        message: |-
          @{{commit.author.login}} Thanks for your update.

          I labeled the Pull Request so reviewers will review it again.

          @{{review.user.login}} Please review the new changes.
  - filters:
      open: true
      commit: true
      not:
        review:
          state: APPROVED|CHANGES_REQUESTED
    actions:
      label: "PR: unreviewed"

  # add non-master and next label to pull request to other branch
  - filters:
      pull_request:
        base_ref: "^master$"
    actions:
      label:
        remove: "PR: non-master"
  - filters:
      pull_request:
        base_ref: "^next$"
    actions:
      label:
        add: "PR: next"
        remove: "PR: non-master"
  - filters:
      pull_request:
        base_ref: "^(?!master$)(?!next$)"
    actions:
      label:
        add: "PR: non-master"
        remove: "PR: next"

  # add non-master label to pull request to other branch
  - filters:
      open: true
      age:
        minimum: 1d
        maximum: 1w
      pull_request:
        head_ref: "^master$"
      permission: "read|none"
    actions:
      comment:
        identifier: "head-master"
        edit: true
        message: |-
          Hi @{{pull_request.user.login}}.

          Just a little hint from a friendly bot about the best practice when submitting pull requests:

          > Don't submit pull request from your own `master` branch. It's recommended to create a feature branch for the PR.

          *You don't have to change it for this PR, just make sure to follow this hint the next time you submit a PR.*

  # skip CLA for dependabot
  - filters:
      open: true
      pull_request:
        author: "^dependabot(-preview)?\\[bot\\]$"
      status:
        context: "licence/cla"
        state: "pending"
    actions:
      status:
        context: "licence/cla"
        description: "Contributor License Agreement is not needed for this user."
        state: "success"

  # merge dependabot PRs automatically
  - filters:
      open: true
      pull_request:
        author: "^dependabot(-preview)?\\[bot\\]$"
        mergeable_state: clean
        merged: false
      label: "PR: CI-ok"
    actions:
      merge: true

  # add "Send a PR" label when somebody with write permission say it
  - filters:
      open: true
      comment: "[Ss]end a [Pp][Rr]"
      permission:
        user: "{{comment.actor.login}}"
    actions:
      label: "Send a PR"

  # Move issue task
  - filters:
      open: true
      comment: "\\s*@webpack-bot\\s+move\\s+(?:to\\s+)?([a-z0-9_\\-\\.]+/[a-z0-9_\\-\\.]+)\\s*([\\s\\S]*)$"
      not:
        comment_1:
          matching: "moved\\-by\\-bot"
          author: "."
      permission:
        user: "{{comment.actor.login}}"
    actions:
      new_issue:
        target: "{{{comment_match.[1]}}}"
        body: |-
          {{{issue.body}}}

          ---

          This issue was moved from {{owner}}/{{repo}}#{{issue.number}} by @{{comment.actor.login}}. Original issue was by @{{issue.user.login}}.

          {{{comment_match.[2]}}}
      comment:
        identifier: moved-by-bot
        message: |-
          I've moved it to {{comment_match.[1]}}.
      close: true

  # mark inactive issues with inactive label
  # close them when no activity after warning
  - filters:
      issue: true
      open: true
      not:
        label: inactive
      ensure:
        value: "{{issue.reactions.[+1]}}"
        range: "< 10"
      last_action_age: 13w # three months
    actions:
      comment:
        identifier: inactive-warning
        message: |-
          **This issue had no activity for at least three months.**

          It's subject to automatic issue closing if there is no activity in the next 15 days.
      label: inactive
  - filters:
      open: true
      label: inactive
      last_action_age:
        maximum: 13w # three months
    actions:
      label:
        remove:
          - inactive
  - filters:
      open: true
      label: inactive
      last_action_age:
        minimum: 15d
        includeBotActions: true
    actions:
      close: true
      comment:
        identifier: inactive-close
        message: |-
          Issue was closed because of inactivity.

          If you think this is still a valid issue, please file a new issue with additional information.

  # Add action actions box to each pull request
  - filters:
      pull_request: true
      open: true
      not:
        comment:
          matching: admin-actions
          author: webpack-bot
    actions:
      comment:
        identifier: admin-actions
        message: |-
          *For maintainers only:*

          * [ ] <!-- document --> This needs to be documented (issue in webpack/webpack.js.org will be filed when merged)
          * [ ] <!-- webpack-4-backport --> This needs to be backported to webpack 4 (issue will be created when merged)

  # When a pull request need to be documented, create an issue in webpack/webpack.js.org when merged
  - filters:
      pull_request:
        merged: true
      comment:
        author: webpack-bot
        matching: "\\* \\[x\\] <!-- document -->"
      not:
        comment_1:
          author: webpack-bot
          matching: admin-action-document-executed
    actions:
      new_issue:
        target: webpack/webpack.js.org
        title: "Document webpack change: {{{pull_request.title}}}"
        body: |-
          <!-- documentation request from webpack/webpack -->

          *A pull request by @{{pull_request.user.login}} was merged and maintainers requested a documentation change.*

          See pull request: {{{pull_request.html_url}}}

          ---

          {{{pull_request.body}}}
      comment:
        identifier: admin-action-document-executed
        message: |-
          I've created an issue to document this in webpack/webpack.js.org.

  # When a pull request need to be backported, create an issue in webpack/webpack when merged
  - filters:
      pull_request:
        merged: true
      comment:
        author: webpack-bot
        matching: "\\* \\[x\\] <!-- webpack-4-backport -->"
      not:
        comment_1:
          author: webpack-bot
          matching: admin-action-webpack-4-backport-executed
    actions:
      new_issue:
        target: webpack/webpack
        title: "Backport to webpack 4: {{{pull_request.title}}}"
        body: |-
          {{{pull_request.html_url}}} needs to be backported to webpack 4.
          
          Send a PR.
          
          cc @{{pull_request.user.login}}
      comment:
        identifier: admin-action-webpack-4-backport-executed
        message: |-
          I've created an issue to backport this.

  # Check open issues and pull requests every day
  - filters:
      open: true
    actions:
      schedule: 1d
