1 #@ Include file for the mk-release.sh generic release builder.
2 #@ It also needs two hooks: update_stable_hook(), update_release_hook(),
3 #@ which need to "git add" what they have modified.
5 : ${PROGRAM:?"Need \$PROGRAM"}
6 : ${UPROGRAM:?"Need \$UPROGRAM"}
7 : ${MANUAL:?"May need \$MANUAL for announcement references"}
9 : ${UPLOAD:?"Need \$UPLOAD URL for scp(1)"}
12 : ${ACCOUNT:?"May need mailx(1) -A \$ACCOUNT"}
13 : ${MAILTO:?"May need \$MAILTO for announcement"}
14 : ${MAILBCC:?"May need \$MAILBCC for announcement"}
18 ORIG_LC_ALL=${LC_ALL} LC_ALL=C
21 DATE_MAN=`date -u +'%b %d, %Y'`
22 DATE_ISO=`date -u +%Y-%m-%d`
26 [ ${#} -gt 0 ] && printf '%s ' "${@}"
37 headref="`git rev-parse --verify HEAD`"
39 for i in `git rev-parse --branches=stable master^{commit}`; do
40 if [ ${headref} = ${i} ]; then
45 if [ -z "${brref}" ]; then
46 echo >&2 'Not on the [master] or a [stable/*] branch'
49 if [ "`git status --porcelain --ignored |
50 awk 'BEGIN{no=0}{++no}END{print no}'`" -ne 0 ]; then
51 echo >&2 'Directory not clean, see git status --ignored'
55 echo 'Preparing a release on commit '"${headref}"
56 #brname="`git branch | sed -e '/^* /b X' -e d -e :X -e 's/^* //'`"
57 brname=`git symbolic-ref --short HEAD`
58 echo ' That is '"${brname}"
59 printf ' Name of release tag: '
62 vmaj=`{ echo ${VERSION}; } | sed -e 's/^\([^.]\{1,\}\).*/\1/'`
63 vmin=`{ echo ${VERSION}; } | sed -e 's/^[^.]\{1,\}\.\([^.]\{1,\}\).*/\1/'`
64 [ ${vmin} = ${VERSION} ] && VERSION=${VERSION}.0 vmin=0
65 vupd=`{ echo ${VERSION}; } |
66 sed -e 's/^[^.]\{1,\}\.[^.]\{1,\}\.\([^.-]\{1,\}\).*/\1/'`
67 [ ${vupd} = ${VERSION} ] && VERSION=${VERSION}.0 vupd=0
70 if yesno 'Is '${PROGRAM}' <v'${REL}'> correct?'; then :; else
71 echo >&2 'Bailing out'
75 stblbrname=stable/v${vmaj}.${vmin}
76 brref=`git rev-parse --verify ${stblbrname} 2>/dev/null`
77 if [ -z "${brref}" ]; then
78 if yesno 'Create and switch to new branch '"${stblbrname}"; then
79 git checkout -b ${stblbrname}
81 elif [ ${brref} != ${headref} ] || [ ${brname} != ${stblbrname} ]; then
82 echo >&2 "For ${REL} we should be on ${stblbrname}, not ${brname}"
83 echo >&2 'Bailing out'
87 relbrname=release/v${VERSION}
88 brref=`git rev-parse --verify ${relbrname} 2>/dev/null`
89 if [ -z "${brref}" ]; then :; else
90 echo >&2 "The ${relbrname} already exists"
91 echo >&2 'Bailing out'
97 if yesno 'Shall '${PROGRAM}' v'${REL}' have a symbolic name?'; then
98 printf ' ..and it shall be known as: '
100 if yesno 'Is '"${RELSYM}"' correct?'; then :; else
101 echo >&2 'Bailing out'
104 stblmsg="Bump ${UPROGRAM} v${REL} (\"${RELSYM}\"), ${DATE_ISO}"
105 relmsg="Bump ${UPROGRAM} v${REL}.ar (\"${RELSYM}\"), ${DATE_ISO}"
106 RELSYM=" (\"${RELSYM}\")"
108 stblmsg="Bump ${UPROGRAM} v${REL}, ${DATE_ISO}"
109 relmsg="Bump ${UPROGRAM} v${REL}.ar, ${DATE_ISO}"
113 echo 'Updating stable/ files to match the release'
115 if [ -f version.h ] && [ -f mk-mk.in ]; then
116 grep=grep sed=sed cmp=cmp mv=mv make -f mk-mk.in _update-version
121 LC_ALL=${ORIG_LC_ALL} git commit -S -m "${stblmsg}"
122 LC_ALL=${ORIG_LC_ALL} git tag -s -f -m "${stblmsg}" v${REL}
126 if yesno 'Create release/ branch?'; then
127 git checkout -b ${relbrname}
129 git rm -f .gitignore .mailmap TODO mk-release.*
132 LC_ALL=${ORIG_LC_ALL} git commit -S -m "${relmsg}"
133 LC_ALL=${ORIG_LC_ALL} git tag -s -f -m "${relmsg}" v${REL}.ar
135 if yesno 'Shall i update release/latest "symlink"?'; then
136 git update-ref refs/heads/release/latest ${relbrname}
138 if yesno 'Shall i update release/stable "symlink"?'; then
139 git update-ref refs/heads/release/stable ${relbrname}
142 relbrname=${stblbrname}
148 if [ ${relbrname} != ${stblbrname} ] &&
149 `git rev-parse --verify timeline^{commit} >/dev/null 2>&1` &&
150 yesno 'Shall i update [timeline]?'; then
151 git checkout timeline
153 git archive --format=tar "v${REL}.ar" | tar -x -f -
155 LC_ALL=${ORIG_LC_ALL} git commit -S -m "${relmsg}"
161 [ ${relbrname} != ${stblbrname} ] && git checkout ${stblbrname}
162 git log --no-walk --decorate --oneline --branches --remotes
163 yesno 'Push git(1) repo?' && git push
168 if [ ${relbrname} != ${stblbrname} ] && yesno 'Create tarballs?'; then
171 # Repack with standard tar(1) to avoid new-style headers
172 git archive --format=tar --prefix="${PROGRAM}-${REL}/" v${REL}.ar |
173 ( cd "${TMPDIR}" && tar -x -f - )
176 tar -c -f "${PROGRAM}-${REL}.tar" "${PROGRAM}-${REL}"
177 < "${PROGRAM}-${REL}.tar" xz -e -C sha256 > "${PROGRAM}-${REL}.tar.xz"
178 < "${PROGRAM}-${REL}.tar" gzip > "${PROGRAM}-${REL}.tar.gz"
179 rm "${PROGRAM}-${REL}.tar"
181 openssl sha1 "${PROGRAM}-${REL}.tar.xz" >> "${PROGRAM}-${REL}.cksum"
182 openssl sha256 "${PROGRAM}-${REL}.tar.xz" >> "${PROGRAM}-${REL}.cksum"
183 openssl sha512 "${PROGRAM}-${REL}.tar.xz" >> "${PROGRAM}-${REL}.cksum"
184 gpg --detach-sign --armor "${PROGRAM}-${REL}.tar.xz"
185 cat "${PROGRAM}-${REL}.tar.xz.asc" >> "${PROGRAM}-${REL}.cksum"
187 openssl sha1 "${PROGRAM}-${REL}.tar.gz" >> "${PROGRAM}-${REL}.cksum"
188 openssl sha256 "${PROGRAM}-${REL}.tar.gz" >> "${PROGRAM}-${REL}.cksum"
189 openssl sha512 "${PROGRAM}-${REL}.tar.gz" >> "${PROGRAM}-${REL}.cksum"
190 gpg --detach-sign --armor "${PROGRAM}-${REL}.tar.gz"
191 cat "${PROGRAM}-${REL}.tar.gz.asc" >> "${PROGRAM}-${REL}.cksum"
198 # Announcement .txt and .html
200 if yesno 'Prepare announcement?'; then
202 { echo "${relmsg}"; echo; } > "${TMPDIR}/${PROGRAM}-${REL}.txt"
203 if [ -f .git/mk-release.txt ]; then
204 cat .git/mk-release.txt >> "${TMPDIR}/${PROGRAM}-${REL}.txt"
206 if [ -n "${bigballs}" ] && [ -f "${TMPDIR}/${PROGRAM}-${REL}.cksum" ]; then
207 echo >> "${TMPDIR}/${PROGRAM}-${REL}.txt"
208 cat "${TMPDIR}/${PROGRAM}-${REL}.cksum" >>\
209 "${TMPDIR}/${PROGRAM}-${REL}.txt"
211 if `git cat-file -e ${relbr}:NEWS 2>/dev/null`; then
212 echo >> "${TMPDIR}/${PROGRAM}-${REL}.txt"
213 git show ${relbr}:NEWS >> "${TMPDIR}/${PROGRAM}-${REL}.txt"
216 LC_ALL=${ORIG_LC_ALL} ${EDITOR} "${TMPDIR}/${PROGRAM}-${REL}.txt"
218 # HTML convert ready for S-Web42
220 < "${TMPDIR}/${PROGRAM}-${REL}.txt" awk -v manual="${MANUAL}" '
224 print "<?begin?><?mode icewatsm?><pre>"
236 while(match(s, /(\\?(http|ftp)s?\??:\/\/[^ ]*)/)){
237 pre = substr(s, 1, RSTART - 1)
238 mat = substr(s, RSTART, RLENGTH)
239 s = substr(s, RSTART + RLENGTH)
240 if("\\" == substr(mat, 1, 1))
244 if(match(mat, /^https\?/))
245 mat = "https" substr(xt = mat, RSTART + 6)
246 else if(match(mat, /^ftps\?/))
247 mat = "ftps" substr(xt = mat, RSTART + 5)
248 if(match(mat, /sdaoden\.eu/))
249 mat = "<?lref" (xt ? "t " : " ") mat (xt ? "<>" xt : "") "?>"
251 mat = "<?href" (xt ? "t " : " ") mat (xt ? "<>" xt : "") "?>"
260 /^[[:space:]]*s-.*-mode[[:space:]]*$/{
264 /ChangeLog|shortlog/{
293 /("[^"]+"|\*[^\*]+\*|`[^'${APO}']+'${APO}'|[-~][-\/:_.[:alnum:]]+|\$[_[:alnum:]]+)#[0-9]+(\|#_?[0-9]+)?/))
295 pre = substr(s, 1, RSTART - 1)
296 mat = substr(s, RSTART, RLENGTH)
297 s = substr(s, RSTART + RLENGTH)
299 if(match(mat, /\|#_?[0-9]+/)){
300 targ = substr(mat, RSTART + 2)
301 mat = substr(mat, 1, RSTART - 1)
303 match(mat, /#[0-9]+/)
304 targ = substr(mat, RSTART + 1, RLENGTH)
306 res = res pre "<?lreft " manual "#" targ "<>" mat "?>"
314 print "</pre><?end?>"
316 ' > "${TMPDIR}/.${PROGRAM}-ann.html"
324 if [ -n "${bigballs}" ] && yesno 'Upload archives'; then
329 echo "-put ${PROGRAM}-${REL}.tar.xz"
330 echo "-rm ${PROGRAM}-latest.tar.xz"
331 echo "-ln -s ${PROGRAM}-${REL}.tar.xz ${PROGRAM}-latest.tar.xz"
333 echo "-put ${PROGRAM}-${REL}.tar.gz"
334 echo "-rm ${PROGRAM}-latest.tar.gz"
335 echo "-ln -s ${PROGRAM}-${REL}.tar.gz ${PROGRAM}-latest.tar.gz"
337 echo "-put ${PROGRAM}-${REL}.tar.xz.asc"
338 echo "-rm ${PROGRAM}-latest.tar.xz.asc"
339 echo "-ln -s ${PROGRAM}-${REL}.tar.xz.asc ${PROGRAM}-latest.tar.xz.asc"
341 echo "-put ${PROGRAM}-${REL}.tar.gz.asc"
342 echo "-rm ${PROGRAM}-latest.tar.gz.asc"
343 echo "-ln -s ${PROGRAM}-${REL}.tar.gz.asc ${PROGRAM}-latest.tar.gz.asc"
345 if [ -n "${anntxt}" ]; then
346 echo "-put ${PROGRAM}-${REL}.txt"
347 echo "-rm ${PROGRAM}-latest.txt"
348 echo "-ln -s ${PROGRAM}-${REL}.txt ${PROGRAM}-latest.txt"
351 echo "-chmod 0644 ${PROGRAM}-${REL}.*"
360 if [ -n "${anntxt}" ] && yesno 'Send announcement mail?'; then
361 LC_ALL=${ORIG_LC_ALL} ${MAILX} -A ${ACCOUNT} \
362 -s "[ANN]ounce of ${UPROGRAM} v${REL}${RELSYM}" \
363 -q "${TMPDIR}/${PROGRAM}-${REL}.txt" \
364 -b ${MAILBCC} ${MAILTO}
367 # Finally remove the temporary instances than ran this
368 rm -f .git/mk-release.*