blob: 372cc4839bc9b31385ce5c671a005b0a18a98bd3 [file] [log] [blame]
#!/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
gofmt=gofmt
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
if ! type "${gofmt}" >/dev/null 2>&1; then
echo "${gofmt} isn't on your \$PATH. Please either enter a chroot, or add " \
"the go binaries to 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=()
go_files=()
for f in "$@"; do
if [[ ! -e "${f}" ]]; then
if "${complain_about_missing}"; then
echo "error: no such file: ${f}" >&2
everything_passed=false
fi
continue
fi
if [[ "${f}" == *.py ]]; then
python_files+=( "${f}" )
if ! check_python_file_header "${f}"; then
everything_passed=false
fi
elif [[ "${f}" == *.go ]]; then
go_files+=( "${f}" )
fi
done
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 }')
)
if [[ "${#bad_files[@]}" -ne 0 ]]; then
echo "One or more python files appear to be incorrectly formatted."
echo "Please run \`${yapf} -i ${bad_files[@]}\` to rectify this."
everything_passed=false
fi
fi
if [[ "${#go_files[@]}" -ne 0 ]]; then
bad_files=(
$("${gofmt}" -l "${go_files[@]}")
)
if [[ "${#bad_files[@]}" -ne 0 ]]; then
echo "One or more go files appear to be incorrectly formatted."
echo "Please run \`${gofmt} -w ${bad_files[@]}\` to rectify this."
everything_passed=false
fi
fi
"${everything_passed}"