#!/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. Skips checks if the
# relevant tool doesn't exist.

# 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
LATEST_RET=0

scripts_dir="$(dirname $0)"

function update_ret() {
  LATEST_RET="$?"
  if [[ "${LATEST_RET}" -gt "${FINAL_RET}" ]]; then
    FINAL_RET="${LATEST_RET}"
  fi
}

# Update the exit code after every command
function enable_update_ret() {
  trap update_ret DEBUG
}

function disable_update_ret() {
  trap - DEBUG
}

function exists() {
  command -v "${1}" > /dev/null
}


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

enable_update_ret

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
trap - DEBUG

echo "***** buildifier *****"
# Don't fail script if condition is false
disable_update_ret
if exists buildifier; then
  enable_update_ret
  ${scripts_dir}/run_buildifier.sh
  git diff --exit-code
else
  enable_update_ret
  echo "'buildifier' not found. Skipping check"
fi

echo "***** yapf *****"
# Don't fail script if condition is false
disable_update_ret
if exists yapf; then
  enable_update_ret
  git diff -U0 main | ./third_party/format_diff/format_diff.py yapf -i
else
  enable_update_ret
  echo "'yapf' not found. Skipping check"
fi

echo "***** pytype *****"
# Don't fail script if condition is false
disable_update_ret
if exists pytype; then
  enable_update_ret
  ./build_tools/pytype/check_diff.sh
else
  enable_update_ret
  echo "'pytype' not found. Skipping check"
fi

echo "***** clang-format *****"
# Don't fail script if condition is false
disable_update_ret
if exists git-clang-format; then
  enable_update_ret
  git-clang-format --style=file main
  git diff --exit-code
else
  enable_update_ret
  echo "'git-clang-format' not found. Skipping check"
fi

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

echo "***** yamllint *****"
disable_update_ret
if exists yamllint; then
  enable_update_ret
  ${scripts_dir}/run_yamllint.sh
else
  enable_update_ret
  echo "'yamllint' not found. Skipping check"
fi

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

exit "${FINAL_RET}"
