# https://doc.mergify.io/
pull_request_rules:
  - name: label changes from community
    conditions:
      - author≠@anza
      - author≠@monorepo-maintainers
      - author≠@monorepo-write
      - author≠@monorepo-triage
      - author≠mergify[bot]
      - author≠dependabot[bot]
      - author≠github-actions[bot]
    actions:
      label:
        add:
          - community
          - need:merge-assist
  - name: request review for community changes
    conditions:
      - author≠@anza
      - author≠@monorepo-maintainers
      - author≠@monorepo-write
      - author≠@monorepo-triage
      - author≠mergify[bot]
      - author≠dependabot[bot]
      - author≠github-actions[bot]
      # Only request reviews from the pr subscribers group if no one
      # has reviewed the community PR yet. These checks only match
      # reviewers with admin, write or maintain permission on the repository.
      - "#approved-reviews-by=0"
      - "#commented-reviews-by=0"
      - "#changes-requested-reviews-by=0"
      - "#review-requested=0"
    actions:
      request_reviews:
        teams:
          - "@anza-xyz/community-pr-subscribers"
  - name: label changes from monorepo-triage
    conditions:
      - author≠@anza
      - author≠mergify[bot]
      - author≠dependabot[bot]
      - author≠github-actions[bot]
      - author≠@monorepo-maintainers
      - author≠@monorepo-write
      - author=@monorepo-triage
    actions:
      label:
        add:
          - need:merge-assist
  - name: automatic merge (squash) on CI success
    conditions:
      - and:
        - status-success=buildkite/agave
        - status-success=ci-gate
        - label=automerge
        - label!=no-automerge
        - or:
          # only require docs checks if docs files changed
          - -files~=^docs/
          - status-success=build & deploy docs
        - or:
          - -files~=(\.rs|Cargo\.toml|Cargo\.lock|\.github/scripts/cargo-clippy-before-script\.sh|\.github/workflows/cargo\.yml)$
          - or:
            - check-success=clippy-nightly (macos-latest)
            - check-success=clippy-nightly (macos-latest-large)
        - or:
          - -files~=(\.rs|Cargo\.toml|Cargo\.lock|cargo-build-sbf|cargo-test-sbf|ci/downstream-projects/run-spl\.sh|\.github/workflows/downstream-project-spl\.yml)$
          - and:
            - status-success=check (associated-token-account)
            - status-success=check (feature-proposal)
            - status-success=check (instruction-padding)
            - status-success=check (memo)
            - status-success=check (record)
            - status-success=check (single-pool)
            - status-success=check (slashing)
            - status-success=check (stake-pool)
            - status-success=check (token-2022)
            - status-success=test_cli (single-pool)
            - status-success=test_cli (token-2022)
            - status-success=cargo-test-sbf (associated-token-account)
            - status-success=cargo-test-sbf (feature-proposal)
            - status-success=cargo-test-sbf (instruction-padding)
            - status-success=cargo-test-sbf (memo)
            - status-success=cargo-test-sbf (record)
            - status-success=cargo-test-sbf (single-pool)
            - status-success=cargo-test-sbf (slashing)
            - status-success=cargo-test-sbf (stake-pool)
            - status-success=cargo-test-sbf (token-2022)
        - or:
          - -files~=(Cargo\.toml|.github/workflows/crate-check\.yml|ci/check-crates\.sh)$
          - check-success=crate check
    actions:
      merge:
        method: squash
  - name: remove automerge label on CI failure
    conditions:
      - and:
        - label=automerge
        - "#status-failure!=0"
        - -merged
    actions:
      label:
        remove:
          - automerge
      comment:
        message: automerge label removed due to a CI failure
  - name: v3.0 feature-gate backport
    conditions:
      - label=v3.0
      - label=feature-gate
    actions:
      backport:
        assignees: &BackportAssignee
          - "{{ merged_by|replace('mergify[bot]', label|select('equalto', 'community')|first|default(author)|replace('community', '@anza-xyz/community-pr-subscribers')) }}"
        title: "{{ destination_branch }}: {{ title }} (backport of #{{ number }})"
        ignore_conflicts: true
        labels:
          - feature-gate
        branches:
          - v3.0
  - name: v3.0 non-feature-gate backport
    conditions:
      - label=v3.0
      - label!=feature-gate
    actions:
      backport:
        assignees: *BackportAssignee
        title: "{{ destination_branch }}: {{ title }} (backport of #{{ number }})"
        ignore_conflicts: true
        branches:
          - v3.0
  - name: v3.0 backport warning comment
    conditions:
      - label=v3.0
    actions:
      comment:
        message: >
          Backports to the stable branch are to be avoided unless absolutely
          necessary for fixing bugs, security issues, and perf regressions.
          Changes intended for backport should be structured such that a
          minimum effective diff can be committed separately from any
          refactoring, plumbing, cleanup, etc that are not strictly
          necessary to achieve the goal. Any of the latter should go only
          into master and ride the normal stabilization schedule.
  - name: v3.1 feature-gate backport
    conditions:
      - label=v3.1
      - label=feature-gate
    actions:
      backport:
        assignees: *BackportAssignee
        title: "{{ destination_branch }}: {{ title }} (backport of #{{ number }})"
        ignore_conflicts: true
        labels:
          - feature-gate
        branches:
          - v3.1
  - name: v3.1 non-feature-gate backport
    conditions:
      - label=v3.1
      - label!=feature-gate
    actions:
      backport:
        assignees: *BackportAssignee
        title: "{{ destination_branch }}: {{ title }} (backport of #{{ number }})"
        ignore_conflicts: true
        branches:
          - v3.1
  - name: v3.1 backport warning comment
    conditions:
      - label=v3.1
    actions:
      comment:
        message: >
          Backports to the beta branch are to be avoided unless absolutely
          necessary for fixing bugs, security issues, and perf regressions.
          Changes intended for backport should be structured such that a
          minimum effective diff can be committed separately from any
          refactoring, plumbing, cleanup, etc that are not strictly
          necessary to achieve the goal. Any of the latter should go only
          into master and ride the normal stabilization schedule. Exceptions
          include CI/metrics changes, CLI improvements and documentation
          updates on a case by case basis.
  - name: Reminder to update RPC clients for changes in `rpc/`
    conditions:
      - or:
        - files~=^rpc/src/rpc\.rs$
        - files~=^rpc/src/rpc_pubsub\.rs$
        - files~=^rpc-client-api/src/.*\.rs$
    actions:
      comment:
        message: |
          If this PR represents a change to the public RPC API:

          1. Make sure it includes a complementary update to `rpc-client/` ([example](https://github.com/solana-labs/solana/pull/29558/files))
          2. Open a follow-up PR to update the JavaScript client `@solana/kit` ([example](https://github.com/solana-labs/solana-web3.js/pull/2868/files))

          Thank you for keeping the RPC clients in sync with the server API @{{author}}.
  - name: Reminder to add Firedancer team to changes in `programs/`
    conditions:
      - or:
        - files~=^programs/address-lookup-table/src/.*\.rs$
        - files~=^programs/bpf_loader/src/.*\.rs$
        - files~=^programs/compute_budget/src/.*\.rs$
        - files~=^programs/config/src/.*\.rs$
        - files~=^programs/loader-v4/src/.*\.rs$
        - files~=^programs/stake/src/.*\.rs$
        - files~=^programs/system/src/.*\.rs$
        - files~=^programs/vote/src/.*\.rs$
        - files~=^programs/zk-elgamal-proof/src/.*\.rs$
    actions:
      comment:
        message: |
          The Firedancer team maintains a line-for-line reimplementation of the
          native programs, and until native programs are moved to BPF, those
          implementations must exactly match their Agave counterparts.
          If this PR represents a change to a native program implementation (not
          tests), please include a reviewer from the Firedancer team. And please
          keep refactors to a minimum.
  - name: Notify about the deprecation of zk-token-sdk
    conditions:
      - or:
        - files~=^zk-token-sdk/
    actions:
      comment:
        message: |
          For your information, the `solana-zk-token-sdk` is deprecated, and this
          directory will be removed in a future version. Please take this in mind
          when making modifications.

commands_restrictions:
  # The author of copied PRs is the Mergify user.
  # Restrict `copy` access to Core Contributors
  copy:
    conditions:
    - author=@anza
