forked from digital-asset/daml
-
Notifications
You must be signed in to change notification settings - Fork 0
/
fmt.sh
executable file
·151 lines (136 loc) · 5.64 KB
/
fmt.sh
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#!/usr/bin/env bash
# Copyright (c) 2021 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Run formatters and linter, anything platform-independent and quick
#
# Usage: ./fmt.sh [--test]
set -euo pipefail
cd "$(dirname "$0")"
# load the dev-env
eval "$(dev-env/bin/dade-assist)"
## Config ##
is_test=
scalafmt_args=()
javafmt_args=(--set-exit-if-changed --replace)
diff_mode=false
dade_copyright_arg=update
buildifier_target=//:buildifier-fix
## Functions ##
log() {
echo "fmt.sh: $*" >&2
}
run() {
echo "$ ${*%Q}"
"$@"
ret=$?
if [[ $is_test = 1 && $ret -gt 0 ]]; then
log "command failed with return $ret"
log
log "run ./fmt.sh to fix the issue"
exit 1
fi
return 0
}
# We do not run on deleted files, or files that have been added since we last rebased onto main.
check_diff() {
# $1 merge_base
# $2 regex
# "${@:3}" command
changed_files=$(git diff --name-only --diff-filter=ACMRT "$1" | grep $2 || [[ $? == 1 ]])
if [[ -n "$changed_files" ]]; then
run "${@:3}" ${changed_files[@]:-}
else
echo "No changed file to check matching '$2', skipping."
fi
}
## Main ##
while [[ $# -gt 0 ]]; do
case "$1" in
-h | --help)
cat <<USAGE
Usage: ./fmt.sh [options]
Options:
-h, --help: shows this help
--test: only test for formatting changes, used by CI
USAGE
exit
;;
--test)
shift
is_test=1
scalafmt_args+=(--test)
javafmt_args=(--set-exit-if-changed --dry-run)
dade_copyright_arg=check
buildifier_target=//:buildifier
;;
--diff)
shift
merge_base="$(git merge-base origin/main HEAD)"
scalafmt_args+=('--mode=diff' "--diff-branch=${merge_base}")
diff_mode=true
;;
*)
echo "fmt.sh: unknown argument $1" >&2
exit 1
;;
esac
done
echo "\
─────────────────────────────▄██▄
──FORMAT ALL THE THINGS!!!───▀███
────────────────────────────────█
───────────────▄▄▄▄▄────────────█
──────────────▀▄────▀▄──────────█
──────────▄▀▀▀▄─█▄▄▄▄█▄▄─▄▀▀▀▄──█
─────────█──▄──█────────█───▄─█─█
─────────▀▄───▄▀────────▀▄───▄▀─█
──────────█▀▀▀────────────▀▀▀─█─█
──────────█───────────────────█─█
▄▀▄▄▀▄────█──▄█▀█▀█▀█▀█▀█▄────█─█
█▒▒▒▒█────█──█████████████▄───█─█
█▒▒▒▒█────█──██████████████▄──█─█
█▒▒▒▒█────█───██████████████▄─█─█
█▒▒▒▒█────█────██████████████─█─█
█▒▒▒▒█────█───██████████████▀─█─█
█▒▒▒▒█───██───██████████████──█─█
▀████▀──██▀█──█████████████▀──█▄█
──██───██──▀█──█▄█▄█▄█▄█▄█▀──▄█▀
──██──██────▀█─────────────▄▀▓█
──██─██──────▀█▀▄▄▄▄▄▄▄▄▄▀▀▓▓▓█
──████────────█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█
──███─────────█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█
──██──────────█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█
──██──────────█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█
──██─────────▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█
──██────────▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█
──██───────▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▌
──██──────▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▌
──██─────▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▌
──██────▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▌
"
# Check for correct copyrights
run dade-copyright-headers "$dade_copyright_arg" .
# We do test hlint via Bazel rules but we run it separately
# to get linting failures early.
if [ "$diff_mode" = "true" ]; then
check_diff $merge_base '\.hs$' hlint -j4
check_diff $merge_base '\.java$' javafmt "${javafmt_args[@]:-}"
else
run hlint -j4 --git
java_files=$(find . -name "*.java")
if [[ -z "$java_files" ]]; then
echo "Unexpected: no Java file in the repository"
exit 1
fi
run javafmt "${javafmt_args[@]:-}" ${java_files[@]:-}
fi
# check for scala code style
run scalafmt "${scalafmt_args[@]:-}"
# check for Bazel build files code formatting
run bazel run "$buildifier_target"
# Note that we cannot use a symlink here because Windows.
if ! diff .bazelrc compatibility/.bazelrc >/dev/null; then
echo ".bazelrc and compatibility/.bazelrc are out of sync:"
diff -u .bazelrc compatibility/.bazelrc
fi