OILS / devtools / release-note.sh View on Github | oils.pub

283 lines, 62 significant
1#!/usr/bin/env bash
2#
3# Usage:
4# devtools/release-note.sh <function name>
5#
6# Example:
7# $0 fetch-issues
8# $0 write-template
9
10set -o nounset
11set -o pipefail
12set -o errexit
13
14source build/dev-shell.sh # PYTHONPATH
15source devtools/release-version.sh # for escape-segments
16
17readonly OILS_VERSION=$(head -n 1 oils-version.txt)
18readonly PREV_VERSION='0.26.0'
19
20# adapted from release-version.sh
21_git-changelog-body() {
22 local commit=$1
23
24 # - a trick for HTML escaping (avoid XSS): surround %s with unlikely bytes,
25 # \x00 and \x01. Then pipe Python to escape.
26 # --reverse makes it go in forward chronlogical order.
27
28 # %x00 generates the byte \x00
29 local format='<tr>
30 <td><a class="checksum"
31 href="https://github.com/oils-for-unix/oils/commit/%H">%h</a>
32 </td>
33 <td>%x00%an%x01</td>
34 <td class="subject">%x00%s%x01</td>
35 </tr>'
36 git log \
37 --reverse \
38 --pretty="format:$format" \
39 --date=short \
40 -n 1 \
41 $commit \
42 | escape-segments
43}
44
45contrib-commit-table() {
46 # Filter out my commits, then pass back to git log
47
48 # 2023-07: Deoptimized due to git breakage
49 # https://stackoverflow.com/questions/6889830/equivalence-of-git-log-exclude-author
50
51 git log --format='%H %an' "release/$PREV_VERSION..release/$OILS_VERSION" |
52 grep -v 'Andy C' |
53 cut -d ' ' -f 1 |
54 xargs -n 1 $0 _git-changelog-body
55
56 #xargs -n 1 -- git log -n 1
57}
58
59fetch-issues() {
60 local url='https://api.github.com/repos/oils-for-unix/oils/issues?labels=pending-release'
61 # For Oils 0.24.0
62 #local url='https://api.github.com/repos/oils-for-unix/oils/issues?labels=pending-release-2'
63 curl "$url" > _tmp/issues.json
64}
65
66issues-table() {
67 cat _tmp/issues.json | devtools/services/github_issues.py
68}
69
70readonly DATE_DIR=$(date +%Y/%m)
71readonly BLOG_DIR="../oils.pub/blog/$DATE_DIR"
72
73write-template() {
74 ### New blog post
75
76 local out=$BLOG_DIR/_release-$OILS_VERSION.md
77 print-template > $out
78 echo "Wrote $out"
79}
80
81write-zulip-thread() {
82 local bot_email=$1
83 local bot_api_key=$2
84 local version=${3:-$OILS_VERSION}
85
86 local out=$BLOG_DIR/release-thread-$version.txt
87 devtools/services/zulip.sh print-thread \
88 "$bot_email" "$bot_api_key" oil-dev "Oils $version Release" \
89 | tee $out
90
91 echo
92 echo "Wrote $out"
93}
94
95preview-template() {
96 local out=_tmp/release-note.html
97
98 # This isn't right because it doesn't split the --- front matter
99 # But good enough for now
100
101 print-template | doctools/cmark.py > $out
102 log "Wrote $out"
103}
104
105print-template() {
106 local metric_prev=${1:-$PREV_VERSION}
107
108 cat <<EOF
109---
110title: Oils $OILS_VERSION - Foo Foo
111date: $(date +%Y/%m/%d)
112css_file: blog-bundle-v6.css
113body_css_class: width35
114default_highlighter: oil-sh
115tags: oil-release
116comments_url: TODO
117published: no
118---
119
120This is the latest version of Oils, a Unix shell that's our upgrade path from
121[bash][]:
122
123[bash]: \$xref
124
125<div class="attention">
126
127[Oils version $OILS_VERSION][release-index] - Source tarballs and documentation.
128
129</div>
130
131To build and run it, follow the instructions in [INSTALL.txt][]. The wiki has
132tips on [How To Test OSH](\$wiki).
133
134If you're new to the project, see [Why Create a New Shell?][why-oil] and posts
135tagged #[FAQ](\$blog-tag).
136
137[INSTALL.txt]: /release/$OILS_VERSION/doc/INSTALL.html
138[github-bugs]: https://github.com/oils-for-unix/oils/issues
139[why-oil]: ../../2021/01/why-a-new-shell.html
140[release-index]: /release/$OILS_VERSION/
141
142[oilshell.zulipchat.com]: http://oilshell.zulipchat.com/
143
144<div id="toc">
145</div>
146
147I'm trying something different this release. These release notes are
148semi-automated with a shell script! See the [last
149post](../02/good-parts-sketch.html) in #[shell-the-good-parts](\$blog-tag).
150
151## Closed Issues
152
153<table>
154EOF
155
156 issues-table
157
158 cat <<EOF
159</table>
160
161## Commit Log
162
163Here are the commits from other contributors. You can also view the [full
164changelog][changelog].
165
166[changelog]: /release/$OILS_VERSION/changelog.html
167
168<table>
169EOF
170
171 contrib-commit-table
172
173 cat <<EOF
174</table>
175
176## Documentation Updated
177
178- [Known Differences](/release/$OILS_VERSION/doc/known-differences.html)
179- [Interpreter State](/release/$OILS_VERSION/doc/interpreter-state.html) - still
180 a draft.
181
182### Wiki Pages
183
184- [How Interactive Shells Work](https://github.com/oils-for-unix/oils/wiki/How-Interactive-Shells-Work)
185
186
187## What's Next?
188
189Here are some notable Open Issues
190
191- [Provide APIs to allow users to write their own line editor / interactive
192interface](\$issue:663)
193
194## Appendix: Metrics for the $OILS_VERSION Release
195
196These metrics help me keep track of the project. Let's compare this release
197with the previous one, version [$metric_prev](/release/$metric_prev).
198
199[spec-test]: \$xref:spec-test
200
201### Spec Tests
202
203The Python reference implementation foo foo
204
205- [OSH spec tests for $metric_prev](https://oils.pub/release/$metric_prev/test/spec.wwz/osh-py/index.html): **2023** tests,
206**1789** passing, **91** failing
207- [OSH spec tests for $OILS_VERSION](https://oils.pub/release/$OILS_VERSION/test/spec.wwz/osh-py/index.html): **2042** tests, **1814** passing, **89** failing
208
209And the C++ translation foo foo
210
211- [C++ spec tests for $metric_prev](https://oils.pub/release/$metric_prev/test/spec.wwz/osh-cpp/compare.html) - **1684** of **1792** passing
212- [C++ spec tests for $OILS_VERSION](https://oils.pub/release/$OILS_VERSION/test/spec.wwz/osh-cpp/compare.html) - **1801** of **1817** passing
213
214YSH got a lot of new behavior:
215
216- [YSH spec tests for $metric_prev](https://oils.pub/release/$metric_prev/test/spec.wwz/ysh-py/index.html): **561** tests, **514** passing, **47** failing
217- [YSH spec tests for $OILS_VERSION](https://oils.pub/release/$OILS_VERSION/test/spec.wwz/ysh-py/index.html): **630** tests, **571** passing, **59** failing
218
219And the C++ tarball is catching up rapidly:
220
221- [YSH C++ spec tests for $metric_prev](https://oils.pub/release/$metric_prev/test/spec.wwz/ysh-cpp/compare.html): **357** of **514** passing, delta **157**
222- [YSH C++ spec tests for $OILS_VERSION](https://oils.pub/release/$OILS_VERSION/test/spec.wwz/ysh-cpp/compare.html): **492** of **569** passing, delta **77**
223
224
225### Benchmarks
226
227Bar Bar
228
229- [Parser Performance for $metric_prev](https://oils.pub/release/$metric_prev/benchmarks.wwz/osh-parser/): **21.8**
230 thousand irefs per line
231- [Parser Performance for $OILS_VERSION](https://oils.pub/release/$OILS_VERSION/benchmarks.wwz/osh-parser/): **26.0**
232 thousand irefs per line
233
234G G
235
236- [benchmarks/gc for $metric_prev](https://oils.pub/release/$metric_prev/benchmarks.wwz/gc/): \`parse.configure-coreutils\`
237 **1.83 M** objects comprising **62.1 MB**, max RSS **68.9 MB**
238- [benchmarks/gc for $OILS_VERSION](https://oils.pub/release/$OILS_VERSION/benchmarks.wwz/gc/): \`parse.configure-coreutils\` **1.83 M** objects comprising **65.0 MB**, max RSS **69.3 MB**
239
240G G
241
242- [benchmarks/gc-cachegrind for $metric_prev](https://oils.pub/release/$metric_prev/benchmarks.wwz/gc-cachegrind/) - \`fib\` takes **61.6** million irefs, mut+alloc+free+gc
243- [benchmarks/gc-cachegrind for $OILS_VERSION](https://oils.pub/release/$OILS_VERSION/benchmarks.wwz/gc-cachegrind/) - \`fib\` takes **65.4** million irefs, mut+alloc+free+gc
244
245
246
247Foo Foo
248
249- [Runtime Performance for $metric_prev](https://oils.pub/release/$metric_prev/benchmarks.wwz/osh-runtime/): **68.7** and **56.9** seconds running CPython's \`configure\`
250- [Runtime Performance for $OILS_VERSION](https://oils.pub/release/$OILS_VERSION/benchmarks.wwz/osh-runtime/):
251 **35.2** and **22.5** seconds running CPython's \`configure\`
252- [bash](\$xref): **26.8** and **16.2** seconds running CPython's \`configure\`
253
254
255### Code Size
256
257The executable spec foo foo
258
259Significant lines:
260
261- [cloc for $metric_prev](https://oils.pub/release/$metric_prev/pub/metrics.wwz/line-counts/cloc-report.txt):
262 **19,581** lines of Python and C, **355** lines of ASDL
263- [cloc for $OILS_VERSION](https://oils.pub/release/$OILS_VERSION/pub/metrics.wwz/line-counts/cloc-report.txt):
264 **19,491** lines of Python and C, **363** lines of ASDL
265
266Code in the \`oils-for-unix\` C++ tarball, much of which is generated:
267
268- [oil-cpp for $metric_prev](https://oils.pub/release/$metric_prev/pub/metrics.wwz/line-counts/oil-cpp.txt) - **86,985** lines
269- [oil-cpp for $OILS_VERSION](https://oils.pub/release/$OILS_VERSION/pub/metrics.wwz/line-counts/oil-cpp.txt) - **90,682** lines
270
271Compiled binary size:
272
273- [ovm-build for $metric_prev](https://oils.pub/release/$metric_prev/benchmarks.wwz/ovm-build/):
274 **1.18 MB** of native code (under GCC)
275- [ovm-build for $OILS_VERSION](https://oils.pub/release/$OILS_VERSION/benchmarks.wwz/ovm-build/):
276 **1.23 MB** of native code (under GCC)
277
278&nbsp;
279
280EOF
281}
282
283"$@"