#!/bin/bash -e
# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This script checks the format of the given files. If any look incorrectly
# formatted, this will complain about them and exit. At the moment, it only
# checks the format of Python.
#
# FIXME: It would be nice if YAPF supported tweaking quotes:
# https://github.com/google/yapf/issues/399

if [[ $# -eq 0 ]]; then
  echo "No files were given to check the format of." >&2
  echo "Usage: $0 file1 file2 ..." >&2
  exit 1
fi

yapf=yapf

if ! type "${yapf}" >/dev/null 2>&1; then
  echo "${yapf} isn't on your \$PATH. Please either enter a chroot, or place" \
    "depot_tools on your \$PATH." >&2
  exit 1
fi

status_to_tf() {
  if "$@" >& /dev/null; then
    echo true
  else
    echo false
  fi
}

complain_about_missing=$(status_to_tf test -z "${IGNORE_MISSING}")

check_python_file_header() {
  local py_file="$1"
  local needs_hashbang=$(status_to_tf test -x "${py_file}")
  local has_hashbang=$(status_to_tf grep -q '^#!' <(head -n1 "${py_file}"))

  if [[ "${needs_hashbang}" == "${has_hashbang}" ]]; then
    return 0
  fi

  if "${needs_hashbang}"; then
    echo "File ${py_file} needs a #!; please run" \
      "\`sed -i '1i#!/usr/bin/env python' ${py_file}\`"
  else
    echo "File ${py_file} has an unnecessary #!; please run" \
      "\`sed -i 1d ${py_file}\`"
  fi
  return 1
}

everything_passed=true
python_files=()

for f in "$@"; do
  [[ "${f}" == *.py ]] || continue
  if [[ ! -e "${f}" ]]; then
    if "${complain_about_missing}"; then
      echo "error: no such file: ${f}" >&2
      everything_passed=false
    fi
    continue
  fi

  python_files+=( "${f}" )

  if ! check_python_file_header "${f}"; then
    everything_passed=false
  fi
done

bad_files=()
if [[ "${#python_files[@]}" -ne 0 ]]; then
  # yapf will give us a full unified (git-like) diff. We parse out the file
  # names, e.g.,
  #
  # --- foo (original)
  #
  # Sed makes it so that bad_files consists only of those lines, but with the
  # leading '--- ' and trailing ' (original)' removed.
  #
  # FIXME: Ideally, we should pass yapf the `-p` arg, so it'll format things in
  # parallel. This requires concurrent.futures in python2 (which isn't
  # available in the chroot by default), and is purely an optimization, so we
  # can handle it later.
  bad_files=(
    $("${yapf}" -d "${python_files[@]}" |
      sed -n '/^--- /{ s/^--- //; s/ *(original)$//p }')
  )
fi

if [[ "${#bad_files[@]}" -ne 0 ]]; then
  echo "One or more files appear to be incorrectly formatted."
  echo "Please run \`${yapf} -i ${bad_files[@]}\` to rectify this."
  everything_passed=false
fi

"${everything_passed}"
