mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-10-09 12:24:08 +00:00
c25da4b04a
This avoids diffs being applied in the work tree to files that are supposed to be excluded (clang tests), allows arc to properly provide interactive feedback for the formatting fixes, and reduces the number of files that we format, in a change affecting N files, from N^2 to N.
69 lines
2.3 KiB
Bash
Executable File
69 lines
2.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
# "script-and-regex.regex": "/^(?P<severity>.*?)\n(?P<message>.*?)\n(?P<line>\\d),(?P<char>\\d)(\n(?P<original>.*?)>>>>\n(?P<replacement>.*?)<<<<?)$/s",
|
|
|
|
# Arcanist linter that invokes clang-format via clang/tools/clang-format/clang-format-diff.py
|
|
# stdout from this script is parsed into a regex and used by Arcanist.
|
|
# https://secure.phabricator.com/book/phabricator/article/arcanist_lint_script_and_regex/
|
|
|
|
# To skip running all linters when creating/updating a diff, use `arc diff --nolint`.
|
|
|
|
# advice severity level is completely non-disruptive.
|
|
# switch to warning or error if you want to prompt the user.
|
|
if ! hash clang-format >/dev/null; then
|
|
echo "advice"
|
|
echo "clang-format not found in user's PATH; not linting file."
|
|
echo "===="
|
|
exit 0
|
|
fi
|
|
if ! git rev-parse --git-dir >/dev/null; then
|
|
echo "advice"
|
|
echo "not in git repostitory; not linting file."
|
|
echo "===="
|
|
exit 0
|
|
fi
|
|
|
|
src_file="${1}"
|
|
original_file="$(mktemp)"
|
|
formatted_file="$(mktemp)"
|
|
readonly src_file
|
|
readonly original_file
|
|
readonly formatted_file
|
|
cp -p "${src_file}" "${original_file}"
|
|
cp -p "${src_file}" "${formatted_file}"
|
|
|
|
cleanup() {
|
|
rc=$?
|
|
rm "${formatted_file}" "${original_file}"
|
|
exit ${rc}
|
|
}
|
|
trap 'cleanup' INT HUP QUIT TERM EXIT
|
|
|
|
# Arcanist can filter out lint messages for unchanged lines, but for that, we
|
|
# need to generate line by line lint messages. Instead, we generate one lint
|
|
# message on line 1, char 1 with file content edited using clang-format-diff.py
|
|
#
|
|
# We do not use git-clang-format because it wants to modify the index,
|
|
# and arc is already holding the lock.
|
|
#
|
|
# We do not look for clang-format-diff or clang-format-diff.py in the PATH
|
|
# because whether/how these are installed differs between distributions,
|
|
# and we have an executable copy in the tree anyway.
|
|
arc_base_commit=$(arc which --show-base)
|
|
git diff-index -U0 "${arc_base_commit}" "${src_file}" \
|
|
| clang/tools/clang-format/clang-format-diff.py -style file -i -p1
|
|
|
|
cp -p "${src_file}" "${formatted_file}"
|
|
cp -p "${original_file}" "${src_file}"
|
|
if ! diff -q "${src_file}" "${formatted_file}" > /dev/null ; then
|
|
echo "autofix"
|
|
echo "clang-format suggested style edits found:"
|
|
echo "1,1" # line,char of start of replacement.
|
|
cat "${src_file}"
|
|
echo ">>>>"
|
|
cat "${formatted_file}"
|
|
echo "<<<<"
|
|
fi
|