1 | #!/usr/bin/env bash
|
2 | #
|
3 | # Stats about build artifacts.
|
4 | #
|
5 | # Usage:
|
6 | # ./metrics.sh <function name>
|
7 |
|
8 | set -o nounset
|
9 | set -o pipefail
|
10 | set -o errexit
|
11 |
|
12 | source metrics/source-code.sh # for ASDL counts
|
13 |
|
14 | _banner() {
|
15 | echo
|
16 | echo "$@"
|
17 | echo
|
18 | }
|
19 |
|
20 | _cloc-header() {
|
21 | _banner 'SIGNIFICANT LINES OF CODE'
|
22 | }
|
23 |
|
24 | _wc-header() {
|
25 | _banner 'PHYSICAL LINES OF CODE'
|
26 | }
|
27 |
|
28 | _native-deps() {
|
29 | local app_name=${1:-oil}
|
30 | find _tmp/${app_name}-tar-test -type f -a -name '*.[ch]'
|
31 | }
|
32 |
|
33 | linecount-nativedeps() {
|
34 | _cloc-header
|
35 | _native-deps | xargs cloc
|
36 | echo
|
37 |
|
38 | _wc-header
|
39 | _native-deps | xargs wc -l | sort -n
|
40 | }
|
41 |
|
42 | readonly BYTECODE='bytecode-opy'
|
43 |
|
44 | _py-deps() {
|
45 | local app_name=${1:-oil}
|
46 | awk '/\.py$/ { print $1 }' _build/$app_name/${BYTECODE}-manifest.txt
|
47 | }
|
48 |
|
49 | linecount-pydeps() {
|
50 | _cloc-header
|
51 | _py-deps | xargs cloc
|
52 | echo
|
53 |
|
54 | _wc-header
|
55 | _py-deps | sort | uniq | xargs wc -l | sort -n
|
56 |
|
57 | }
|
58 |
|
59 | _oils-cpp() {
|
60 | # The CI runs devtools/release-native.sh test-tar
|
61 | find . \( -name '*.cc' -o -name '*.h' \) -a -printf '%P\n'
|
62 | }
|
63 |
|
64 | linecount-oils-cpp() {
|
65 | local first=_tmp/native-tar-test
|
66 |
|
67 | # The release runs extract-for-benchmarks
|
68 | local version
|
69 | version=$(head -n 1 oil-version.txt)
|
70 | local second="../benchmark-data/src/oils-for-unix-$version"
|
71 |
|
72 | local dir
|
73 | if test -d "$first"; then
|
74 | dir=$first
|
75 | elif test -d "$second"; then
|
76 | dir=$second
|
77 | else
|
78 | die "Couldn't find $first or $second"
|
79 | fi
|
80 |
|
81 | pushd $dir > /dev/null
|
82 |
|
83 | if command -v cloc; then # CI might not have it
|
84 | _cloc-header
|
85 | _oils-cpp | xargs cloc
|
86 | echo
|
87 | fi
|
88 |
|
89 | _wc-header
|
90 | _oils-cpp | sort | uniq | xargs wc -l | sort -n
|
91 |
|
92 | popd > /dev/null
|
93 | }
|
94 |
|
95 | # Without generated code. This is a fair comparison against bash, because
|
96 | # we include everything shipped with the tarball, but count source files
|
97 | # rather than generated code.
|
98 | _py-deps-src-only() {
|
99 | metrics/tarball.sh _py-deps | grep -v _devbuild
|
100 | }
|
101 |
|
102 | linecount-pydeps-src-only() {
|
103 | _cloc-header
|
104 | _py-deps-src-only | xargs cloc
|
105 |
|
106 | # Copied from osh-cloc in metrics/source-code.sh
|
107 | echo
|
108 | echo 'ASDL SCHEMAS (non-blank non-comment lines)'
|
109 | asdl-cloc "${ASDL_FILES[@]}"
|
110 |
|
111 | echo
|
112 | _wc-header
|
113 | _py-deps-src-only | sort | uniq | xargs wc -l | sort -n
|
114 |
|
115 | echo
|
116 | echo 'ASDL SCHEMAS'
|
117 | wc -l "${ASDL_FILES[@]}"
|
118 | }
|
119 |
|
120 | # hello: 1.41 MB native + 145 KB = 1.56 MB bundle
|
121 | # oil: 1.65 MB native + 642 KB = 2.30 MB bundle
|
122 | bundle-size() {
|
123 | ls -l _build/*/bytecode-*.zip _build/*/ovm _bin/*.ovm
|
124 | }
|
125 |
|
126 | pyc-files() {
|
127 | local app_name=${1:-oil}
|
128 | awk '/\.pyc$/ { print $1 }' _build/$app_name/${BYTECODE}-manifest.txt
|
129 | }
|
130 |
|
131 | # Print table of [md5 pyc path]
|
132 | pyc-md5() {
|
133 | pyc-files "$@" | xargs bin/opyc dis-md5
|
134 | }
|
135 |
|
136 | _tar-lines() {
|
137 | linecount-nativedeps "$@"
|
138 | echo
|
139 | linecount-pydeps "$@"
|
140 | }
|
141 |
|
142 | # 144.6 K lines of C
|
143 | # 6.4 K lines Python.
|
144 | hello-tar-lines() {
|
145 | _tar-lines hello
|
146 | }
|
147 |
|
148 | # 165.8 K lines of C (biggest: posixmodule.c, unicodeobject.c)
|
149 | # 30.8 K lines Python (biggest:
|
150 | oil-tar-lines() {
|
151 | _tar-lines oil
|
152 | }
|
153 |
|
154 | "$@"
|