pointrelease 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. #!/bin/bash
  2. # No way I try to deal with a crippled sh just for POSIX foo.
  3. # Copyright (C) 2009-2016 Joerg Jaspert <joerg@debian.org>
  4. #
  5. # This program is free software; you can redistribute it and/or
  6. # modify it under the terms of the GNU General Public License as
  7. # published by the Free Software Foundation; version 2.
  8. #
  9. # This program is distributed in the hope that it will be useful, but
  10. # WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. # General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU General Public License
  15. # along with this program; if not, write to the Free Software
  16. # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. # exit on errors
  18. set -e
  19. # A pipeline's return status is the value of the last (rightmost)
  20. # command to exit with a non-zero status, or zero if all commands exit
  21. # successfully.
  22. set -o pipefail
  23. # make sure to only use defined variables
  24. set -u
  25. # ERR traps should be inherited from functions too. (And command
  26. # substitutions and subshells and whatnot, but for us the functions is
  27. # the important part here)
  28. set -E
  29. # If the extglob shell option is enabled using the shopt builtin,
  30. # several extended pattern matching operators are recognized. We use
  31. # it for the POSSIBLEARGS and the first case ${ARGS} matching.
  32. shopt -s extglob
  33. # And use one locale, no matter what the caller has set
  34. export LANG=C.UTF-8
  35. export LC_ALL=C.UTF-8
  36. # If run from crontab, CONFIGDIR will point to the correct dir
  37. # where we find the vars file
  38. configdir=${configdir:-"/srv/ftp-master.debian.org/dak/config/debian"}
  39. # import the general variable set. (This will overwrite configdir, but
  40. # it is expected to have the same value)
  41. export SCRIPTVARS=${configdir}/vars
  42. . "${SCRIPTVARS}"
  43. . "${configdir}/common"
  44. . "${configdir}/dinstall.functions"
  45. umask 022
  46. # Get rid of tempfiles at the end
  47. cleanup() {
  48. echo "You have to clean up your mess on your own. Sorry." >&2
  49. exit 1
  50. }
  51. trap cleanup EXIT TERM HUP INT QUIT
  52. function usage() {
  53. echo "Fun with a pointrelease"
  54. echo "Takes two args, suite and version"
  55. echo "Default for suite is jessie, version defaults to last plus one"
  56. }
  57. confirm() {
  58. local y=N
  59. while [ "${y}" != "y" ]; do
  60. read -p "Continue [y/N]?" y
  61. done
  62. }
  63. # Arguments, we like
  64. while getopts ":hs:v:" OPTION; do
  65. case ${OPTION} in
  66. s) # suite
  67. suitename="${OPTARG}"
  68. ;;
  69. v) # version
  70. newrev="${OPTARG}"
  71. ;;
  72. h) # help
  73. usage
  74. exit 0
  75. ;;
  76. ?)
  77. echo "Unknown option ${OPTION} given, try -h"
  78. exit 42
  79. ;;
  80. esac
  81. done
  82. # Set some variables
  83. suitename=${suitename:-"jessie"}
  84. suite=$(psql -qAtc "SELECT suite_name FROM suite WHERE codename='${suitename}'")
  85. oldrev=$(psql -qAtc "SELECT version FROM suite WHERE codename='${suitename}'")
  86. newrev=${newrev:-${oldrev%.*}.$(( ${oldrev##*.} + 1 ))}
  87. release_base=https://release.debian.org/proposed-updates/${newrev%%.*}/${newrev}
  88. PROGRAM="pointrelease_${suitename}"
  89. # Set some variables
  90. case "${suite}" in
  91. stable) pusuite=proposed-updates ;;
  92. oldstable) pusuite=oldstable-proposed-updates ;;
  93. *) pusuite=INVALID ;;
  94. esac
  95. wget="wget --ca-directory=/etc/ssl/ca-debian"
  96. # set DEBUG if you want to see a little more logs
  97. DEBUG=${DEBUG:-0}
  98. # common functions are "outsourced"
  99. . "${configdir}/common"
  100. # Timestamp when we started
  101. NOW=$(date "+%Y.%m.%d-%H:%M:%S")
  102. log "Point release for ${suite} (${suitename}); old version: ${oldrev}, new: ${newrev}"
  103. log "Updates come from ${pusuite}"
  104. cd ~
  105. mkdir -p ${suitename}_${newrev}
  106. cd ${suitename}_${newrev}
  107. echo "Is there anything to skip in this release? If so, please enter source package names, whitespace separated, if not just hit enter"
  108. read -e -p "Source packages: " skiplist
  109. confirm
  110. log "Preparing"
  111. pg_timestamp pre_${suite}_${newrev}
  112. if [[ ! -f ${pusuite}.list ]]; then
  113. dak control-suite -l ${pusuite} > ${pusuite}.list &
  114. fi
  115. if [[ ! -f ${suite}.list ]]; then
  116. dak control-suite -l ${suite} > ${suite}.list &
  117. fi
  118. if [[ ${suitename} != jessie ]]; then
  119. if [[ ! -f ${suite}-debug.list ]]; then
  120. dak control-suite -l ${suite}-debug > ${suite}-debug.list &
  121. fi
  122. if [[ ! -f ${pusuite}-debug.list ]]; then
  123. dak control-suite -l ${pusuite}-debug > ${pusuite}-debug.list &
  124. fi
  125. fi
  126. wait
  127. if [[ -n ${skiplist} ]]; then
  128. for s in ${pusuite} ${pusuite}-debug; do
  129. if [[ ${s} = ${pusuite}-debug && ${suitename} = jessie ]]; then
  130. continue
  131. fi
  132. mv ${s}.list ${s}.list.ori
  133. grep -vFf <(dak ls -f heidi -S -s ${s} ${skiplist}) ${s}.list.ori > ${s}.list
  134. done
  135. fi
  136. log "Creating changelog"
  137. tmpfile=$(mktemp -p "${TMPDIR}" changelog.XXXXXX)
  138. dak make-changelog -s ${pusuite} -b ${suite} | cat - ${ftpdir}/dists/${suite}/ChangeLog > ${tmpfile}
  139. chmod 0644 ${tmpfile}
  140. mv ${tmpfile} ${ftpdir}/dists/${suite}/ChangeLog
  141. if [[ -n ${skiplist} ]]; then
  142. echo "Please edit to remove the changelogs for the skipped packages"
  143. confirm
  144. $EDITOR ${ftpdir}/dists/${suite}/ChangeLog
  145. rm -f ${ftpdir}/dists/${suite}/ChangeLog~
  146. fi
  147. log "Merging ${pusuite} into ${suite}"
  148. while :; do
  149. if dak control-suite --add ${suite} < ${pusuite}.list; then
  150. log "Done"
  151. break
  152. else
  153. log "Please check problem and hit enter when i can retry"
  154. read
  155. fi
  156. done
  157. if [[ ${suitename} != jessie ]]; then
  158. dak control-suite --add ${suite}-debug < ${pusuite}-debug.list
  159. fi
  160. dak control-suite --remove ${pusuite} < ${pusuite}.list
  161. if [[ ${suitename} != jessie ]]; then
  162. dak control-suite --remove ${pusuite}-debug < ${pusuite}-debug.list
  163. fi
  164. log "Cleaning changelogs from proposed-updates"
  165. pumorguedir="${base}/morgue/queues/$(date +%Y/%m)"
  166. mkdir -p "${pumorguedir}"
  167. cd ${ftpdir}/dists/${pusuite}
  168. mv -t "${pumorguedir}" -n -- *.changes
  169. if [[ -n ${skiplist} ]]; then
  170. for pack in ${skiplist}; do
  171. mv -t "${ftpdir}/dists/${pusuite}" ${pumorguedir}/${pack}_*.changes
  172. done
  173. fi
  174. log "Checking for r0 additions and propups"
  175. cd ~/${suitename}_${newrev}
  176. propups() {
  177. local target_suite="${1}"
  178. local f="${2:-propups.${target_suite}}"
  179. if ${wget} -O "${f}" "${release_base}/${f}"; then
  180. echo "Please check ${f}"
  181. confirm
  182. dak control-suite --force --add ${target_suite} < ${f}
  183. fi
  184. }
  185. propups ${suitename}-r0 ${suitename}-r0-additions.cs
  186. propups unstable
  187. if [[ ${suitename} != jessie ]]; then
  188. propups unstable-debug
  189. fi
  190. propups testing
  191. if [[ ${suitename} != jessie ]]; then
  192. propups testing-debug
  193. fi
  194. log "RM time"
  195. if ${wget} -O "removallist" "${release_base}/removals.${suitename}"; then
  196. echo "Please check removallist file, I am going to run it as shell script when you confirm"
  197. confirm
  198. $EDITOR removallist
  199. bash removallist
  200. if [ -s removallist ]; then
  201. hadrms=1
  202. fi
  203. fi
  204. echo "Any more removals to be done?"
  205. echo "If nothing - or done, just end with an empty line"
  206. hadrms=0
  207. # Blindly ignore errors in dak rm
  208. set +e
  209. while :; do
  210. read -e -p "RM command: " -i "dak rm -s ${suite} -R -p -d ### -m '###' ###" dakrmcmd
  211. if [[ -n ${dakrmcmd} ]]; then
  212. eval "${dakrmcmd}"
  213. hadrms=1
  214. continue
  215. else
  216. break
  217. fi
  218. done
  219. set -e
  220. if [[ ${hadrms} -ne 0 ]]; then
  221. echo "You did some removals, please copy their entries into the changelog"
  222. confirm
  223. $EDITOR ${ftpdir}/dists/${suite}/ChangeLog ${webdir}/removals.txt
  224. rm -f ${ftpdir}/dists/${suite}/ChangeLog~
  225. fi
  226. log "Checking for d-i updates"
  227. echo "Are there d-i updates? Empty version string, if not."
  228. echo "Seperate old version to move to morgue by space."
  229. read -e -p "d-i updates: " diver dioldver
  230. confirm
  231. if [[ -n ${diver} ]]; then
  232. log "Installing new d-i version ${diver}"
  233. dak copy-installer -s ${pusuite} -d ${suite} ${diver}
  234. # Remove new version from proposed-updates
  235. cd $ftpdir/dists/${pusuite}/main
  236. for iarch in $(dak admin s-a list-arch ${suite}); do
  237. rm -rf -- "installer-${iarch}/${diver}"
  238. if [[ -L install-${iarch}/current && "$(readlink install-${iarch}/current)" = "${diver}" ]]; then
  239. rm install-${iarch}/current
  240. fi
  241. done
  242. if [[ -n ${dioldver} ]]; then
  243. log "Moving old d-i version ${dioldver} to morgue"
  244. cd $ftpdir/dists/${suite}/main
  245. for iarch in $(dak admin s-a list-arch ${suite}); do
  246. if [[ -d installer-${iarch}/${dioldver} ]]; then
  247. echo "Moving installer-${iarch}/${dioldver} to morgue"
  248. mkdir -p "${base}/morgue/d-i/installer-${iarch}/"
  249. mv "installer-${iarch}/${dioldver}" "${base}/morgue/d-i/installer-${iarch}/"
  250. fi
  251. done
  252. # Remove old version also from proposed-updates
  253. cd $ftpdir/dists/${pusuite}/main
  254. for iarch in $(dak admin s-a list-arch ${suite}); do
  255. rm -rf -- "installer-${iarch}/${dioldver}"
  256. done
  257. fi
  258. cd $ftpdir/dists/${suite}
  259. fi
  260. log "Checking for win32-loader"
  261. echo "If anything for win32-loader, enter any string, otherwise empty"
  262. read -e -p "win32-loader?" win32loader
  263. if [[ -n ${win32loader} ]]; then
  264. cd ${ftpdir}/tools/win32-loader
  265. if [ -d ${pusuite} ]; then
  266. rm -r ${suite}
  267. mv ${pusuite} ${suite}
  268. fi
  269. cd ${ftpdir}
  270. fi
  271. log "Updating version numbers in readmes, fixing Changelog"
  272. cd ${ftpdir}/dists/${suite}
  273. date_long=$(date "+%A, %-dth %B %Y" | sed 's/1th/1st/; s/2th/2nd/; s/3th/3rd/')
  274. date_iso=$(date "+%Y-%m-%d")
  275. date_short=$(date "+%a, %d %b %Y")
  276. sed -e "1i======================================\n${date_short} - Debian ${newrev} released\n======================================" -i ChangeLog
  277. sed -e "/^${suite}/ s/Debian ${oldrev}/Debian ${newrev}/" -i ../README
  278. sed -e "s/Debian ${oldrev}/Debian ${newrev}/g; /Debian ${newrev}/ s/released .*\\./released ${date_long}./" -i ../../README
  279. 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
  280. echo "Now check if it looks good"
  281. for f in README README.html dists/README dists/${suite}/ChangeLog; do
  282. diff -u ${mirrordir}/ftp-master/${f} ${ftpdir}/${f} || :
  283. done
  284. read -e -p "Does the diff look ok? Enter anything if not, empty if yes" diffcheck
  285. if [[ -n ${diffcheck} ]]; then
  286. cd ${ftpdir}/dists/${suite}
  287. $EDITOR ChangeLog ../README ../../README ../../README.html
  288. rm -f -- ./*~ ../*~ ../../*~
  289. fi
  290. log "Updating the Debianx.y symlink"
  291. cd $ftpdir/dists/
  292. rm -f Debian${oldrev}
  293. ln -s ${suitename} Debian${newrev}
  294. log "Updating suite table in postgres"
  295. mdate=$(date +"%d %B %Y")
  296. psql projectb <<EOF
  297. begin;
  298. update suite set version = '${newrev}' where suite_name = '${suite}' or suite_name = '${suite}-debug';
  299. update suite set description = 'Debian ${newrev} Released ${mdate}' where suite_name = '${suite}';
  300. update suite set description = 'Debian ${newrev} Released ${mdate} - Debug Information' where suite_name = '${suite}-debug';
  301. commit;
  302. EOF
  303. log "Preparing for gps, domination/cruft-report time"
  304. hadremove=0
  305. while :; do
  306. log "dominate"
  307. dak dominate --force -s ${suite}
  308. log "cruft-report"
  309. dak cruft-report -s ${suite}
  310. echo "Anything to remove? If so, copy/paste commands into another window, have fun"
  311. echo "When done, continue here. Enter anything if you got removals, empty if not"
  312. read -e -p "Anything removed?" -i "yes" removedstuff
  313. if [[ -n ${removedstuff} ]]; then
  314. hadremove=1
  315. continue
  316. else
  317. break
  318. fi
  319. done
  320. if [[ ${hadremove} -ne 0 ]]; then
  321. echo "You did some removals, please copy their entries into the changelog"
  322. $EDITOR ${ftpdir}/dists/${suite}/ChangeLog ${webdir}/removals.txt
  323. fi
  324. if [[ ${suitename} != jessie ]]; then
  325. log "Cleaning up debug suite"
  326. dak manage-debug-suites ${suite}-debug ${pusuite}-debug
  327. fi
  328. log "Time to run gps/contents, RMs can check if all looks ok"
  329. gps_suites=${suite},${pusuite}
  330. if [[ ${suitename} != jessie ]]; then
  331. gps_suites=${gps_suites},${suite}-debug,${pusuite}-debug
  332. fi
  333. dak generate-packages-sources2 --force -s ${gps_suites}
  334. ${scriptsdir}/sync-release ${suite} &
  335. log "Contents"
  336. dak contents generate -f -s ${suite} -a ftp-master
  337. wait
  338. ${scriptsdir}/sync-release ${suite}
  339. if [[ ${suitename} != jessie ]]; then
  340. ${scriptsdir}/sync-release ${suite}-debug
  341. fi
  342. echo "Generate release files?"
  343. confirm
  344. release_suites="${suite} ${pusuite}"
  345. if [[ ${suitename} != jessie ]]; then
  346. release_suites="${release_suites} ${suite}-debug ${pusuite}-debug"
  347. fi
  348. dak generate-releases -f -s ${release_suites}
  349. ${scriptsdir}/sync-release ${suite}
  350. if [[ ${suitename} != jessie ]]; then
  351. ${scriptsdir}/sync-release ${suite}-debug
  352. fi
  353. log "Release file generated, waiting for RMs checking and (hopefully) signing"
  354. # Remove InRelease: Release can be signed by both ftpmaster & stable release keys
  355. merge-release-signatures() {
  356. local archiveroot="${1}"
  357. local s="${2}"
  358. local releasefile="${3}"
  359. rm -f ${archiveroot}/dists/${s}/InRelease ${archiveroot}/zzz-dists/${s}/InRelease
  360. cd ~/${suitename}_${newrev}
  361. while ! ${wget} -O "${releasefile}" "${release_base}/${releasefile}"; do
  362. sleep 10
  363. done
  364. cd ${archiveroot}/dists/${s}
  365. cat ~/${suitename}_${newrev}/${releasefile} >> Release.gpg
  366. gpg --no-default-keyring --keyring /usr/share/keyrings/debian-archive-keyring.gpg --trust-model=always --verify Release.gpg Release
  367. }
  368. merge-release-signatures $(get_archiveroot ftp-master) ${suite} Release-${newrev}.gpg
  369. if [[ ${suitename} != jessie ]]; then
  370. merge-release-signatures $(get_archiveroot debian-debug) ${suite}-debug Release-${newrev}-debug.gpg
  371. fi
  372. echo "Done. Is a mirrorpush needed? Or just one to the cd-builder?"
  373. read -e -p "Mirrorpush? no/cd/yes " -i "cd" mirrorpush
  374. case ${mirrorpush} in
  375. no)
  376. :
  377. ;;
  378. yes)
  379. $configdir/cronscript mirror
  380. ;;
  381. cd)
  382. mirror
  383. mirrorpush-release
  384. ;;
  385. *)
  386. echo "Sod off"
  387. ;;
  388. esac