File: clang-format.sh

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (68 lines) | stat: -rwxr-xr-x 2,333 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/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 local 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 -f "${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