[988] | 1 | #!/bin/bash
|
---|
| 2 | # make a release of Samba or a library
|
---|
| 3 |
|
---|
| 4 | LC_ALL=C
|
---|
| 5 | export LC_ALL
|
---|
| 6 | LANG=C
|
---|
| 7 | export LANG
|
---|
| 8 | LANGUAGE=C
|
---|
| 9 | export LANGUAGE
|
---|
| 10 |
|
---|
| 11 | set -u
|
---|
| 12 | set -e
|
---|
| 13 | umask 0022
|
---|
| 14 |
|
---|
| 15 | CONF_REPO_URL="ssh://git.samba.org/data/git/samba.git"
|
---|
| 16 | CONF_UPLOAD_URL="samba-bugs@download-master.samba.org:/home/data/ftp/pub"
|
---|
| 17 | CONF_DOWNLOAD_URL="https://download.samba.org/pub"
|
---|
| 18 | CONF_HISTORY_URL="https://www.samba.org"
|
---|
| 19 |
|
---|
| 20 | test -d ".git" || {
|
---|
| 21 | echo "Run this script from the top-level directory in the"
|
---|
| 22 | echo "repository"
|
---|
| 23 | exit 1
|
---|
| 24 | }
|
---|
| 25 |
|
---|
| 26 | usage() {
|
---|
| 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 |
|
---|
| 35 | check_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 |
|
---|
| 49 | min_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 |
|
---|
| 63 | min_args "$0" "$#" "2"
|
---|
| 64 |
|
---|
| 65 | product="$1"
|
---|
| 66 | globalcmd="$2"
|
---|
| 67 | shift 2
|
---|
| 68 | oldtagname=""
|
---|
| 69 | tagname=""
|
---|
| 70 | patchfile=""
|
---|
| 71 | cmds=""
|
---|
| 72 | next_cmd=""
|
---|
| 73 |
|
---|
| 74 | require_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 |
|
---|
| 92 | cmd_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 |
|
---|
| 104 | verify_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 |
|
---|
| 130 | load_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 |
|
---|
| 155 | verify_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 |
|
---|
| 258 | verify_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 |
|
---|
| 270 | create_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 |
|
---|
| 350 | patch_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 |
|
---|
| 396 | whatsnew_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 |
|
---|
| 407 | check_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 |
|
---|
| 456 | check_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 |
|
---|
| 534 | check_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 |
|
---|
| 546 | push_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 |
|
---|
| 558 | upload_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 |
|
---|
| 571 | upload_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 |
|
---|
| 601 | upload_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 |
|
---|
| 613 | announcement_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"
|
---|
[989] | 665 | echo "using GnuPG (ID ${GPG_KEYID}). The source code can be downloaded"
|
---|
[988] | 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 |
|
---|
| 778 | announcement_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"
|
---|
[989] | 848 | echo "using GnuPG (ID ${GPG_KEYID}). The source code can be downloaded"
|
---|
[988] | 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!&!\&!g' | sed \
|
---|
| 904 | -e 's!<!\<!g' \
|
---|
| 905 | -e 's!>!\>!g' \
|
---|
| 906 | -e 's!À!\ä!g' \
|
---|
| 907 | -e 's!Ã!\Ä!g' \
|
---|
| 908 | -e 's!ö!\ö!g' \
|
---|
| 909 | -e 's!Ã!\Ö!g' \
|
---|
| 910 | -e 's!ÃŒ!\ü!g' \
|
---|
| 911 | -e 's!Ã!\Ü!g' \
|
---|
| 912 | -e 's!Ã!\ß!g' \
|
---|
| 913 | -e 's!"!\"!g' \
|
---|
| 914 | -e "s!'!\'!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 |
|
---|
| 1023 | announcement_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 |
|
---|
| 1035 | announce_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 |
|
---|
| 1048 | case "${product}" in
|
---|
| 1049 | talloc | 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-}" && {
|
---|
[989] | 1055 | GPG_KEYID='4793916113084025'
|
---|
[988] | 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 | ;;
|
---|
| 1068 | samba-rc)
|
---|
| 1069 | test -z "${GPG_USER-}" && {
|
---|
| 1070 | GPG_USER='Samba Distribution Verification Key <samba-bugs@samba.org>'
|
---|
| 1071 | }
|
---|
| 1072 |
|
---|
| 1073 | test -z "${GPG_KEYID-}" && {
|
---|
[989] | 1074 | GPG_KEYID='6F33915B6568B7EA'
|
---|
[988] | 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 | ;;
|
---|
| 1089 | samba-stable)
|
---|
| 1090 | test -z "${GPG_USER-}" && {
|
---|
| 1091 | GPG_USER='Samba Distribution Verification Key <samba-bugs@samba.org>'
|
---|
| 1092 | }
|
---|
| 1093 |
|
---|
| 1094 | test -z "${GPG_KEYID-}" && {
|
---|
[989] | 1095 | GPG_KEYID='6F33915B6568B7EA'
|
---|
[988] | 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 | ;;
|
---|
| 1111 | TODO-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-}" && {
|
---|
[989] | 1117 | GPG_KEYID='6F33915B6568B7EA'
|
---|
[988] | 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
|
---|
| 1138 | esac
|
---|
| 1139 |
|
---|
| 1140 | pushd ${srcdir} || {
|
---|
| 1141 | echo "srcdir[${srcdir}] does not exist"
|
---|
| 1142 | exit 1
|
---|
| 1143 | }
|
---|
| 1144 |
|
---|
| 1145 | trap_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 |
|
---|
| 1178 | CLEANUP_TAGS=""
|
---|
| 1179 | CLEANUP_FILES=""
|
---|
| 1180 | CLEANUP_DIRS=""
|
---|
| 1181 | trap trap_handler INT QUIT TERM EXIT
|
---|
| 1182 |
|
---|
| 1183 | cmd_allowed "${globalcmd}" fullrelease ${fullcmds} || {
|
---|
| 1184 | usage
|
---|
| 1185 | echo "command[${globalcmd}] not supported for product[${product}]"
|
---|
| 1186 | exit 1
|
---|
| 1187 | }
|
---|
| 1188 |
|
---|
| 1189 | case "${globalcmd}" in
|
---|
| 1190 | fullrelease)
|
---|
| 1191 | check_args "${globalcmd}" "$#" "0" || exit 1
|
---|
| 1192 | cmds="${fullcmds}"
|
---|
| 1193 | ;;
|
---|
| 1194 | create)
|
---|
| 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 | ;;
|
---|
| 1215 | push)
|
---|
| 1216 | check_args "${globalcmd}" "$#" "1" || exit 1
|
---|
| 1217 | tagname="$1"
|
---|
| 1218 | cmds="check push"
|
---|
| 1219 | next_cmd="upload"
|
---|
| 1220 | ;;
|
---|
| 1221 | upload)
|
---|
| 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 | ;;
|
---|
| 1229 | announce)
|
---|
| 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 | ;;
|
---|
| 1239 | esac
|
---|
| 1240 |
|
---|
| 1241 | TMPDIR="release.$$"
|
---|
| 1242 | CLEANUP_DIRS="${CLEANUP_DIRS} ${TMPDIR}"
|
---|
| 1243 | umask 0077
|
---|
| 1244 | mkdir "${TMPDIR}"
|
---|
| 1245 | umask 0022
|
---|
| 1246 |
|
---|
| 1247 | for 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}]"
|
---|
| 1254 | done
|
---|
| 1255 |
|
---|
| 1256 | test -d "${TMPDIR}" && {
|
---|
| 1257 | rm -rf "${TMPDIR}" || {
|
---|
| 1258 | echo "failed to remove ${TMPDIR}"
|
---|
| 1259 | }
|
---|
| 1260 | }
|
---|
| 1261 |
|
---|
| 1262 | test -n "${next_cmd}" && {
|
---|
| 1263 | echo "Continue with '$0 ${product} ${next_cmd} ${tagname}'."
|
---|
| 1264 | }
|
---|
| 1265 |
|
---|
| 1266 | trap - INT QUIT TERM EXIT
|
---|
| 1267 |
|
---|
| 1268 | exit 0
|
---|