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 mocha 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:
        - "^[\\s\\S]+?\\d+\\s+pending\n+"
        - "npm ERR!.*\n"
        - "\n*=============================================================================\n[\\s\\S]*"
    string_cleanup_1:
      id: firstError
      value: "{{{logResult}}}"
      remove:
        - "\\s2\\)\\s[\\s\\S]*"
    string_cleanup_2:
      id: remainingErrors
      value: "{{{logResult}}}"
      remove:
        - "^[\\s\\S]+?(?=\\s2\\)\\s)"
  actions:
    comment:
      identifier: "ci-result"
      message: |-
        @{{commit.author.login}} Please review the following output log for errors:
        ```text
        {{{firstError}}}
        ```
        <details>
          <summary>Show remaining errors</summary>

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

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



# Report specific error message if mocha for unit 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=unit
    fetch: travis_job.log
    string_cleanup:
      id: logResult
      value: "{{{fetch}}}"
      remove:
        - "^[\\s\\S]+?\\d+\\s+pending\n+"
        - "npm ERR!.*\n"
        - "\n*=============================================================================\n[\\s\\S]*"
  actions:
    comment:
      identifier: "ci-result"
      message: |-
        @{{commit.author.login}} Please review the following output log for errors:

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

        Instead of updating these (outdated?) unit tests, 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 specific error message if linting fails
- filters:
    ensure:
      value: "{{report_ci}}"
      equals: yep
    commit: true
    status:
      context: "continuous-integration/travis-ci/pr"
    travis_job:
      state: "failed"
      config:
        env: JOB_PART=lint
    fetch: travis_job.log
    string_cleanup:
      id: logResult
      value: "{{{fetch}}}"
      remove:
        - "^[\\s\\S]+?npm run travis:\\$JOB_PART\n*"
        - "npm ERR!.*\n"
        - "\n*The command \"npm run travis:\\$JOB_PART\" exited [\\s\\S]*"
  actions:
    comment:
      identifier: "ci-result"
      message: |-
        @{{commit.author.login}} The tests look fine, but there are code style issue in your Pull Request. Please review the following:

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

        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 small label to small pull requests
- filters:
    open: true
    pull_request:
      additions: "<= 10"
      deletions: "<= 10"
      changed_files: "<= 2"
  actions:
    label: "PR: small"



# 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.*



# 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: 26w # half a year
  actions:
    comment:
      identifer: inactive-warning
      message: |-
        **This issue had no activity for at least half a year.**

        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: 26w # half a year
  actions:
    label:
      remove:
      - inactive
- filters:
    open: true
    label: inactive
    last_action_age:
      minimum: 15d
      includeBotActions: true
  actions:
    close: true
    comment:
      identifer: 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.





# Check issues every week
- filters:
    open: true
  actions:
    schedule: 1d
