# NOTE: This name appears in GitHub's Checks API and in workflow's status badge.
name: ci-lint

# Trigger the workflow when:
on:
  # A push occurs to one of the matched branches.
  push:
    branches:
      - master
      - stable/*
  # Or when a pull request event occurs for a pull request against one of the
  # matched branches.
  pull_request:
    branches:
      - master
      - stable/*

# Explicitly disable secrets.GITHUB_TOKEN permissions.
permissions: {}

jobs:
  lint:
    # NOTE: This name appears in GitHub's Checks API.
    name: lint
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          # Checkout pull request HEAD commit instead of merge commit.
          ref: ${{ github.event.pull_request.head.sha }}
          # Fetch all history so gitlint can check the relevant commits.
          fetch-depth: '0'
      - name: Set up Python 3
        uses: actions/setup-python@v4
        with:
          python-version: '3.x'
      - name: Set up Node.js 18
        uses: actions/setup-node@v4
        with:
          node-version: '18.x'
          cache: yarn
      - name: Install dependencies
        run: yarn install --frozen-lockfile
      - name: Install gitlint
        run: |
          python -m pip install gitlint
        # Needed for Towncrier fork to work with 3.12 and above
      - name: Install setuptools
        run: |
          python -m pip install setuptools
      - name: Install towncrier
        run: |
          python -m pip install https://github.com/oasisprotocol/towncrier/archive/oasis-master.tar.gz
      - name: Check for presence of a Change Log fragment (only pull requests)
        # NOTE: The pull request' base branch needs to be fetched so towncrier
        # is able to compare the current branch with the base branch.
        # Source: https://github.com/actions/checkout/#fetch-all-branches.
        run: |
          git fetch --no-tags origin "+refs/heads/${BASE_BRANCH}:refs/remotes/origin/${BASE_BRANCH}"
          towncrier check --compare-with "origin/${BASE_BRANCH}"
        env:
          BASE_BRANCH: ${{ github.base_ref }}
        if: github.event_name == 'pull_request'
      - name: Lint documentation
        run: |
          yarn lint-docs
        # Always run this step so that all linting errors can be seen at once.
        if: always()
      - name: Lint Change Log fragments
        run: |
          yarn lint-changelog
        # Always run this step so that all linting errors can be seen at once.
        if: always()
      - name: Lint git commits
        run: |
          yarn lint-git
        # Always run this step so that all linting errors can be seen at once.
        if: always()
      - name: ESLint
        # Disallow warnings and always throw errors.
        run: yarn lint --max-warnings 0
        # Always run this step so that all linting errors can be seen at once.
        if: always()
      - name: Validate Grommet icons types
        run: |
          yarn fix-grommet-icons-types
          git diff --exit-code
        # Always run this step so that all linting errors can be seen at once.
        if: always()
      - name: Validate TypeScript
        run: yarn checkTs
        # Always run this step so that all linting errors can be seen at once.
        if: always()