# Part of the Carbon Language project, under the Apache License v2.0 with LLVM
# Exceptions. See /LICENSE for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

name: 'Auto label PRs'
on:
  pull_request_target:
    types: [opened, ready_for_review]

permissions:
  pull-requests: write # For gh to edit labels.

# TODO: `--repo carbon-language/carbon-lang` is a temporary workaround for:
# https://github.com/cli/cli/issues/11055
# Once a later version is released on runners, maybe August 2025, we should be
# able to remove the extra flag.
jobs:
  set_labels:
    runs-on: ubuntu-latest
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@17d0e2bd7d51742c71671bd19fa12bdc9d40a3d6 # v2.8.1
        with:
          disable-sudo: true
          egress-policy: block
          # prettier-ignore
          allowed-endpoints: >
            api.github.com:443

      - id: filter
        uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
        with:
          filters: |
            documentation:
              - '*.md'
              - 'docs/**'
              - 'examples/**'
              - 'third_party/examples/**'

            infrastructure:
              - '*.bzl'
              - '*.cfg'
              - '*.toml'
              - '.*'
              - '.*/**'
              - 'BUILD'
              - 'MODULE.*'
              - 'WORKSPACE'
              - 'bazel/**'
              - 'github_tools/**'
              - 'proposal/scripts/**'
              - 'scripts/**'

            # Here we only want the `proposal` label when a *new* file is added
            # directly in this directory. We use `added` and a single level glob
            # to achieve that.
            proposal:
              - added: 'proposals/*'

            # We include common, shared code into the toolchain label for
            # convenience. Essentially, this is everything we intend to ship as
            # part of the reference implementation of the language.
            toolchain:
              - 'common/**'
              - 'core/**'
              - 'testing/**'
              - 'toolchain/**'

            utilities:
              - 'utils/**'

      - id: documentation
        if: steps.filter.outputs.documentation == 'true'
        run: |
          gh pr edit "${PR}" --add-label "documentation" --repo carbon-language/carbon-lang
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR: ${{ github.event.pull_request.html_url }}

      - id: infrastructure
        if: steps.filter.outputs.infrastructure == 'true'
        run: |
          gh pr edit "${PR}" --add-label "infrastructure" --repo carbon-language/carbon-lang
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR: ${{ github.event.pull_request.html_url }}

      - id: proposal
        if: steps.filter.outputs.proposal == 'true'
        run: |
          gh pr edit "${PR}" --add-label "proposal" --repo carbon-language/carbon-lang
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR: ${{ github.event.pull_request.html_url }}

      - id: toolchain
        if: steps.filter.outputs.toolchain == 'true'
        run: |
          gh pr edit "${PR}" --add-label "toolchain" --repo carbon-language/carbon-lang
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR: ${{ github.event.pull_request.html_url }}

      - id: utilities
        if: steps.filter.outputs.utilities == 'true'
        run: |
          gh pr edit "${PR}" --add-label "utilities" --repo carbon-language/carbon-lang
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR: ${{ github.event.pull_request.html_url }}

      # Note that this is not a path-based label, but an *author* based label,
      # and it applies orthogonally to the others.
      - id: automated
        if:
          contains(fromJSON('["CarbonInfraBot", "dependabot"]'),
          github.event.pull_request.user.login)
        run: |
          gh pr edit "${PR}" --add-label "automated" --repo carbon-language/carbon-lang
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR: ${{ github.event.pull_request.html_url }}
