#
# 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
jobs:
  changes:
    runs-on: ubuntu-latest
    outputs:
      docs: ${{ steps.filter.outputs.docs }}
      go: ${{ steps.filter.outputs.go }}
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        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/**'

  run-test:
    needs: changes
    if: |
      (needs.changes.outputs.go == 'true')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: setup go
        uses: actions/setup-go@v1
        with:
          go-version: '1.13'
      - 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@v2
      - name: 🚀 Use Node.js
        uses: actions/setup-node@v1
        with:
          node-version: '12.x'
      - run: npm install -g markdownlint-cli@0.25.0
      - run: markdownlint '**/*.md' --ignore node_modules
