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