2 # No way I try to deal with a crippled sh just for POSIX foo.
4 # Copyright (C) 2009-2016 Joerg Jaspert <joerg@debian.org>
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License as
8 # published by the Free Software Foundation; version 2.
10 # This program is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 # A pipeline's return status is the value of the last (rightmost)
22 # command to exit with a non-zero status, or zero if all commands exit
25 # make sure to only use defined variables
27 # ERR traps should be inherited from functions too. (And command
28 # substitutions and subshells and whatnot, but for us the functions is
29 # the important part here)
32 # If the extglob shell option is enabled using the shopt builtin,
33 # several extended pattern matching operators are recognized. We use
34 # it for the POSSIBLEARGS and the first case ${ARGS} matching.
37 # And use one locale, no matter what the caller has set
41 # If run from crontab, CONFIGDIR will point to the correct dir
42 # where we find the vars file
43 configdir=${configdir:-"/srv/ftp-master.debian.org/dak/config/debian"}
44 # import the general variable set. (This will overwrite configdir, but
45 # it is expected to have the same value)
46 export SCRIPTVARS=${configdir}/vars
48 . "${configdir}/dinstall.functions"
51 # Get rid of tempfiles at the end
52 trap cleanup EXIT TERM HUP INT QUIT
55 echo "Fun with a pointrelease"
56 echo "Takes two args, suite and version"
57 echo "Default for suite is jessie, version defaults to last plus one"
61 while getopts ":hs:v:" OPTION; do
74 echo "Unknown option ${OPTION} given, try -h"
81 suitename=${suitename:-"jessie"}
82 suite=$(psql -qAtc "SELECT suite_name FROM suite WHERE codename='${suitename}'")
83 oldrev=$(psql -qAtc "SELECT version FROM suite WHERE codename='${suitename}'")
84 version=${version:-$(( ${oldrev##*.} + 1 ))}
85 PROGRAM="pointrelease_${suitename}"
89 stable) pusuite=proposed-updates ;;
90 oldstable) pusuite=oldstable-proposed-updates ;;
94 # set DEBUG if you want to see a little more logs
97 # common functions are "outsourced"
98 . "${configdir}/common"
100 # Timestamp when we started
101 NOW=$(date "+%Y.%m.%d-%H:%M:%S")
103 log "Point release for ${suite} (${suitename}); old version: ${oldrev}, new: ${newrev}"
104 log "Updates come from ${pusuite}"
107 pg_timestamp pre_${suite}_${newrev}
109 mkdir -p ${suitename}_${newrev}
110 cd ${suitename}_${newrev}
111 dak control-suite -l ${pusuite} > ${pusuite}.list
112 dak control-suite -l ${suite} > ${suite}.list
114 echo "Is there anything to skip in this release? If so, please enter source package names, whitespace seperated, if not just hit enter"
115 read -e -p "Source packages: " skiplist
116 if [[ -n ${skiplist} ]]; then
117 mv ${pusuite}.list ${pusuite}.list.ori
118 grep -vFf <(dak ls -f heidi -S -s ${pusuite} ${skip}) ${pusuite}.list.ori > ${pusuite}.list
121 log "Creating changelog"
122 tmpfile=$(mktemp -p "${TMPDIR}" changelog.XXXXXX)
123 dak make-changelog -s ${pusuite} -b ${suite} | cat - ${ftpdir}/dists/${suite}/ChangeLog > ${tmpfile}
124 chmod 0644 ${tmpfile}
125 mv ${tmpfile} ${ftpdir}/dists/${suite}/ChangeLog
126 if [[ -n ${skiplist} ]]; then
127 echo "Please edit to remove the changelogs for the skipped packages"
128 $EDITOR ${ftpdir}/dists/${suite}/ChangeLog
129 rm -f ${ftpdir}/dists/${suite}/ChangeLog~
132 dak control-suite --add ${suite} < ${pusuite}.list
133 dak control-suite --remove ${pusuite} < ${pusuite}.list
135 log "Cleaning changelogs from proposed-updates"
136 pumorguedir="${base}/morgue/queues/$(date +%Y/%m)"
137 mkdir -p "${pumorguedir}"
138 cd ${ftpdir}/dists/${pusuite}
139 mv -t "${pumorguedir}" -n -- *.changes
140 if [[ -n ${skiplist} ]]; then
141 for pack in ${skiplist}; do
142 mv -t "${ftpdir}/dists/${pusuite}" ${pumorguedir}/${pack}*.changes
146 log "Checking for r0 additions and propups"
147 cd ~/${suitename}_${newrev}
148 if [[ -f /srv/release.debian.org/www/${suitename}/${newrev%%.*}/${newrev}/${suitename}-r0-additions.cs ]]; then
149 cp /srv/release.debian.org/www/${suitename}/${newrev%%.*}/${newrev}/${suitename}-r0-additions.cs .
150 dak control-suite --add ${suitename}-r0 < ${suitename}-r0-additions.cs
152 if [[ -f /srv/release.debian.org/www/${suitename}/${newrev%%.*}/${newrev}/propups.unstable ]]; then
153 cp /srv/release.debian.org/www/${suitename}/${newrev%%.*}/${newrev}/propups.unstable .
154 dak control-suite --force --add unstable <propups.unstable
156 if [[ -f /srv/release.debian.org/www/${suitename}/${newrev%%.*}/${newrev}/propups.testing ]]; then
157 cp /srv/release.debian.org/www/${suitename}/${newrev%%.*}/${newrev}/propups.testing .
158 dak control-suite --force --add testing <propups.testing
162 # FIXME: Nicer ways please
164 echo "Check with RMs if there are any removals to do, if so, please just enter full dak rm line here."
165 echo "If nothing - or done, just end with an empty line"
168 read -e -p "RM command: " -i "dak rm -s ${suite} -R -p -d ### -m '###' ###" dakrmcmd
169 if [[ -n ${dakrmcmd} ]]; then
178 if [[ ${hadrms} -ne 0 ]]; then
179 echo "You did some removals, please copy their entries into the changelog"
180 $EDITOR ${ftpdir}/dists/${suite}/ChangeLog ${webdir}/removals.txt
183 log "Checking for d-i updates"
184 echo "Are there d-i updates? Empty version string, if not."
185 echo "Seperate old version to move to morgue by space."
186 read -e -p "d-i updates: " diver dioldver
188 if [[ -n ${diver} ]]; then
189 log "Installing new d-i version ${diver}"
190 dak copy-installer -s ${pusuite} -d ${suite} ${diver}
192 if [[ -n ${dioldver} ]]; then
193 log "Moving old d-i version ${dioldver} to morgue"
194 cd $ftpdir/dists/${suite}/main
195 for iarch in $(dak admin s-a list-arch ${suite}); do
196 if [[ -d installer-${iarch}/${dioldver} ]]; then
197 echo "Moving installer-${iarch}/${dioldver} to morgue"
198 mkdir -p "${base}/morgue/d-i/installer-${iarch}/"
199 mv "installer-${iarch}/${dioldver}" "${base}/morgue/d-i/installer-${iarch}/"
203 # Remove old version also from proposed-updates
204 cd $ftpdir/dists/${pusuite}/main
205 for iarch in $(dak admin s-a list-arch ${suite}); do
206 rm -rf -- "installer-${iarch}/${dioldver}"
209 cd $ftpdir/dists/${suite}
212 log "Checking for win32-loader"
213 echo "If anything for win32-loader, enter any string, otherwise empty"
214 read -e -p "win32-loader?" win32loader
215 if [[ -n ${win32loader} ]]; then
216 cd ${ftpdir}/tools/win32-loader
217 if [ -d ${suitename}-proposed-updates ]; then
219 mv ${suitename}-proposed-updates ${suite}
224 log "Updating version numbers in readmes, fixing Changelog"
225 cd ${ftpdir}/dists/${suite}
227 date_long=$(date "+%A, %-dth %B %Y" | sed 's/1th/1st/; s/2th/2nd/; s/3th/3rd/')
228 date_iso=$(date "+%Y-%m-%d")
229 date_short=$(date "+%a, %d %b %Y")
230 sed -e "1i======================================\n${date_short} - Debian ${newrev} released\n======================================" -i ChangeLog
231 sed -e "/^${suite}/ s/Debian ${oldrev}/Debian ${newrev}/" -i ../README
232 sed -e "s/Debian ${oldrev}/Debian ${newrev}/g; /Debian ${newrev}/ s/released .*\\./released ${date_long}./" -i ../../README
233 sed -e "s/Debian ${oldrev}/Debian ${newrev}/g; /Debian ${newrev}/ s/released .*\\./released ${date_long}./; /meta name=\"Modified\"/ s/content=\".*\"/content=\"${date_iso}\"/" -i ../../README.html
235 echo "Now check if it looks good"
236 for f in README README.html dists/README dists/${suite}/ChangeLog; do
237 diff -u ${mirrordir}/ftp-master/${f} ${ftpdir}/${f}
239 read -e -p "Does the diff look ok? Enter anything if not, empty if yes" diffcheck
240 if [[ -n ${diffcheck} ]]; then
241 cd ${ftpdir}/dists/${suite}
242 $EDITOR ChangeLog ../README ../../README ../../README.html
243 rm -f -- ./*~ ../*~ ../../*~
246 log "Updating the Debianx.y symlink"
248 rm -f Debian${oldrev}
249 ln -s ${suitename} Debian${newrev}
251 log "Updating suite table in postgres"
252 mdate=$(date +"%d %B %Y")
255 update suite set version = '${newrev}' where suite_name = '${suite}';
256 update suite set description = 'Debian ${newrev} Released ${mdate}' where suite_name = '${suite}';
260 log "Preparing for gps, domination/cruft-report time"
264 dak dominate --force -s ${suite}
266 dak cruft-report -s ${suite}
267 echo "Anything to remove? If so, copy/paste commands into another window, have fun"
268 echo "When done, continue here. Enter anything if you got removals, empty if not"
269 read -e -p "Anything removed?" -i "yes" removedstuff
270 if [[ -n ${removedstuff} ]]; then
278 if [[ ${hadremove} -ne 0 ]]; then
279 echo "You did some removals, please copy their entries into the changelog"
280 $EDITOR ${ftpdir}/dists/${suite}/ChangeLog ${webdir}/removals.txt
283 log "Time to run gps/contents, RMs can check if all looks ok"
284 dak generate-packages-sources2 --force -s ${suite},${pusuite}
286 dak contents generate -f -s ${suite} -a ftp-master
288 if [[ ${suitename} == wheezy ]]; then
289 ${scriptsdir}/generate-i18n-Index "${ftpdir}/dists/${suite}"
292 dak generate-releases -f -s ${suite} ${pusuite}
294 log "Release file generated, waiting for RMs checking and (hopefully) signing"
296 # Remove InRelease: Release can be signed by both ftpmaster & stable release keys
297 rm ${ftpdir}/dists/${suite}/InRelease
298 cd ${ftpdir}/dists/${suite}
299 releasefile=/srv/release.debian.org/www/${suitename}/${newrev%%.*}/${newrev}/Release-${newrev}.gpg
301 if [[ -f ${releasefile} ]]; then
302 cat ${releasefile} >> Release.gpg
303 gpg --no-default-keyring --keyring /usr/share/keyrings/debian-archive-keyring.gpg --trust-model=always --verify Release.gpg Release
311 echo "Done. Is a mirrorpush needed? Or just one to the cd-builder?"
312 read -e -p "Mirrorpush? no/cd/yes" -i "cd" mirrorpush
314 case ${mirrorpush} in
319 $configdir/cronscript mirror