Use in-tree clang-format-diff.py as Arcanist linter

Summary:
The only guarantee there seems to be in the clang-format packaging is
that an executable called `clang-format` is in the PATH. Use the
in-tree `clang-format-diff.py` to avoid assuming anything else.

Also remove dead code for SVN repo and switch to `git diff-index` which
is the git plumbing equivalent of `git diff` in this case.

Reviewers: starsid, mehdi_amini, vitalybuka, fhahn, kadircet

Subscribers: llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D77428
This commit is contained in:
Scott Linder 2020-04-03 15:48:28 -04:00
parent 4faf05e5a3
commit ad08ecbd16

View file

@ -4,17 +4,23 @@ 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", # "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. # 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. # 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/ # 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`. # To skip running all linters when creating/updating a diff, use `arc diff --nolint`.
if ! hash clang-format-diff >/dev/null; then # advice severity level is completely non-disruptive.
# advice severity level is completely non-disruptive. # switch to warning or error if you want to prompt the user.
# switch to warning or error if you want to prompt the user. if ! hash clang-format >/dev/null; then
echo "advice" echo "advice"
echo "clang-format-diff not found in user's PATH; not linting file." 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 "====" echo "===="
exit 0 exit 0
fi fi
@ -37,14 +43,17 @@ trap 'cleanup' INT HUP QUIT TERM EXIT
# Arcanist can filter out lint messages for unchanged lines, but for that, we # 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 # 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. # message on line 1, char 1 with file content edited using clang-format-diff.py
if git rev-parse --git-dir >/dev/null; then #
arc_base_commit=$(arc which --show-base) # We do not use git-clang-format because it wants to modify the index,
# An alternative is to use git-clang-format. # and arc is already holding the lock.
git diff -U0 --no-color "${arc_base_commit}"| clang-format-diff -style file -i -p1 #
else # We do not look for clang-format-diff or clang-format-diff.py in the PATH
svn diff --diff-cmd=diff -x -U0 "${src_file}" | clang-format-diff -style LLVM -i # because whether/how these are installed differs between distributions,
fi # and we have an executable copy in the tree anyway.
arc_base_commit=$(arc which --show-base)
git diff-index -U0 "${arc_base_commit}" \
| clang/tools/clang-format/clang-format-diff.py -style file -i -p1
cp -p "${src_file}" "${formatted_file}" cp -p "${src_file}" "${formatted_file}"
cp -p "${original_file}" "${src_file}" cp -p "${original_file}" "${src_file}"