]> git.decadent.org.uk Git - dak.git/blob - config/debian/pointrelease
Initial version of an actual script to run a pointrelease
[dak.git] / config / debian / pointrelease
1 #!/bin/bash
2 # No way I try to deal with a crippled sh just for POSIX foo.
3
4 # Copyright (C) 2009-2016 Joerg Jaspert <joerg@debian.org>
5 #
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.
9 #
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.
14 #
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.
18
19 # exit on errors
20 set -e
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
23 # successfully.
24 set -o pipefail
25 # make sure to only use defined variables
26 set -u
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)
30 set -E
31
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.
35 shopt -s extglob
36
37 # And use one locale, no matter what the caller has set
38 export LANG=C.UTF-8
39 export LC_ALL=C.UTF-8
40
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
47 . "${SCRIPTVARS}"
48 . "${configdir}/dinstall.functions"
49 umask 022
50
51 # Get rid of tempfiles at the end
52 trap cleanup EXIT TERM HUP INT QUIT
53
54 function usage() {
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"
58 }
59
60 # Arguments, we like
61 while getopts ":hs:v:" OPTION; do
62     case ${OPTION} in
63         s) # suite
64             suitename="${OPTARG}"
65             ;;
66         x) # version
67             version="${OPTARG}"
68             ;;
69         h) # help
70             usage
71             exit 0
72             ;;
73         ?)
74             echo "Unknown option ${OPTION} given, try -h"
75             exit 42
76             ;;
77     esac
78 done
79
80 # Set some variables
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}"
86
87 # Set some variables
88 case "${suite}" in
89   stable)    pusuite=proposed-updates ;;
90   oldstable) pusuite=oldstable-proposed-updates ;;
91   *)         pusuite=INVALID ;;
92 esac
93
94 # set DEBUG if you want to see a little more logs
95 DEBUG=${DEBUG:-0}
96
97 # common functions are "outsourced"
98 . "${configdir}/common"
99
100 # Timestamp when we started
101 NOW=$(date "+%Y.%m.%d-%H:%M:%S")
102
103 log "Point release for ${suite} (${suitename}); old version: ${oldrev}, new: ${newrev}"
104 log "Updates come from ${pusuite}"
105
106 log "Preparing"
107 pg_timestamp pre_${suite}_${newrev}
108 cd ~
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
113
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
119 fi
120
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~
130 fi
131
132 dak control-suite --add ${suite} < ${pusuite}.list
133 dak control-suite --remove ${pusuite} < ${pusuite}.list
134
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
143     done
144 fi
145
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
151 fi
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
155 fi
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
159 fi
160
161 log "RM time"
162 # FIXME: Nicer ways please
163 dak rm -h
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"
166 hadrms=0
167 while :; do
168     read -e -p "RM command: " -i "dak rm -s ${suite} -R -p -d ### -m '###' ###" dakrmcmd
169     if [[ -n ${dakrmcmd} ]]; then
170         ${dakrmcmd}
171         hadrms=1
172         continue
173     else
174         break
175     fi
176 done
177
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
181 fi
182
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
187
188 if [[ -n ${diver} ]]; then
189     log "Installing new d-i version ${diver}"
190     dak copy-installer -s ${pusuite} -d ${suite} ${diver}
191
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}/"
200             fi
201         done
202
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}"
207         done
208     fi
209     cd $ftpdir/dists/${suite}
210 fi
211
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
218         rm -r ${suite}
219         mv ${suitename}-proposed-updates ${suite}
220     fi
221     cd ${ftpdir}
222 fi
223
224 log "Updating version numbers in readmes, fixing Changelog"
225 cd ${ftpdir}/dists/${suite}
226
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
234
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}
238 done
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 -- ./*~ ../*~ ../../*~
244 fi
245
246 log "Updating the Debianx.y symlink"
247 cd $ftpdir/dists/
248 rm -f Debian${oldrev}
249 ln -s ${suitename} Debian${newrev}
250
251 log "Updating suite table in postgres"
252 mdate=$(date +"%d %B %Y")
253 psql projectb <<EOF
254 begin;
255 update suite set version = '${newrev}' where suite_name = '${suite}';
256 update suite set description = 'Debian ${newrev} Released ${mdate}' where suite_name = '${suite}';
257 commit;
258 EOF
259
260 log "Preparing for gps, domination/cruft-report time"
261 hadremove=0
262 while :; do
263     log "dominate"
264     dak dominate --force -s ${suite}
265     log "cruft-report"
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
271         hadremove=1
272         continue
273     else
274         break
275     fi
276 done
277
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
281 fi
282
283 log "Time to run gps/contents, RMs can check if all looks ok"
284 dak generate-packages-sources2 --force -s ${suite},${pusuite}
285 log "Contents"
286 dak contents generate -f -s ${suite} -a ftp-master
287
288 if [[ ${suitename} == wheezy ]]; then
289   ${scriptsdir}/generate-i18n-Index "${ftpdir}/dists/${suite}"
290 fi
291
292 dak generate-releases -f -s ${suite} ${pusuite}
293
294 log "Release file generated, waiting for RMs checking and (hopefully) signing"
295
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
300 while :; do
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
304         break
305     else
306         echo -n "."
307         sleep 10
308         continue
309     fi
310 done
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
313
314 case ${mirrorpush} in
315     no)
316         :
317         ;;
318     yes)
319         $configdir/cronscript mirror
320         ;;
321     cd)
322         mirror
323         mirrorpush-release
324         ;;
325     *)
326         echo "Sod off"
327         ;;
328 esac