source: vendor/current/script/release.sh@ 989

Last change on this file since 989 was 989, checked in by Silvan Scherrer, 9 years ago

Samba Server: update vendor to version 4.4.7

File size: 30.8 KB
Line 
1#!/bin/bash
2# make a release of Samba or a library
3
4LC_ALL=C
5export LC_ALL
6LANG=C
7export LANG
8LANGUAGE=C
9export LANGUAGE
10
11set -u
12set -e
13umask 0022
14
15CONF_REPO_URL="ssh://git.samba.org/data/git/samba.git"
16CONF_UPLOAD_URL="samba-bugs@download-master.samba.org:/home/data/ftp/pub"
17CONF_DOWNLOAD_URL="https://download.samba.org/pub"
18CONF_HISTORY_URL="https://www.samba.org"
19
20test -d ".git" || {
21 echo "Run this script from the top-level directory in the"
22 echo "repository"
23 exit 1
24}
25
26usage() {
27 echo "Usage: release.sh <PRODUCT> <COMMAND>"
28 echo ""
29 echo "PRODUCT: ldb, talloc, tevent, tdb, samba-rc, samba-stable"
30 echo "COMMAND: fullrelease, create, push, upload, announce"
31 echo ""
32 return 0
33}
34
35check_args() {
36 local cmd="$1"
37 local got_args="$2"
38 local take_args="$3"
39
40 test x"${got_args}" = x"${take_args}" || {
41 usage
42 echo "cmd[${cmd}] takes ${take_args} instead of ${got_args}"
43 return 1
44 }
45
46 return 0
47}
48
49min_args() {
50 local cmd="$1"
51 local got_args="$2"
52 local min_args="$3"
53
54 test "${got_args}" -ge "${min_args}" || {
55 usage
56 echo "cmd[${cmd}] takes at least ${min_args} instead of ${got_args}"
57 return 1
58 }
59
60 return 0
61}
62
63min_args "$0" "$#" "2"
64
65product="$1"
66globalcmd="$2"
67shift 2
68oldtagname=""
69tagname=""
70patchfile=""
71cmds=""
72next_cmd=""
73
74require_tagname() {
75 min_args "${FUNCNAME}" "$#" "1" || return 1
76 local cmd="$1"
77
78 test -n "${tagname}" || {
79 echo "cmd[${cmd}] requires '\${tagname}' variable to be set"
80 return 1
81 }
82
83 local name=$(echo "${tagname}" | cut -d '-' -f1)
84 test x"${name}" = x"${productbase}" || {
85 echo "Invalid tagname[${tgzname}]"
86 return 1
87 }
88
89 return 0
90}
91
92cmd_allowed() {
93 min_args "${FUNCNAME}" "$#" "2" || return 1
94 local cmd="$1"
95 shift 1
96
97 echo "$@" | grep -q "\<${cmd}\>" || {
98 return 1
99 }
100
101 return 0
102}
103
104verify_samba_rc() {
105 check_args "${FUNCNAME}" "$#" "0" || return 1
106
107 test -f VERSION || {
108 echo "VERSION doesn't exist"
109 return 1
110 }
111
112 grep -q 'SAMBA_VERSION_IS_GIT_SNAPSHOT=no' VERSION || {
113 echo "SAMBA_VERSION_IS_GIT_SNAPSHOT is not 'no'"
114 return 1
115 }
116
117 grep -q '^SAMBA_VERSION_RC_RELEASE=' VERSION || {
118 echo "SAMBA_VERSION_RC_RELEASE= missing"
119 return 1
120 }
121
122 grep -q '^SAMBA_VERSION_RC_RELEASE=$' VERSION && {
123 echo "SAMBA_VERSION_RC_RELEASE= missing the rc version"
124 return 1
125 }
126
127 return 0
128}
129
130load_samba_stable_versions() {
131 check_args "${FUNCNAME}" "$#" "0" || return 1
132
133 test -n "${version-}" && {
134 return 0
135 }
136
137 local SAMBA_VERSION_MAJOR=$(grep '^SAMBA_VERSION_MAJOR=' VERSION | cut -d '=' -f2 | xargs)
138 local SAMBA_VERSION_MINOR=$(grep '^SAMBA_VERSION_MINOR=' VERSION | cut -d '=' -f2 | xargs)
139 local SAMBA_VERSION_RELEASE=$(grep '^SAMBA_VERSION_RELEASE=' VERSION | cut -d '=' -f2 | xargs)
140
141 version="${SAMBA_VERSION_MAJOR}.${SAMBA_VERSION_MINOR}.${SAMBA_VERSION_RELEASE}"
142 tagname="${productbase}-${version}"
143
144 test ${SAMBA_VERSION_RELEASE} -gt 0 || {
145 return 0
146 }
147
148 oldversion="${SAMBA_VERSION_MAJOR}.${SAMBA_VERSION_MINOR}.$(expr ${SAMBA_VERSION_RELEASE} - 1)"
149 oldtagname="${productbase}-${oldversion}"
150 patchfile="${productbase}-${oldversion}-${version}.diffs"
151
152 return 0
153}
154
155verify_samba_stable() {
156 check_args "${FUNCNAME}" "$#" "0" || return 1
157
158 test -f VERSION || {
159 echo "VERSION doesn't exist"
160 return 1
161 }
162
163 grep -q 'SAMBA_VERSION_IS_GIT_SNAPSHOT=no' VERSION || {
164 echo "SAMBA_VERSION_IS_GIT_SNAPSHOT is not 'no'"
165 return 1
166 }
167
168 local VARS=""
169 VARS="${VARS} SAMBA_VERSION_REVISION"
170 VARS="${VARS} SAMBA_VERSION_TP_RELEASE"
171 VARS="${VARS} SAMBA_VERSION_ALPHA_RELEASE"
172 VARS="${VARS} SAMBA_VERSION_BETA_RELEASE"
173 VARS="${VARS} SAMBA_VERSION_PRE_RELEASE"
174 VARS="${VARS} SAMBA_VERSION_RC_RELEASE"
175 VARS="${VARS} SAMBA_VERSION_RELEASE_NICKNAME"
176 VARS="${VARS} SAMBA_VERSION_VENDOR_SUFFIX"
177 VARS="${VARS} SAMBA_VERSION_VENDOR_PATCH"
178 for var in ${VARS}; do
179 grep -q "^${var}" VERSION && {
180 grep -q "^${var}=$" VERSION || {
181 echo "${var} found in stable version"
182 return 1
183 }
184 }
185 done
186
187 load_samba_stable_versions
188
189 test x"${product}" = x"samba-stable" && {
190 test -f "announce.${tagname}.quotation.txt" || {
191 echo ""
192 echo "announce.${tagname}.quotation.txt missing!"
193 echo ""
194 echo "Please create it and retry"
195 echo ""
196 echo "The content should look like this:"
197 echo "cat announce.${tagname}.quotation.txt"
198 echo '======================================================'
199 echo ' "Some text'
200 echo ' from someone."'
201 echo ''
202 echo ' The author'
203 echo '======================================================'
204 echo ""
205 return 1
206 }
207 }
208
209 test -n "${oldtagname}" || {
210 return 0
211 }
212
213 local verify_out="${TMPDIR}/verify-${oldtagname}.out"
214
215 echo "Verifying oldtagname: ${oldtagname}"
216
217 git tag -v "${oldtagname}" >${verify_out} 2>&1 || {
218 echo "failed to verify old tag[${oldtagname}]"
219 echo ""
220 cat "${verify_out}"
221 return 1
222 }
223
224 grep -q "${GPG_KEYID}" "${verify_out}" || {
225 echo "oldtagname[${oldtagname}] was not generated with GPG_KEYID[${GPG_KEYID}]!"
226 echo ""
227 cat "${verify_out}"
228 return 1
229 }
230
231 echo "Verifying ${oldtagname}.tar.gz and ${oldtagname}.tar.asc"
232
233 test -f "${oldtagname}.tar.gz" || {
234 echo "${oldtagname}.tar.gz does not exist"
235 return 1
236 }
237
238 test -f "${oldtagname}.tar.asc" || {
239 echo "${oldtagname}.tar.asc does not exist"
240 return 1
241 }
242
243 zcat "${oldtagname}.tar.gz" | gpg --verify "${oldtagname}.tar.asc" - 2>${verify_out} || {
244 echo "Failed to verify ${oldtagname}.tar.asc"
245 return 1
246 }
247
248 grep -q "${GPG_KEYID}" "${verify_out}" || {
249 echo "${oldtagname}.tar.asc was not generated with GPG_KEYID[${GPG_KEYID}]!"
250 echo ""
251 cat "${verify_out}"
252 return 1
253 }
254
255 return 0
256}
257
258verify_release() {
259 check_args "${FUNCNAME}" "$#" "0" || return 1
260
261 test -n "${verify_fn}" || {
262 echo "verify_fn variable empty"
263 return 1
264 }
265
266 echo "Running ${verify_fn}"
267 ${verify_fn}
268}
269
270create_release() {
271 check_args "${FUNCNAME}" "$#" "0" || return 1
272
273 echo "Releasing product ${product}"
274
275 test -n "${tagname}" && {
276 git tag -l "${tagname}" | grep -q "${tagname}" && {
277 echo "tagname[${tagname}] already exist"
278 return 1
279 }
280
281 local _tgzname="${tagname}.tar.gz"
282 test -e "${_tgzname}" && {
283 echo "_tgzname[${_tgzname}] already exist"
284 return 1
285 }
286 }
287
288 echo "Building release tarball"
289 local tgzname=$(make dist 2>&1 | grep ^Created | cut -d' ' -f2)
290 test -f "${tgzname}" || {
291 echo "Failed to create tarball"
292 return 1
293 }
294 CLEANUP_FILES="${CLEANUP_FILES} ${tgzname}"
295
296 local name=$(echo "${tgzname}" | cut -d '-' -f1)
297 test x"${name}" = x"${productbase}" || {
298 echo "Invalid tgzname[${tgzname}]"
299 return 1
300 }
301
302 local _tagname=$(basename ${tgzname} .tar.gz)
303 test -n "${tagname}" && {
304 test x"${_tagname}" = x"${tagname}" || {
305 echo "Invalid tgzname[${tgzname}]"
306 return 1
307 }
308 }
309 tagname="${_tagname}"
310
311 local tarname=$(basename ${tgzname} .gz)
312 echo "Tarball: ${tarname}"
313 gunzip -f ${tgzname} || {
314 echo "Failed to decompress tarball ${tarname}"
315 return 1
316 }
317 test -f "${tarname}" || {
318 echo "Failed to decompress tarball ${tarname}"
319 return 1
320 }
321 CLEANUP_FILES="${CLEANUP_FILES} ${tarname}"
322
323 # tagname is global
324 echo "Tagging as ${tagname}"
325 git tag -u ${GPG_KEYID} -s "${tagname}" -m "${productbase}: tag release ${tagname}" || {
326 return 1
327 }
328 CLEANUP_TAGS="${CLEANUP_TAGS} ${tagname}"
329
330 echo "Signing ${tarname} => ${tarname}.asc"
331 rm -f "${tarname}.asc"
332 gpg -u "${GPG_USER}" --detach-sign --armor ${tarname} || {
333 return 1
334 }
335 test -f "${tarname}.asc" || {
336 echo "Failed to create signature ${tarname}.asc"
337 return 1
338 }
339 CLEANUP_FILES="${CLEANUP_FILES} ${tarname}.asc"
340 echo "Compressing ${tarname} => ${tgzname}"
341 gzip -f -9 ${tarname}
342 test -f "${tgzname}" || {
343 echo "Failed to compress ${tgzname}"
344 return 1
345 }
346
347 return 0
348}
349
350patch_release() {
351 check_args "${FUNCNAME}" "$#" "0" || return 1
352 require_tagname "${FUNCNAME}"
353
354 test -n "${patchfile}" || {
355 return 0
356 }
357
358 local oldpwd=$(pwd)
359 echo "Generating ${patchfile}"
360 (
361 set -e
362 set -u
363 pushd "${TMPDIR}"
364 tar xfz "${oldpwd}/${oldtagname}.tar.gz"
365 tar xfz "${oldpwd}/${tagname}.tar.gz"
366 diff -Npur "${oldtagname}/" "${tagname}/" > "${patchfile}"
367 popd
368 )
369 CLEANUP_FILES="${CLEANUP_FILES} ${patchfile}"
370 mv "${TMPDIR}/${patchfile}" "${patchfile}" || {
371 echo "failed cmd[mv ${TMPDIR}/${patchfile} ${patchfile}]"
372 return 1
373 }
374
375 echo "Signing ${patchfile} => ${patchfile}.asc"
376 rm -f "${patchfile}.asc"
377 CLEANUP_FILES="${CLEANUP_FILES} ${patchfile}.asc"
378 gpg -u "${GPG_USER}" --detach-sign --armor ${patchfile} || {
379 return 1
380 }
381 test -f "${patchfile}.asc" || {
382 echo "Failed to create signature ${patchfile}.asc"
383 return 1
384 }
385 echo "Compressing ${patchfile} => ${patchfile}.gz"
386 CLEANUP_FILES="${CLEANUP_FILES} ${patchfile}.gz"
387 gzip -f -9 ${patchfile}
388 test -f "${patchfile}.gz" || {
389 echo "Failed to compress ${patchfile}.gz"
390 return 1
391 }
392
393 return 0
394}
395
396whatsnew_release() {
397 check_args "${FUNCNAME}" "$#" "0" || return 1
398 require_tagname "${FUNCNAME}"
399
400 echo "extract ${tagname}.WHATSNEW.txt"
401 tar xf ${tagname}.tar.gz --to-stdout ${tagname}/WHATSNEW.txt > ${tagname}.WHATSNEW.txt
402 CLEANUP_FILES="${CLEANUP_FILES} ${tagname}.WHATSNEW.txt"
403
404 return 0
405}
406
407check_nopatch() {
408 check_args "${FUNCNAME}" "$#" "0" || return 1
409 require_tagname "${FUNCNAME}"
410
411 local verify_out="${TMPDIR}/verify-${oldtagname}.out"
412
413 echo "Verifying tagname: ${tagname}"
414
415 git tag -v "${tagname}" >${verify_out} 2>&1 || {
416 echo "failed to verify tag[${tagname}]"
417 echo ""
418 cat "${verify_out}"
419 return 1
420 }
421 grep -q "${GPG_KEYID}" "${verify_out}" || {
422 echo "tagname[${tagname}] was not generated with GPG_KEYID[${GPG_KEYID}]!"
423 echo ""
424 cat "${verify_out}"
425 return 1
426 }
427
428 echo "Verifying ${tagname}.tar.gz and ${tagname}.tar.asc"
429
430 test -f "${tagname}.tar.gz" || {
431 echo "${tagname}.tar.gz does not exist"
432 return 1
433 }
434
435 test -f "${tagname}.tar.asc" || {
436 echo "${tagname}.tar.asc does not exist"
437 return 1
438 }
439
440 zcat "${tagname}.tar.gz" | gpg --verify "${tagname}.tar.asc" - 2>${verify_out} || {
441 echo "Failed to verify ${tagname}.tar.asc"
442 return 1
443 }
444 grep -q "${GPG_KEYID}" "${verify_out}" || {
445 echo "${tagname}.tar.asc was not generated with GPG_KEYID[${GPG_KEYID}]!"
446 echo ""
447 cat "${verify_out}"
448 return 1
449 }
450
451 ls -la ${tagname}.*
452
453 return 0
454}
455
456check_samba_stable() {
457 check_args "${FUNCNAME}" "$#" "0" || return 1
458 require_tagname "${FUNCNAME}"
459
460 load_samba_stable_versions
461
462 local verify_out="${TMPDIR}/verify-${oldtagname}.out"
463
464 echo "Verifying tagname: ${tagname}"
465
466 git tag -v "${tagname}" >${verify_out} 2>&1 || {
467 echo "failed to verify tag[${tagname}]"
468 echo ""
469 cat "${verify_out}"
470 return 1
471 }
472 grep -q "${GPG_KEYID}" "${verify_out}" || {
473 echo "tagname[${tagname}] was not generated with GPG_KEYID[${GPG_KEYID}]!"
474 echo ""
475 cat "${verify_out}"
476 return 1
477 }
478
479 echo "Verifying ${tagname}.tar.gz and ${tagname}.tar.asc"
480
481 test -f "${tagname}.tar.gz" || {
482 echo "${tagname}.tar.gz does not exist"
483 return 1
484 }
485
486 test -f "${tagname}.tar.asc" || {
487 echo "${tagname}.tar.asc does not exist"
488 return 1
489 }
490
491 zcat "${tagname}.tar.gz" | gpg --verify "${tagname}.tar.asc" - 2>${verify_out} || {
492 echo "Failed to verify ${tagname}.tar.asc"
493 return 1
494 }
495 grep -q "${GPG_KEYID}" "${verify_out}" || {
496 echo "${tagname}.tar.asc was not generated with GPG_KEYID[${GPG_KEYID}]!"
497 echo ""
498 cat "${verify_out}"
499 return 1
500 }
501
502 test -n "${patchfile}" || {
503 ls -lart ${tagname}.*
504 return 0
505 }
506
507 echo "Verifying ${patchfile}.gz and ${patchfile}.asc"
508
509 test -f "${patchfile}.gz" || {
510 echo "${patchfile}.gz does not exist"
511 return 1
512 }
513
514 test -f "${patchfile}.asc" || {
515 echo "${patchfile}.asc does not exist"
516 return 1
517 }
518
519 zcat "${patchfile}.gz" | gpg --verify "${patchfile}.asc" - 2>${verify_out} || {
520 echo "Failed to verify ${patchfile}.asc"
521 return 1
522 }
523 grep -q "${GPG_KEYID}" "${verify_out}" || {
524 echo "${patchfile}.asc was not generated with GPG_KEYID[${GPG_KEYID}]!"
525 echo ""
526 cat "${verify_out}"
527 return 1
528 }
529
530 ls -lart ${tagname}.* ${patchfile}.*
531 return 0
532}
533
534check_release() {
535 check_args "${FUNCNAME}" "$#" "0" || return 1
536
537 test -n "${check_fn}" || {
538 echo "check_fn variable empty"
539 return 1
540 }
541
542 echo "Running ${check_fn}"
543 ${check_fn}
544}
545
546push_release() {
547 check_args "${FUNCNAME}" "$#" "0" || return 1
548 require_tagname "${FUNCNAME}"
549
550 echo "Push git tag ${tagname} to '${repo_url}'"
551 git push "${repo_url}" "refs/tags/${tagname}:refs/tags/${tagname}" || {
552 return 1
553 }
554
555 return 0
556}
557
558upload_nopatch() {
559 check_args "${FUNCNAME}" "$#" "0" || return 1
560 require_tagname "${FUNCNAME}"
561
562 echo "Upload ${tagname}.* to '${upload_url}'"
563 rsync -Pav --delay-updates ${tagname}.* "${upload_url}/" || {
564 return 1
565 }
566 rsync ${upload_url}/${tagname}.*
567
568 return 0
569}
570
571upload_samba_stable() {
572 check_args "${FUNCNAME}" "$#" "0" || return 1
573 require_tagname "${FUNCNAME}"
574
575 load_samba_stable_versions
576
577 local release_url="${upload_url}samba/stable/"
578 local patch_url="${upload_url}samba/patches/"
579
580 echo "Upload ${tagname}.tar.* to '${release_url}'"
581 ls -lart ${tagname}.tar.*
582 rsync -Pav --delay-updates ${tagname}.tar.* "${release_url}/" || {
583 return 1
584 }
585 rsync ${release_url}/${tagname}.tar.*
586
587 test -n "${patchfile}" || {
588 return 0
589 }
590
591 echo "Upload ${patchfile}.* to '${patch_url}'"
592 ls -lart ${patchfile}.*
593 rsync -Pav --delay-updates ${patchfile}.* "${patch_url}/" || {
594 return 1
595 }
596 rsync ${patch_url}/${patchfile}.*
597
598 return 0
599}
600
601upload_release() {
602 check_args "${FUNCNAME}" "$#" "0" || return 1
603
604 test -n "${upload_fn}" || {
605 echo "upload_fn variable empty"
606 return 1
607 }
608
609 echo "Running ${upload_fn}"
610 ${upload_fn}
611}
612
613announcement_samba_rc() {
614 check_args "${FUNCNAME}" "$#" "0" || return 1
615 require_tagname "${FUNCNAME}"
616
617 test -f "${tagname}.WHATSNEW.txt" || {
618 echo "${tagname}.WHATSNEW.txt does not exist"
619 return 1
620 }
621
622 local t=""
623 local version=$(echo "${tagname}" | sed -e 's!^samba-!!')
624 local href="#${version}"
625 local series=$(echo "${version}" | cut -d '.' -f1-2)
626 local rc=$(echo "${version}" | sed -e 's!.*rc\([0-9][0-9]*\)!\1!')
627 local rcname="${rc}th"
628 case "${rc}" in
629 1)
630 rcname="first"
631 ;;
632 2)
633 rcname="second"
634 ;;
635 3)
636 rcname="third"
637 ;;
638 4)
639 rcname="fourth"
640 ;;
641 5)
642 rcname="fifth"
643 ;;
644 esac
645
646 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.to.txt"
647 {
648 echo "samba-announce@lists.samba.org, samba@lists.samba.org, samba-technical@lists.samba.org"
649 } > announce.${tagname}.to.txt
650
651 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.subject.txt"
652 {
653 echo "[Announce] Samba ${version} Available for Download"
654 } > announce.${tagname}.subject.txt
655
656 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.mail.txt"
657 {
658 cat ${tagname}.WHATSNEW.txt
659 echo ""
660 echo "================"
661 echo "Download Details"
662 echo "================"
663 echo ""
664 echo "The uncompressed tarballs and patch files have been signed"
665 echo "using GnuPG (ID ${GPG_KEYID}). The source code can be downloaded"
666 echo "from:"
667 echo ""
668 echo " ${download_url}"
669 echo ""
670 echo "The release notes are available online at:"
671 echo ""
672 echo " ${download_url}${tagname}.WHATSNEW.txt"
673 echo ""
674 echo "Our Code, Our Bugs, Our Responsibility."
675 echo "(https://bugzilla.samba.org/)"
676 echo ""
677 echo " --Enjoy"
678 echo " The Samba Team"
679 } > announce.${tagname}.mail.txt
680
681 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.mutt-arguments.txt"
682 {
683 echo -n "-i announce.${tagname}.mail.txt "
684 echo -n "-s \"$(cat announce.${tagname}.subject.txt | xargs)\" "
685 echo -n "$(cat announce.${tagname}.to.txt | xargs)"
686 } > announce.${tagname}.mutt-arguments.txt
687
688 local headlinefile="posted_news/@UTCTIME@.${version}.headline.html"
689 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.headline.html"
690 {
691 echo "<!-- BEGIN: ${headlinefile} -->"
692 echo "<li> @UTCDATE@ <a href=\"${href}\">Samba ${version} Available for Download</a></li>"
693 echo "<!-- END: ${headlinefile} -->"
694 } > announce.${tagname}.headline.html
695
696 local bodyfile="posted_news/@UTCTIME@.${version}.body.html"
697 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.body.html"
698 {
699 echo "<!-- BEGIN: ${bodyfile} -->"
700 echo "<h5><a name=\"${version}\">@UTCDATE@</a></h5>"
701 echo "<p class="headline">Samba ${version} Available for Download</p>"
702 echo "<p>"
703 echo "This is the ${rcname} release candidate of the upcoming Samba ${series} release series."
704 echo "</p>"
705 echo "<p>"
706 echo "The uncompressed tarball has been signed using GnuPG (ID ${GPG_KEYID})."
707 echo "The source code can be <a href=\"${download_url}${tagname}.tar.gz\">downloaded now</a>."
708 echo "See <a href=\"${download_url}${tagname}.WHATSNEW.txt\">the release notes for more info</a>."
709 echo "</p>"
710 echo "<!-- END: ${bodyfile} -->"
711 } > announce.${tagname}.body.html
712
713 local webrepo="${TMPDIR}/webrepo"
714
715 mkdir "${webrepo}" || {
716 return 1
717 }
718 git -C "${webrepo}" init || {
719 return 1
720 }
721
722 mkdir -p "$(dirname ${webrepo}/${headlinefile})" || {
723 return 1
724 }
725 cp -a "announce.${tagname}.headline.html" "${webrepo}/${headlinefile}" || {
726 return 1
727 }
728
729 mkdir -p "$(dirname ${webrepo}/${bodyfile})" || {
730 return 1
731 }
732 cp -a "announce.${tagname}.body.html" "${webrepo}/${bodyfile}" || {
733 return 1
734 }
735
736 git -C "${webrepo}" add "${headlinefile}" "${bodyfile}" || {
737 return 1
738 }
739 git -C "${webrepo}" commit --signoff --message "NEWS[${version}]: Samba ${version} Available for Download" || {
740 return 1
741 }
742 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.patch.txt"
743 git -C "${webrepo}" format-patch --stdout -1 HEAD > announce.${tagname}.patch.txt || {
744 return 1
745 }
746
747 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.todo.txt"
748 {
749 ls -lart announce.${tagname}.*
750 echo ""
751 echo "NOTICE:"
752 echo "You need to do the following manual steps in order"
753 echo "to finish the announcement of ${tagname}!"
754 echo ""
755 echo "Change to a samba-web checkout and run"
756 echo " ./announce_samba_release.sh ${version} $(pwd)/announce.${tagname}.patch.txt"
757 echo ""
758 echo "Once the resulting commit is pushed a cron job will update "
759 echo "the content exported by the webserver every 5-10 mins."
760 echo "Check https://www.samba.org"
761 echo ""
762 echo "If the web content is updated, you need to send the announce mail (gpg signed)."
763 echo "- announce.${tagname}.to.txt contains the mail's recipients for the To: header."
764 echo "- announce.${tagname}.subject.txt contains the mail's subject line."
765 echo "- announce.${tagname}.mail.txt contains the content of the mail body."
766 echo "In case your're using mutt, you can use the following shortcut:"
767 echo " eval mutt \$(cat announce.${tagname}.mutt-arguments.txt)"
768 echo ""
769 echo "NOTICE: you're not done yet! Read the above instructions carefully!"
770 echo "See: announce.${tagname}.todo.txt"
771 echo ""
772 } > announce.${tagname}.todo.txt
773
774 ls -lart announce.${tagname}.*
775 return 0
776}
777
778announcement_samba_stable() {
779 check_args "${FUNCNAME}" "$#" "0" || return 1
780 require_tagname "${FUNCNAME}"
781
782 load_samba_stable_versions
783
784 test -f "${tagname}.tar.gz" || {
785 echo "${tagname}.tar.gz does not exist"
786 return 1
787 }
788
789 test -f "announce.${tagname}.quotation.txt" || {
790 echo "announce.${tagname}.quotation.txt missing!"
791 return 1
792 }
793
794 local release_url="${download_url}samba/stable/"
795 local patch_url="${download_url}samba/patches/"
796
797 echo "extract WHATSNEW.txt"
798 tar xf ${tagname}.tar.gz --to-stdout ${tagname}/WHATSNEW.txt > ${TMPDIR}/WHATSNEW.txt
799
800 local t=""
801 local oldversion=$(echo "${oldtagname}" | sed -e 's!^samba-!!')
802 local version=$(echo "${tagname}" | sed -e 's!^samba-!!')
803 local href="#${version}"
804 local series=$(echo "${version}" | cut -d '.' -f1-2)
805 local release=$(echo "${version}" | cut -d '.' -f3)
806 local releasename="latest"
807 case "${release}" in
808 1)
809 releasename="first"
810 ;;
811 *)
812 releasename="latest"
813 ;;
814 esac
815
816 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.to.txt"
817 {
818 echo "samba-announce@lists.samba.org, samba@lists.samba.org, samba-technical@lists.samba.org"
819 } > announce.${tagname}.to.txt
820
821 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.subject.txt"
822 {
823 echo "[Announce] Samba ${version} Available for Download"
824 } > announce.${tagname}.subject.txt
825
826 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.mail.txt"
827 {
828 local top=$(cat ${TMPDIR}/WHATSNEW.txt | grep -n '^Release notes for older releases follow:' | head -1 | cut -d ':' -f1)
829 test -n "${top}" || {
830 top=$(cat ${TMPDIR}/WHATSNEW.txt | wc -l)
831 }
832 local skip=$(cat ${TMPDIR}/WHATSNEW.txt | grep -n '^[^ ]' | head -1 | cut -d ':' -f1)
833 local bottom=$(expr ${top} - \( ${skip} - 1 \))
834
835 cat "announce.${tagname}.quotation.txt"
836 echo ""
837 echo ""
838 echo "Release Announcements"
839 echo "---------------------"
840 echo ""
841 head -${top} ${TMPDIR}/WHATSNEW.txt | tail -${bottom}
842 echo ""
843 echo "================"
844 echo "Download Details"
845 echo "================"
846 echo ""
847 echo "The uncompressed tarballs and patch files have been signed"
848 echo "using GnuPG (ID ${GPG_KEYID}). The source code can be downloaded"
849 echo "from:"
850 echo ""
851 echo " ${release_url}"
852 echo ""
853 echo "The release notes are available online at:"
854 echo ""
855 echo " ${history_url}${tagname}.html"
856 echo ""
857 echo "Our Code, Our Bugs, Our Responsibility."
858 echo "(https://bugzilla.samba.org/)"
859 echo ""
860 echo " --Enjoy"
861 echo " The Samba Team"
862 } > announce.${tagname}.mail.txt
863
864 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.mutt-arguments.txt"
865 {
866 echo -n "-i announce.${tagname}.mail.txt "
867 echo -n "-s \"$(cat announce.${tagname}.subject.txt | xargs)\" "
868 echo -n "$(cat announce.${tagname}.to.txt | xargs)"
869 } > announce.${tagname}.mutt-arguments.txt
870
871 local htmlfile="history/${tagname}.html"
872 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.html"
873 {
874 local tmp=$(cat ${TMPDIR}/WHATSNEW.txt | grep -n '^Reporting bugs & Development Discussion' | head -1 | cut -d ':' -f1)
875 local lines=$(expr ${tmp} - 2)
876
877 echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'
878 echo ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
879 echo '<html xmlns="http://www.w3.org/1999/xhtml">'
880
881 echo "<head>"
882 echo "<title>Samba ${version} - Release Notes</title>"
883 echo "</head>"
884
885 echo "<body>"
886 echo "<H2>Samba ${version} Available for Download</H2>"
887
888 echo "<p>"
889 echo "<a href=\"${release_url}${tagname}.tar.gz\">Samba ${version} (gzipped)</a><br>"
890 echo "<a href=\"${release_url}${tagname}.tar.asc\">Signature</a>"
891 echo "</p>"
892
893 test -n "${patchfile}" && {
894 echo "<p>"
895 echo "<a href=\"${patch_url}${patchfile}.gz\">Patch (gzipped) against Samba ${oldversion}</a><br>"
896 echo "<a href=\"${patch_url}${patchfile}.asc\">Signature</a>"
897 echo "</p>"
898 }
899
900 echo "<p>"
901 echo "<pre>"
902 head -${lines} ${TMPDIR}/WHATSNEW.txt | sed \
903 -e 's!&!\&amp;!g' | sed \
904 -e 's!<!\&lt;!g' \
905 -e 's!>!\&gt;!g' \
906 -e 's!À!\&auml;!g' \
907 -e 's!Ä!\&Auml;!g' \
908 -e 's!ö!\&ouml;!g' \
909 -e 's!Ö!\&Ouml;!g' \
910 -e 's!Ì!\&uuml;!g' \
911 -e 's!Ü!\&Uuml;!g' \
912 -e 's!ß!\&szlig;!g' \
913 -e 's!"!\&quot;!g' \
914 -e "s!'!\&apos;!g" \
915 | cat
916 echo "</pre>"
917 echo "</p>"
918
919 echo "</body>"
920 echo "</html>"
921 } > announce.${tagname}.html
922
923 local headlinefile="posted_news/@UTCTIME@.${version}.headline.html"
924 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.headline.html"
925 {
926 echo "<!-- BEGIN: ${headlinefile} -->"
927 echo "<li> @UTCDATE@ <a href=\"${href}\">Samba ${version} Available for Download</a></li>"
928 echo "<!-- END: ${headlinefile} -->"
929 } > announce.${tagname}.headline.html
930
931 local bodyfile="posted_news/@UTCTIME@.${version}.body.html"
932 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.body.html"
933 {
934 echo "<!-- BEGIN: ${bodyfile} -->"
935 echo "<h5><a name=\"${version}\">@UTCDATE@</a></h5>"
936 echo "<p class="headline">Samba ${version} Available for Download</p>"
937 echo "<p>"
938 echo "This is the ${releasename} stable release of the Samba ${series} release series."
939 echo "</p>"
940 echo "<p>"
941 echo "The uncompressed tarball has been signed using GnuPG (ID ${GPG_KEYID})."
942 echo "The source code can be <a href=\"${release_url}${tagname}.tar.gz\">downloaded now</a>."
943 test -n "${patchfile}" && {
944 echo "A <a href=\"${patch_url}${patchfile}.gz\">patch against Samba ${oldversion}</a> is also available."
945 }
946 echo "See <a href=\"${history_url}${tagname}.html\">the release notes for more info</a>."
947 echo "</p>"
948 echo "<!-- END: ${bodyfile} -->"
949 } > announce.${tagname}.body.html
950
951 local webrepo="${TMPDIR}/webrepo"
952
953 mkdir "${webrepo}" || {
954 return 1
955 }
956 git -C "${webrepo}" init || {
957 return 1
958 }
959
960 mkdir -p "$(dirname ${webrepo}/${htmlfile})" || {
961 return 1
962 }
963 cp -a "announce.${tagname}.html" "${webrepo}/${htmlfile}" || {
964 return 1
965 }
966
967 mkdir -p "$(dirname ${webrepo}/${headlinefile})" || {
968 return 1
969 }
970 cp -a "announce.${tagname}.headline.html" "${webrepo}/${headlinefile}" || {
971 return 1
972 }
973
974 mkdir -p "$(dirname ${webrepo}/${bodyfile})" || {
975 return 1
976 }
977 cp -a "announce.${tagname}.body.html" "${webrepo}/${bodyfile}" || {
978 return 1
979 }
980
981 git -C "${webrepo}" add "${htmlfile}" "${headlinefile}" "${bodyfile}" || {
982 return 1
983 }
984 git -C "${webrepo}" commit --signoff --message "NEWS[${version}]: Samba ${version} Available for Download" || {
985 return 1
986 }
987 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.patch.txt"
988 git -C "${webrepo}" format-patch --stdout -1 HEAD > announce.${tagname}.patch.txt || {
989 return 1
990 }
991
992 CLEANUP_FILES="${CLEANUP_FILES} announce.${tagname}.todo.txt"
993 {
994 ls -lart announce.${tagname}.*
995 echo ""
996 echo "NOTICE:"
997 echo "You need to do the following manual steps in order"
998 echo "to finish the announcement of ${tagname}!"
999 echo ""
1000 echo "Change to a samba-web checkout and run"
1001 echo " ./announce_samba_release.sh ${version} $(pwd)/announce.${tagname}.patch.txt"
1002 echo ""
1003 echo "Once the resulting commit is pushed a cron job will update "
1004 echo "the content exported by the webserver every 5-10 mins."
1005 echo "Check https://www.samba.org"
1006 echo ""
1007 echo "If the web content is updated, you need to send the announce mail (gpg signed)."
1008 echo "- announce.${tagname}.to.txt contains the mail's recipients for the To: header."
1009 echo "- announce.${tagname}.subject.txt contains the mail's subject line."
1010 echo "- announce.${tagname}.mail.txt contains the content of the mail body."
1011 echo "In case your're using mutt, you can use the following shortcut:"
1012 echo " eval mutt \$(cat announce.${tagname}.mutt-arguments.txt)"
1013 echo ""
1014 echo "NOTICE: you're not done yet! Read the above instructions carefully!"
1015 echo "See: announce.${tagname}.todo.txt"
1016 echo ""
1017 } > announce.${tagname}.todo.txt
1018
1019 ls -lart announce.${tagname}.*
1020 return 0
1021}
1022
1023announcement_release() {
1024 check_args "${FUNCNAME}" "$#" "0" || return 1
1025
1026 test -n "${announcement_fn}" || {
1027 echo "announcement_fn variable empty"
1028 return 1
1029 }
1030
1031 echo "Running ${announcement_fn}"
1032 ${announcement_fn}
1033}
1034
1035announce_release() {
1036 check_args "${FUNCNAME}" "$#" "0" || return 1
1037 require_tagname "${FUNCNAME}"
1038
1039 test -f "announce.${tagname}.todo.txt" || {
1040 echo "announce.${tagname}.todo.txt does not exist"
1041 return 1
1042 }
1043
1044 cat announce.${tagname}.todo.txt
1045 return 0
1046}
1047
1048case "${product}" in
1049talloc | tdb | tevent | ldb)
1050 test -z "${GPG_USER-}" && {
1051 GPG_USER='Samba Library Distribution Key <samba-bugs@samba.org>'
1052 }
1053
1054 test -z "${GPG_KEYID-}" && {
1055 GPG_KEYID='4793916113084025'
1056 }
1057
1058 productbase="${product}"
1059 srcdir="lib/${product}"
1060 repo_url="${CONF_REPO_URL}"
1061 upload_url="${CONF_UPLOAD_URL}/${product}/"
1062 download_url="${CONF_DOWNLOAD_URL}/${product}/"
1063
1064 check_fn="check_nopatch"
1065 upload_fn="upload_nopatch"
1066 fullcmds="create check push upload"
1067 ;;
1068samba-rc)
1069 test -z "${GPG_USER-}" && {
1070 GPG_USER='Samba Distribution Verification Key <samba-bugs@samba.org>'
1071 }
1072
1073 test -z "${GPG_KEYID-}" && {
1074 GPG_KEYID='6F33915B6568B7EA'
1075 }
1076
1077 productbase="samba"
1078 srcdir="."
1079 repo_url="${CONF_REPO_URL}"
1080 upload_url="${CONF_UPLOAD_URL}/samba/rc/"
1081 download_url="${CONF_DOWNLOAD_URL}/samba/rc/"
1082
1083 verify_fn="verify_samba_rc"
1084 check_fn="check_nopatch"
1085 upload_fn="upload_nopatch"
1086 announcement_fn="announcement_samba_rc"
1087 fullcmds="verify create check whatsnew announcement push upload announce"
1088 ;;
1089samba-stable)
1090 test -z "${GPG_USER-}" && {
1091 GPG_USER='Samba Distribution Verification Key <samba-bugs@samba.org>'
1092 }
1093
1094 test -z "${GPG_KEYID-}" && {
1095 GPG_KEYID='6F33915B6568B7EA'
1096 }
1097
1098 productbase="samba"
1099 srcdir="."
1100 repo_url="${CONF_REPO_URL}"
1101 upload_url="${CONF_UPLOAD_URL}/"
1102 download_url="${CONF_DOWNLOAD_URL}/"
1103 history_url="${CONF_HISTORY_URL}/samba/history/"
1104
1105 verify_fn="verify_samba_stable"
1106 check_fn="check_samba_stable"
1107 upload_fn="upload_samba_stable"
1108 announcement_fn="announcement_samba_stable"
1109 fullcmds="verify create patch check announcement push upload announce"
1110 ;;
1111TODO-samba-security)
1112 test -z "${GPG_USER-}" && {
1113 GPG_USER='Samba Distribution Verification Key <samba-bugs@samba.org>'
1114 }
1115
1116 test -z "${GPG_KEYID-}" && {
1117 GPG_KEYID='6F33915B6568B7EA'
1118 }
1119
1120 productbase="samba"
1121 srcdir="."
1122 repo_url="${CONF_REPO_URL}"
1123 upload_url="${CONF_UPLOAD_URL}/"
1124 download_url="${CONF_DOWNLOAD_URL}/"
1125 history_url="${CONF_HISTORY_URL}/samba/history/"
1126
1127 verify_fn="verify_samba_stable"
1128 check_fn="check_samba_stable"
1129 upload_fn="upload_samba_stable"
1130 announcement_fn="announcement_samba_security"
1131 fullcmds="verify create patch check announcement"
1132 next_cmd="push"
1133 ;;
1134*)
1135 usage
1136 echo "Unknown product ${product}"
1137 exit 1
1138esac
1139
1140pushd ${srcdir} || {
1141 echo "srcdir[${srcdir}] does not exist"
1142 exit 1
1143}
1144
1145trap_handler() {
1146 echo ""
1147 echo "ERROR: cleaning up"
1148 echo ""
1149
1150 for t in ${CLEANUP_TAGS}; do
1151 echo "Removing tag[${t}]"
1152 git tag -v "${t}" && {
1153 git tag -d "${t}" || {
1154 echo "failed to remove tag ${t}"
1155 }
1156 }
1157 done
1158
1159 for f in ${CLEANUP_FILES}; do
1160 echo "Removing file[${f}]"
1161 test -f "${f}" && {
1162 rm "${f}" || {
1163 echo "failed to remove ${f}"
1164 }
1165 }
1166 done
1167
1168 for d in ${CLEANUP_DIRS}; do
1169 echo "Removing dir[${d}]"
1170 test -d "${d}" && {
1171 rm -rf "${d}" || {
1172 echo "failed to remove ${d}"
1173 }
1174 }
1175 done
1176}
1177
1178CLEANUP_TAGS=""
1179CLEANUP_FILES=""
1180CLEANUP_DIRS=""
1181trap trap_handler INT QUIT TERM EXIT
1182
1183cmd_allowed "${globalcmd}" fullrelease ${fullcmds} || {
1184 usage
1185 echo "command[${globalcmd}] not supported for product[${product}]"
1186 exit 1
1187}
1188
1189case "${globalcmd}" in
1190fullrelease)
1191 check_args "${globalcmd}" "$#" "0" || exit 1
1192 cmds="${fullcmds}"
1193 ;;
1194create)
1195 check_args "${globalcmd}" "$#" "0" || exit 1
1196 check_args "create" "$#" "0" || exit 1
1197
1198 cmds=""
1199 cmd_allowed "verify" ${fullcmds} && {
1200 cmds="${cmds} verify"
1201 }
1202 cmds="${cmds} create"
1203 cmd_allowed "whatsnew" ${fullcmds} && {
1204 cmds="${cmds} whatsnew"
1205 }
1206 cmd_allowed "patch" ${fullcmds} && {
1207 cmds="${cmds} patch"
1208 }
1209 cmds="${cmds} check"
1210 cmd_allowed "announcement" ${fullcmds} && {
1211 cmds="${cmds} announcement"
1212 }
1213 next_cmd="push"
1214 ;;
1215push)
1216 check_args "${globalcmd}" "$#" "1" || exit 1
1217 tagname="$1"
1218 cmds="check push"
1219 next_cmd="upload"
1220 ;;
1221upload)
1222 check_args "${globalcmd}" "$#" "1" || exit 1
1223 tagname="$1"
1224 cmds="check upload"
1225 cmd_allowed "announce" ${fullcmds} && {
1226 next_cmd="announce"
1227 }
1228 ;;
1229announce)
1230 check_args "${globalcmd}" "$#" "1" || exit 1
1231 tagname="$1"
1232 cmds="check announce"
1233 ;;
1234*)
1235 usage
1236 echo "Unknown command ${globalcmd}"
1237 exit 1
1238 ;;
1239esac
1240
1241TMPDIR="release.$$"
1242CLEANUP_DIRS="${CLEANUP_DIRS} ${TMPDIR}"
1243umask 0077
1244mkdir "${TMPDIR}"
1245umask 0022
1246
1247for cmd in ${cmds}; do
1248 echo "Starting subcommand[${cmd}]"
1249 ${cmd}_release || {
1250 echo "Failed subcommand[${cmd}]"
1251 exit 1
1252 }
1253 echo "Finished subcommand[${cmd}]"
1254done
1255
1256test -d "${TMPDIR}" && {
1257 rm -rf "${TMPDIR}" || {
1258 echo "failed to remove ${TMPDIR}"
1259 }
1260}
1261
1262test -n "${next_cmd}" && {
1263 echo "Continue with '$0 ${product} ${next_cmd} ${tagname}'."
1264}
1265
1266trap - INT QUIT TERM EXIT
1267
1268exit 0
Note: See TracBrowser for help on using the repository browser.