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 [ -z "${PROGRAM}" ] || { echo >&2 'Need $PROGRAM'; exit 1; }
6 [ -z "${UPROGRAM}" ] || { echo >&2 'Need $UPROGRAM'; exit 1; }
7 [ -z "${UPLOAD}" ] || { echo >&2 'Need $UPLOAD URL for scp(1)'; exit 1; }
9 [ -z "${ACCOUNT}" ] || { echo >&2 'Need mailx(1) -A $ACCOUNT'; exit 1; }
10 [ -z "${MAILTO}" ] || { echo >&2 'Need $MAILTO for announcement'; exit 1; }
11 [ -z "${MAILBCC}" ] || { echo >&2 'Need $MAILBCC for announcement'; exit 1; }
15 ORIG_LC_ALL=${LC_ALL} LC_ALL=C
18 DATE_MAN=`date -u +'%b %d, %Y'`
19 DATE_ISO=`date -u +%Y-%m-%d`
23 [ ${#} -gt 0 ] && printf '%s ' "${@}"
34 headref="`git rev-parse --verify HEAD`"
36 for i in `git rev-parse --branches=stable master^{commit}`; do
37 if [ ${headref} = ${i} ]; then
42 if [ -z "${brref}" ]; then
43 echo >&2 'Not on the [master] or a [stable/*] branch'
46 if [ "`git status --porcelain --ignored |
47 awk 'BEGIN{no=0}{++no}END{print no}'`" -ne 0 ]; then
48 echo >&2 'Directory not clean, see git status --ignored'
52 echo 'Preparing a release on commit '"${headref}"
53 brname=`git symbolic-ref --short HEAD`
54 echo ' That is '"${brname}"
55 printf ' Name of release tag: '
58 vmaj=`{ echo ${VERSION}; } | sed -e 's/^\([^.]\{1,\}\).*/\1/'`
59 vmin=`{ echo ${VERSION}; } | sed -e 's/^[^.]\{1,\}\.\([^.]\{1,\}\).*/\1/'`
60 [ ${vmin} = ${VERSION} ] && VERSION=${VERSION}.0 vmin=0
61 vupd=`{ echo ${VERSION}; } |
62 sed -e 's/^[^.]\{1,\}\.[^.]\{1,\}\.\([^.-]\{1,\}\).*/\1/'`
63 [ ${vupd} = ${VERSION} ] && VERSION=${VERSION}.0 vupd=0
66 if yesno 'Is '${PROGRAM}' <v'${REL}'> correct?'; then :; else
67 echo >&2 'Bailing out'
71 stblbrname=stable/v${vmaj}.${vmin}
72 brref=`git rev-parse --verify ${stblbrname} 2>/dev/null`
73 if [ -z "${brref}" ]; then
74 if yesno 'Create and switch to new branch '"${stblbrname}"; then
75 git checkout -b ${stblbrname}
77 elif [ ${brref} != ${headref} ] || [ ${brname} != ${stblbrname} ]; then
78 echo >&2 "For ${REL} we should be on ${stblbrname}, not ${brname}"
79 echo >&2 'Bailing out'
83 relbrname=release/v${VERSION}
84 brref=`git rev-parse --verify ${relbrname} 2>/dev/null`
85 if [ -z "${brref}" ]; then :; else
86 echo >&2 "The ${relbrname} already exists"
87 echo >&2 'Bailing out'
92 echo 'Updating stable/ files to match the release'
94 if [ -f version.h ] && [ -f mk-mk.in ]; then
95 grep=grep sed=sed cmp=cmp mv=mv make -f mk-mk.in _update-version
100 LC_ALL=${ORIG_LC_ALL} git commit -S -m "Bump ${UPROGRAM} v${REL}, ${DATE_ISO}"
101 LC_ALL=${ORIG_LC_ALL} git tag -s -f \
102 -m "Bump ${UPROGRAM} v${REL}, ${DATE_ISO}" "v${REL}"
105 echo 'Creating release/ branch and files'
107 git checkout -b ${relbrname}
109 git rm -f .gitignore .mailmap TODO
112 LC_ALL=${ORIG_LC_ALL} git commit -S \
113 -m "Bump ${UPROGRAM} v${REL}.ar, ${DATE_ISO}"
114 LC_ALL=${ORIG_LC_ALL} git tag -s -f \
115 -m "Bump ${UPROGRAM} v${REL}.ar, ${DATE_ISO}" "v${REL}.ar"
117 if yesno 'Shall i update release/latest "symlink"?'; then
118 git update-ref refs/heads/release/latest ${relbrname}
120 if yesno 'Shall i update release/stable "symlink"?'; then
121 git update-ref refs/heads/release/stable ${relbrname}
127 if `git rev-parse --verify timeline^{commit} >/dev/null 2>&1` &&
128 yesno 'Shall i update [timeline]?'; then
129 git checkout timeline
131 git archive --format=tar "v${REL}.ar" | tar -x -f -
133 LC_ALL=${ORIG_LC_ALL} git commit -S -m "${UPROGRAM} v${REL}.ar, ${DATE_ISO}"
139 git checkout ${stblbrname}
140 git log --no-walk --decorate --oneline --branches --remotes
141 yesno 'Push git(1) repo?' && git push
146 if yesno 'Create tarballs'; then
148 # Repack with standard tar(1) to avoid new-style headers
149 git archive --format=tar --prefix="${PROGRAM}-${REL}/" "v${REL}.ar" |
150 ( cd "${TMPDIR}" && tar -x -f - )
152 tar -c -f "${PROGRAM}-${REL}.tar" "${PROGRAM}-${REL}"
154 openssl sha1 "${PROGRAM}-${REL}.tar" >> "${PROGRAM}-${REL}.cksum"
155 openssl sha256 "${PROGRAM}-${REL}.tar" >> "${PROGRAM}-${REL}.cksum"
156 openssl sha512 "${PROGRAM}-${REL}.tar" >> "${PROGRAM}-${REL}.cksum"
157 gpg --detach-sign --armor "${PROGRAM}-${REL}.tar"
158 cat "${PROGRAM}-${REL}.tar.asc" >> "${PROGRAM}-${REL}.cksum"
160 < "${PROGRAM}-${REL}.tar" gzip > "${PROGRAM}-${REL}.tar.gz"
161 < "${PROGRAM}-${REL}.tar" xz -e -C sha256 > "${PROGRAM}-${REL}.tar.xz"
163 if yesno 'Upload archives'; then
165 echo "-put ${PROGRAM}-${REL}.tar"
166 echo "-rm ${PROGRAM}-latest.tar"
167 echo "-ln ${PROGRAM}-${REL}.tar ${PROGRAM}-latest.tar"
169 echo "-put ${PROGRAM}-${REL}.tar.gz"
170 echo "-rm ${PROGRAM}-latest.tar.gz"
171 echo "-ln ${PROGRAM}-${REL}.tar.gz ${PROGRAM}-latest.tar.gz"
173 echo "-put ${PROGRAM}-${REL}.tar.xz"
174 echo "-rm ${PROGRAM}-latest.tar.xz"
175 echo "-ln ${PROGRAM}-${REL}.tar.xz ${PROGRAM}-latest.tar.xz"
177 echo "-put ${PROGRAM}-${REL}.tar.asc"
178 echo "-rm ${PROGRAM}-latest.tar.asc"
179 echo "-ln ${PROGRAM}-${REL}.tar.asc ${PROGRAM}-latest.tar.asc"
181 echo "-chmod 0644 ${PROGRAM}-${REL}.tar*"
191 if yesno 'Send announcement mail?'; then
192 if `git rev-parse --verify announce^{blob}` >/dev/null 2>&1; then
193 git show announce > "${TMPDIR}/${PROGRAM}-${REL}.ann.mail"
195 echo > "${TMPDIR}/${PROGRAM}-${REL}.ann.mail"
197 if [ -n "`git ls-tree ${relbr} NEWS`" ]; then
198 git show ${relbr}:NEWS >> "${TMPDIR}/${PROGRAM}-${REL}.ann.mail"
201 LC_ALL=${ORIG_LC_ALL} ${MAILX} -A ${ACCOUNT}
202 -s "[ANNOUNCE] of ${UPROGRAM} v${REL}"
203 -q "${TMPDIR}/${PROGRAM}-${REL}.ann.mail"
204 -b ${MAILBCC} ${MAILTO}
207 # Finally remove the temporary instances than ran this
208 rm -f .git/mk-release.sh .git/mk-release.inc