# 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: Code Checks

on: [push, pull_request_target]

jobs:
  shellcheck:
    name: ShellCheck
    runs-on: ubuntu-latest
    steps:
      - name: Checkout ${{ github.ref }} ( ${{ github.sha }} )
        if: ${{ github.event_name != 'pull_request_target' }}
        uses: actions/checkout@v3

      - name: Checkout ${{ github.ref }} ( ${{ github.event.pull_request.head.sha }} )
        if: ${{ github.event_name == 'pull_request_target' }}
        uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Checkout action-sh-checker
        run: |
          rm -rf ./.github/actions/action-sh-checker
          git clone https://github.com/luizm/action-sh-checker .github/actions/action-sh-checker

          pushd .github/actions/action-sh-checker &>/dev/null
          git checkout 76ab0b22e1f194e4a582edc7969df6485c4e9246
          sed -i 's/\[ "$GITHUB_EVENT_NAME" == "pull_request" \]/\[\[ "$GITHUB_EVENT_NAME" == "pull_request" || "$GITHUB_EVENT_NAME" == "pull_request_target" \]\]/' entrypoint.sh
          popd &>/dev/null

      - name: Run ShellCheck
        uses: ./.github/actions/action-sh-checker
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          sh_checker_comment: true
          sh_checker_exclude: .git .github ^docker/compilation ^docker/runtime ^thirdparty/src ^thirdparty/installed ^ui ^docs/node_modules ^tools/clickbench-tools ^extension ^output ^fs_brokers/apache_hdfs_broker/output (^|.*/)Dockerfile$ ^be/src/apache-orc ^be/src/clucene ^pytest ^samples

  preparation:
    name: "Clang Tidy Preparation"
    if: ${{ github.event_name == 'pull_request_target' }}
    runs-on: ubuntu-22.04
    permissions: read-all
    outputs:
      should_check: ${{ steps.generate.outputs.should_check }}
    steps:
      - name: Checkout ${{ github.ref }} ( ${{ github.event.pull_request.head.sha }} )
        uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Checkout paths-filter
        run: |
          rm -rf ./.github/actions/paths-filter
          git clone https://github.com/dorny/paths-filter .github/actions/paths-filter

          pushd .github/actions/paths-filter &>/dev/null
          git checkout 4512585405083f25c027a35db413c2b3b9006d50
          popd &>/dev/null

      - name: Paths Filter
        uses: ./.github/actions/paths-filter
        id: filter
        with:
          filters: |
            cpp_changes:
              - 'be/**'
              - 'cloud/**'
              - 'gensrc/proto/**'
              - 'gensrc/thrift/**'

      - name: Generate compile_commands.json
        id: generate
        run: |
          if [[ "${{ steps.filter.outputs.cpp_changes }}" == 'true' ]]; then
            export DEFAULT_DIR='/opt/doris'

            mkdir "${DEFAULT_DIR}"
            wget https://github.com/amosbird/ldb_toolchain_gen/releases/download/v0.18/ldb_toolchain_gen.sh \
              -q -O /tmp/ldb_toolchain_gen.sh
            bash /tmp/ldb_toolchain_gen.sh "${DEFAULT_DIR}/ldb-toolchain"

            sudo DEBIAN_FRONTEND=noninteractive apt install --yes tzdata byacc

            pushd thirdparty
            curl -L https://github.com/apache/doris-thirdparty/releases/download/automation/doris-thirdparty-prebuilt-linux-x86_64.tar.xz \
              -o doris-thirdparty-prebuilt-linux-x86_64.tar.xz
            tar -xvf doris-thirdparty-prebuilt-linux-x86_64.tar.xz
            popd

            export PATH="${DEFAULT_DIR}/ldb-toolchain/bin/:$(pwd)/thirdparty/installed/bin/:${PATH}"
            DISABLE_BE_JAVA_EXTENSIONS=ON DO_NOT_CHECK_JAVA_ENV=ON DORIS_TOOLCHAIN=clang ENABLE_PCH=OFF OUTPUT_BE_BINARY=0 ./build.sh --be
          fi

          echo "should_check=${{ steps.filter.outputs.cpp_changes }}" >>${GITHUB_OUTPUT}

      - name: Upload
        uses: actions/upload-artifact@v3
        if: ${{ steps.filter.outputs.cpp_changes == 'true' }}
        with:
          name: compile_commands
          path: ./be/build_Release/compile_commands.json

  clang-tidy:
    name: "Clang Tidy"
    needs: preparation
    if: ${{ needs.preparation.outputs.should_check == 'true' }}
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout ${{ github.ref }} ( ${{ github.event.pull_request.head.sha }} )
        uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Download
        uses: actions/download-artifact@v3
        with:
          name: compile_commands
          path: ./be/build_Release

      - name: Checkout clang-tidy review
        run: |
          rm -rf ./.github/actions/clang-tidy-review
          git clone https://github.com/ZedThree/clang-tidy-review .github/actions/clang-tidy-review

          pushd .github/actions/clang-tidy-review &>/dev/null
          git checkout 2c55ef8cfc9acb3715d433e58aea086dcec9b206
          popd &>/dev/null

      - name: Run clang-tidy review
        uses: ./.github/actions/clang-tidy-review
        id: review
        with:
          build_dir: ./be/build_Release
          config_file: "./.clang-tidy"

      # clang-tidy review not required now
      # - if: steps.review.outputs.total_comments > 0
      #   run: exit 1
