OILS / devtools / format.sh View on Github | oilshell.org

151 lines, 80 significant
1#!/usr/bin/env bash
2#
3# Run yapf formatter; it's installed in ~/wedge/ by build/deps.sh
4#
5# Usage:
6# test/format.sh <function name>
7
8REPO_ROOT=$(cd "$(dirname $0)/.."; pwd)
9
10source build/dev-shell.sh # python3 in $PATH
11source devtools/run-task.sh
12
13# Hack to prevent interference. TODO: Make a separate wedge for yapf.
14unset PYTHONPATH
15
16. build/common.sh # $CLANG_DIR
17
18set -o nounset
19set -o pipefail
20set -o errexit
21shopt -s strict:all 2>/dev/null || true # dogfood for OSH
22
23#
24# Python
25#
26
27readonly YAPF_VENV='_tmp/yapf-venv'
28
29install-yapf() {
30 local venv=$YAPF_VENV
31
32 rm -r -f -v $venv
33
34 python3 -m venv $venv
35
36 . $venv/bin/activate
37
38 # 0.40.1 is the 2023-06-20 release
39 #
40 # Pin the version so formatting is stable!
41
42 python3 -m pip install 'yapf == 0.40.1'
43
44 yapf-version
45}
46
47yapf-version() {
48 . $YAPF_VENV/bin/activate
49 python3 -m yapf --version
50}
51
52# For now, run yapf on specific files. TODO: could query git for the files
53# that are are different from master branch, and run it on those.
54yapf-files() {
55 . $YAPF_VENV/bin/activate
56 python3 -m yapf -i "$@"
57}
58
59yapf-known() {
60 ### yapf some files that have been normalized
61
62 time yapf-files \
63 {asdl,benchmarks,builtin,core,data_lang,doctools,frontend,lazylex,mycpp,mycpp/examples,osh,spec/*,yaks,ysh}/*.py \
64 */NINJA_subgraph.py
65}
66
67yapf-changed() {
68 branch="${1:-master}"
69
70 #git diff --name-only .."$branch" '*.py'
71
72 git diff --name-only .."$branch" '*.py' \
73 | xargs --no-run-if-empty -- $0 yapf-files
74}
75
76#
77# Doc strings - one off
78#
79
80install-docformatter() {
81 python3 -m pip install docformatter
82}
83
84docstrings() {
85 ### Format docstrings - NOT done automatically, because it can mangle them
86
87 # Requires manual fix-up
88
89 #time test/lint.sh py2-files-to-lint \
90 # | xargs --verbose -- python3 -m docformatter --in-place
91
92 python3 -m docformatter --in-place lazylex/*.py
93}
94
95#
96# C++
97#
98
99clang-format() {
100 # See //.clang-format for the style config.
101 $CLANG_DIR/bin/clang-format --style=file "$@"
102}
103
104readonly -a CPP_FILES=(
105 {asdl,core}/*.cc
106 benchmarks/*.c
107 cpp/*.{c,cc,h}
108 data_lang/*.{c,cc,h}
109 mycpp/*.{cc,h}
110 mycpp/demo/*.{cc,h}
111 demo/*.c
112 doctools/*.{h,cc}
113 yaks/*.h
114
115 # Could add pyext, but they have sort of a Python style
116 # pyext/fanos.c
117)
118
119cpp-files() {
120 shopt -s nullglob
121 for file in "${CPP_FILES[@]}"; do
122
123 echo $file
124 done
125}
126
127all-cpp() {
128 # see build/common.sh
129 if test -n "$CLANG_IS_MISSING"; then
130 log ''
131 log " *** $0: Did not find $CLANG_DIR_1"
132 log " *** Run deps/from-binary.sh to get it"
133 log ''
134 return 1
135 fi
136
137 cpp-files | egrep -v 'greatest.h' | xargs -- $0 clang-format -i
138 git diff
139}
140
141test-asdl-format() {
142 ### Test how clang-format would like our generated code
143
144 local file=${1:-_gen/asdl/hnode.asdl.h}
145
146 local tmp=_tmp/hnode
147 clang-format $file > $tmp
148 diff -u $file $tmp
149}
150
151run-task "$@"