-
Notifications
You must be signed in to change notification settings - Fork 2
/
checklist.html
195 lines (177 loc) · 7.62 KB
/
checklist.html
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Nikola Release Checklist</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<script>
/*!
* Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)
* Copyright 2011-2024 The Bootstrap Authors
* Licensed under the Creative Commons Attribution 3.0 Unported License.
*/
(() => {
'use strict'
const getStoredTheme = () => localStorage.getItem('theme')
const setStoredTheme = theme => localStorage.setItem('theme', theme)
const getPreferredTheme = () => {
const storedTheme = getStoredTheme()
if (storedTheme) {
return storedTheme
}
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
}
const setTheme = theme => {
if (theme === 'auto') {
document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'))
} else {
document.documentElement.setAttribute('data-bs-theme', theme)
}
}
setTheme(getPreferredTheme())
const showActiveTheme = (theme, focus = false) => {
const themeSwitcher = document.querySelector('#bd-theme')
if (!themeSwitcher) {
return
}
const themeSwitcherText = document.querySelector('#bd-theme-text')
const activeThemeIcon = document.querySelector('.theme-icon-active use')
const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`)
const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href')
document.querySelectorAll('[data-bs-theme-value]').forEach(element => {
element.classList.remove('active')
element.setAttribute('aria-pressed', 'false')
})
btnToActive.classList.add('active')
btnToActive.setAttribute('aria-pressed', 'true')
activeThemeIcon.setAttribute('href', svgOfActiveBtn)
const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})`
themeSwitcher.setAttribute('aria-label', themeSwitcherLabel)
if (focus) {
themeSwitcher.focus()
}
}
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
const storedTheme = getStoredTheme()
if (storedTheme !== 'light' && storedTheme !== 'dark') {
setTheme(getPreferredTheme())
}
})
window.addEventListener('DOMContentLoaded', () => {
showActiveTheme(getPreferredTheme())
document.querySelectorAll('[data-bs-theme-value]')
.forEach(toggle => {
toggle.addEventListener('click', () => {
const theme = toggle.getAttribute('data-bs-theme-value')
setStoredTheme(theme)
setTheme(theme)
showActiveTheme(theme, true)
})
})
})
})()
</script>
<style>
ul {
list-style: none;
padding-left: 0; }
#counter {
position: fixed;
top: 5px;
right: 5px;
padding: 5px;
border: 1px solid var(--bs-border-color);
font-size: 2em;
transition: all 1s;
font-variant-numeric: tabular-nums;
border-radius: var(--bs-border-radius);
}
#counter.complete {
color: white;
background: var(--bs-success);
text-shadow: none;
}
</style>
</head>
<body>
<div class="container">
<div id="counter"><span id="current">0</span>/<span id="total">?</span></div>
<h1>Nikola Release Checklist (v17/2024-07-24)</h1>
<h2>Requirements</h2>
<p>In order to create a release, you need a bit of free time, ZSH installed, and a GPG setup.</p>
<h2>Preparation</h2>
<ul>
<li><input type="checkbox"> If you have a local clone of the releng repo: <code>git pull</code> first, refresh the page if necessary</li>
<li><input type="checkbox"> Get into the Nikola repo, make sure you are on the <code>master</code> branch and run <code>git pull origin master</code></li>
<li><input type="checkbox"> Pick a reasonable version number. Increase the last number (patch) or, if the changes <em>really</em> are significant, increase the second number (minor).</li>
</ul>
<h2>Writing announcements</h2>
<p>All announcements must include the <em>Greeting</em>, <em>What is Nikola?</em>, <em>Downloads</em>, and <em>Changes</em> blocks, in that order. Use the announcements in the Release Engineering repo as a template.</p>
<p>You may also add a <em>Key Changes since last release</em> block after <em>What is Nikola?</em>.</p>
<ul>
<li><input type="checkbox"> Write an announcement for GitHub Releases. It should use Markdown syntax and no word wrap.</li>
<li><input type="checkbox"> Write an announcement for e-mail. It should use reST-esque syntax, with word wrap at 70 columns.</li>
<li><input type="checkbox"> Write an announcement for the Nikola blog. Use <code>nikola new_post -et "Nikola v$VERSION is out"'!' -i path/to/blog.rst --tags 'nikola, planet, python, programming, release'</code> to import the announcement template (which you should then edit). Make sure to set the author name to your real name.</li>
</ul>
<h2>Release!</h2>
<p>Run the release script and hope everything works fine:</p>
<ul>
<li><input type="checkbox"> <code>scripts/release</code></li>
</ul>
<h2>GitHub Releases</h2>
<ul>
<li><input type="checkbox"> Create a GitHub release for this version by running <code>scripts/github-release.py</code> (pass announcement filename and <code>v$VERSION</code> as arguments)</li>
<li><input type="checkbox"> Open the release page in your browser and upload the release assets (<code>.tar.gz</code>, <code>.whl</code>) and their signatures (<code>.asc</code>) for this version</li>
</ul>
<h2>GitHub Issues</h2>
<ul>
<li><input type="checkbox"> Create milestone for next release</li>
<li><input type="checkbox"> Move outstanding issues to milestone for next release</li>
<li><input type="checkbox"> Close milestone for this release</li>
</ul>
<h2>Local update</h2>
<ul>
<li><input type="checkbox"> Use <code>pip install -e .</code> to reinstall Nikola from Git in your virtualenv (if applicable)</li>
</ul>
<h2>Website update</h2>
<ul>
<li><input type="checkbox"> Optionally regenerate the <code>cerulean</code> theme: <code>nikola subtheme -s cerulean -n cerulean</code></li>
<li><input type="checkbox"> Build and deploy the site</li>
<li><input type="checkbox"> Commit and push your changes to GitHub</li>
</ul>
<h2>E-mails</h2>
<ul>
<li><input type="checkbox"> Send the e-mail announcement to <a href="mailto:[email protected]">[email protected]</a>. You should sign it with GPG if possible.</li>
</ul>
<h2>Finishing up</h2>
<ul>
<li><input type="checkbox"> Give yourself a pat on the back!</li>
</ul>
</div>
<script>
// Completed task counter
// © 2015-2024 Chris Warrick. License: MIT
const max = document.querySelectorAll("input").length;
document.getElementById("total").innerText = max;
function updateCounter() {
const inp = document.querySelectorAll("input");
let count = 0;
for (let i = 0; i < inp.length; i++) {
if (inp[i].checked) {
count += 1;
}
}
document.getElementById("current").innerText = count;
if (count === max) {
document.getElementById("counter").classList.add("complete");
} else {
document.getElementById("counter").classList.remove("complete");
}
}
document.querySelectorAll("input").forEach(i => i.addEventListener("click", updateCounter));
updateCounter();
</script>
</body>
</html>