#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: lint-checker-ci

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master
      - v1.6.0
    type: [review_requested, ready_for_review]
jobs:
  changes:
    runs-on: ubuntu-latest
    outputs:
      docs: ${{ steps.filter.outputs.docs }}
      go: ${{ steps.filter.outputs.go }}
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          submodules: recursive

      - uses: ./.github/actions/paths-filter
        id: filter
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          filters: |
            docs:
              - 'docs/**/*'
              - '*.md'
            go:
              - '*.go'
              - '**/*.go'
              - 'go.mod'
              - 'go.sum'
              - 'Makefile'
              - 'Dockerfile'
              - 'test/e2e/**/*'
              - 'conf/**'
              - 'utils/**'
              - ".github/**"

  run-test:
    needs: changes
    if: |
      (needs.changes.outputs.go == 'true')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Go Env
        uses: actions/setup-go@v3
        with:
          go-version: '1.19'
      - name: run gofmt
        working-directory: ./
        run: |
          diffs=`gofmt -l .`
          if [[ -n $diffs ]]; then
              echo "Files are not formatted by gofmt:"
              echo $diffs
              exit 1
          fi
  markdownlint:
    needs: changes
    if: |
      (needs.changes.outputs.docs == 'true')
    name: 🍇 Markdown
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: 🚀 Use Node.js
        uses: actions/setup-node@v1
        with:
          node-version: '12.x'
      - run: npm install -g markdownlint-cli@0.32.2
      - run: markdownlint '**/*.md' --ignore node_modules --ignore CHANGELOG.md
  markdown-link-check:
    needs: changes
    if: |
      (needs.changes.outputs.docs == 'true')
    runs-on: ubuntu-latest
    name: Check Markdown links
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
      - uses: ./.github/actions/markdown-link-check
        with:
          use-quiet-mode: 'yes'
          use-verbose-mode: 'yes'
          config-file: 'link-check-config.json'
          folder-path: 'docs/en'
          file-path: './README.md, ./install.md, ./test/e2e/README.md'
          max-depth: -1
          file-extension: ".md"
          check-modified-files-only: "no"
