#!/bin/bash

# Copyright 2021 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

# Runs all the lint checks that we run on GitHub locally. Will fail if any tool
# is missing.

# Keep this in sync with .github/workflows/lint.yml

# WARNING: this script *makes changes* to the working directory and the index.

set -uo pipefail

FINAL_RET=0
PREV_CMD=""

scripts_dir="$(dirname $0)"

function update_ret() {
  local prev_ret="$?"
  local cur_cmd="${BASH_COMMAND}"
  if [[ "${prev_ret}" -gt "${FINAL_RET}" ]]; then
    FINAL_RET="${prev_ret}"
    FAILING_CMD="${PREV_CMD}"
  fi
  PREV_CMD="${cur_cmd}"
}

# Analyze the exit code of the previous command before every command
trap update_ret DEBUG

echo "***** Uncommitted changes *****"
git add -A
git diff HEAD --exit-code

if [[ $? -ne 0 ]]; then
  echo "Found uncomitted changes in working directory. This script requires" \
        "all changes to be committed. All changes have been added to the" \
        "index. Please commit or clean all changes and try again."
  exit 1
fi

echo "***** Bazel -> CMake *****"
./build_tools/bazel_to_cmake/bazel_to_cmake.py
./build_tools/bazel_to_cmake/bazel_to_cmake.py --root_dir=integrations/tensorflow/e2e
git add -A
git diff HEAD --exit-code

echo "***** buildifier *****"
${scripts_dir}/run_buildifier.sh
git diff --exit-code

echo "***** black *****"
# The filter lowercase `d` means to exclude deleted files.
git diff main --name-only --diff-filter=d -- '*.py' ':!third_party' \
  | xargs -r black

echo "***** pytype *****"
./build_tools/pytype/check_diff.sh

echo "***** clang-format *****"
git-clang-format --style=file main
git diff --exit-code

echo "***** tabs *****"
"${scripts_dir}/check_tabs.sh"

echo "***** yamllint *****"
"${scripts_dir}/run_yamllint.sh"

echo "***** markdownlint *****"
"${scripts_dir}/run_markdownlint.sh"

echo "***** Path Lengths *****"
./build_tools/scripts/check_path_lengths.py

echo "***** Generates CMake files *****"
./build_tools/scripts/generate_cmake_files.sh
git add -A
git diff HEAD --exit-code

echo "***** Check BUILD files are not named BUILD (prefer BUILD.bazel) *****"
if [[ $(git ls-files '**/BUILD') ]]; then
  echo "failure: found files named BUILD. Please rename the following files to BUILD.bazel:"
  git ls-files '**/BUILD'
  (exit 1)
fi

if (( "${FINAL_RET}" != 0 )); then
  echo "Encountered failures when running: '${FAILING_CMD}'. Check error" \
       "messages and changes to the working directory and git index (which" \
       "may contain fixes) and try again."
fi

exit "${FINAL_RET}"
