You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by co...@apache.org on 2023/01/31 14:47:46 UTC

svn commit: r1907145 - in /apr/site/trunk/tools: common-lib.sh env.sh r6-announce.sh

Author: covener
Date: Tue Jan 31 14:47:46 2023
New Revision: 1907145

URL: http://svn.apache.org/viewvc?rev=1907145&view=rev
Log:
announce helper ported from httpd


Added:
    apr/site/trunk/tools/common-lib.sh   (with props)
    apr/site/trunk/tools/env.sh
    apr/site/trunk/tools/r6-announce.sh   (with props)

Added: apr/site/trunk/tools/common-lib.sh
URL: http://svn.apache.org/viewvc/apr/site/trunk/tools/common-lib.sh?rev=1907145&view=auto
==============================================================================
--- apr/site/trunk/tools/common-lib.sh (added)
+++ apr/site/trunk/tools/common-lib.sh Tue Jan 31 14:47:46 2023
@@ -0,0 +1,545 @@
+#!/bin/sh
+
+#Make sure English is used when formating dates and other things
+export LANG=en_US.UTF-8
+
+
+fail() {
+  if test -n "$*"; then
+    echo "ERROR: $*" >&2
+  fi
+  exit 1
+}
+
+warn() {
+  if test -n "$*"; then
+    echo "WARNING: $*" >&2
+  fi
+  if test "$exit_on_warnings" = 1; then
+    exit 1
+  fi
+}
+
+is_int() {
+  x=`expr $1 + 0 2>/dev/null`
+  test "$x" = "$1"
+}
+
+ask_yes_no() {
+  if test "${ALWAYS_YES}" = 1; then
+    return 0
+  fi
+  read -r -p "$* [y/N] " response
+  case "$response" in
+      [yY][eE][sS]|[yY])
+          return 0
+          ;;
+  esac
+  return 1
+}
+
+assure_commands() {
+  # check that all commands that we need are available
+  ok=1
+  for cmd in svn git jq sed curl perl awk; do
+    if ! type "$cmd" >/dev/null 2>&1; then
+      echo "ERROR: needed command not found: $cmd" >&2
+      ok=0
+    fi
+  done
+  if test "$ok" != 1; then
+    fail "please install the missing components."
+  fi
+}
+
+# Inspect the local directory and populate
+# SVN_URL   the absolute url of the local checkout
+# SVN_BASE  the base url of the project
+# SVN_SRC   the path relative of SVN_BASE of the checkout
+# SVN_REV   the revision of the checkout
+detect_checkout() {
+  out=`svn stat 2>&1 >/dev/null`
+  test -z "$out" || fail "local directory does not seem to be a SVN checkout.\n$out"
+  SVN_URL=`svn info --show-item url` || fail "unable to determine SVN url"
+  test -n "$SVN_URL" || fail "unable to determine SVN url"
+  case "$SVN_URL" in
+    */trunk)
+      SVN_BASE=`echo $SVN_URL | sed -e 's,/trunk,,'`
+      SVN_SRC=trunk
+      ;;
+    */branches/*)
+      SVN_BASE=`echo $SVN_URL | sed -e 's,/branches/.*,,'`
+      SVN_SRC=`echo $SVN_URL | sed -e 's,.*/branches/,branches/,'`
+      ;;
+    *)
+      fail "unable to detect path in $SVN_URL"
+      ;;
+  esac
+  SVN_REV=`svn info --show-item revision` || fail "unable to determine SVN revision"
+  test -n "$SVN_REV" || fail "unable to determine SVN revision"
+  PROJECT=`basename $SVN_BASE`
+}
+
+assure_clean_checkout() {
+  out=`svn stat`
+  test -z "$out" || fail "local checkout is not clean.\n$out"
+}
+
+# given the version input (possibly empty),
+# detect/check the version components and set variabels
+# VERSION      the version string "major.minor.patch"
+# FULL_VERSION $VERSION plus the optional suffix
+# v_major      the major integer
+# v_minor      the minor integer
+# v_patch      the patch integer
+# v_suffix     the optional suffix, e.g. 'rc1' or so
+detect_version() {
+  assure_commands
+  version=$1
+  case "$version" in
+    rc*)
+      v_suffix="$version"
+      version=""
+      ;;
+  esac
+  if test -z "$version"; then
+    # did we record it already?
+    if test -f "${DIST_DIR}/VERSION"; then
+      source "${DIST_DIR}/VERSION"
+    elif test -f include/ap_release.h; then
+      # determine version from local files
+      v_major=`grep -E '#define\sAP_SERVER_MAJORVERSION_NUMBER' include/ap_release.h | awk '{print $3}'`
+      v_minor=`grep -E '#define\sAP_SERVER_MINORVERSION_NUMBER' include/ap_release.h | awk '{print $3}'`
+      v_patch=`grep -E '#define\sAP_SERVER_PATCHLEVEL_NUMBER'   include/ap_release.h | awk '{print $3}'`
+    else
+      fail "unable to determine version in local checkout"
+    fi
+  else
+    v_major=`echo $version | cut -d "." -f 1`
+    v_minor=`echo $version | cut -d "." -f 2`
+    #Not currently used in this script, but make it available. Support -alpha, -beta -rcX names here
+    v_patch=`echo $version | cut -d "." -f 3 | sed -e 's/-.*//'`
+    v_suffix=`echo $version | cut -d "." -f 3 | sed -e 's/[^-]*-//'`
+    if test "$v_suffix" = "$v_patch"; then
+      v_suffix=""
+    fi
+  fi
+
+  is_int ${v_major} || fail "version major '${v_major}' is not a number"
+  is_int ${v_minor} || fail "version minor '${v_minor}' is not a number"
+  is_int ${v_patch} || fail "version patch '${v_patch}' is not a number"
+
+  # double check that our checkout matches the version we detected
+  if test -f include/ap_release.h; then
+    svn_v_major=`grep -E '#define\sAP_SERVER_MAJORVERSION_NUMBER' include/ap_release.h | awk '{print $3}'`
+    svn_v_minor=`grep -E '#define\sAP_SERVER_MINORVERSION_NUMBER' include/ap_release.h | awk '{print $3}'`
+    if test "$v_major" != "$svn_v_major" -o "$v_minor" != "$svn_v_minor"; then
+      fail "detect version ${v_major}.${v_minor} does not match checkout verison ${svn_v_major}.${svn_v_minor}"
+    fi
+  fi
+  VERSION="${v_major}.${v_minor}.${v_patch}"
+  FULL_VERSION="${VERSION}"
+  if test -n "${v_suffix}"; then
+    FULL_VERSION="${VERSION}-${v_suffix}"
+  fi
+}
+
+save_version() {
+  cat <<EOF > "${DIST_DIR}/VERSION"
+v_major="${v_major}"
+v_minor="${v_minor}"
+v_patch="${v_patch}"
+v_suffix="${v_suffix}"
+EOF
+}
+
+check_autotools() {
+  #--------------------------------------------------------------------------
+  # autoconf 2.59 or newer
+  #
+  ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
+  if test -z "$ac_version"; then
+    echo "buildcheck: autoconf not found."
+    echo "            You need autoconf version 2.59 or newer installed."
+    exit 1
+  fi
+  IFS=.; set $ac_version; IFS=' '
+  if test "$1" = "2" -a "$2" -lt "59" || test "$1" -lt "2"; then
+    echo "buildcheck: autoconf version $ac_version found."
+    echo "            You need autoconf version 2.59 or newer installed."
+    echo "            If you have a sufficient autoconf installed, but it"
+    echo "            is not named 'autoconf', then try setting the"
+    echo "            AUTOCONF environment variable.  (See the INSTALL file"
+    echo "            for details.)"
+    exit 1
+  fi
+
+  echo "check: autoconf version $ac_version (ok)"
+
+  #--------------------------------------------------------------------------
+  # autoheader 2.53 or newer
+  #
+  ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
+  if test -z "$ah_version"; then
+    echo "buildcheck: autoheader not found."
+    echo "            You need autoheader version 2.59 or newer installed."
+    exit 1
+  fi
+  IFS=.; set $ah_version; IFS=' '
+  if test "$1" = "2" -a "$2" -lt "59" || test "$1" -lt "2"; then
+    echo "buildcheck: autoheader version $ah_version found."
+    echo "            You need autoheader version 2.59 or newer installed."
+    echo "            If you have a sufficient autoheader installed, but it"
+    echo "            is not named 'autoheader', then try setting the"
+    echo "            AUTOHEADER environment variable.  (See the INSTALL file"
+    echo "            for details.)"
+    exit 1
+  fi
+
+  echo "check: autoheader version $ah_version (ok)"
+
+  #--------------------------------------------------------------------------
+  # libtool 1.4.3 or newer
+  #
+  LIBTOOL_WANTED_MAJOR=1
+  LIBTOOL_WANTED_MINOR=5
+  LIBTOOL_WANTED_PATCH=10
+  LIBTOOL_WANTED_VERSION=1.5.10
+
+  libtool=`which glibtool 2>/dev/null`
+  if test ! -x "$libtool"; then
+    libtool=`which libtool`
+  fi
+  lt_pversion=`$libtool --version 2>/dev/null|head -1|sed -e 's/^[^0-9]*//' -e 's/[- ].*//'`
+
+  if test -z "$lt_pversion"; then
+    echo "buildcheck: libtool not found."
+    echo "            You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
+    exit 1
+  fi
+  lt_version=`echo $lt_pversion|sed -e 's/\([a-z]*\)$/.\1/'`
+  IFS=.; set $lt_version; IFS=' '
+  lt_status="good"
+  if test "$1" = "$LIBTOOL_WANTED_MAJOR"; then
+     if test "$2" -lt "$LIBTOOL_WANTED_MINOR"; then
+        lt_status="bad"
+     elif test ! "$2" -gt "$LIBTOOL_WANTED_MINOR" -a \
+          ! -z "$LIBTOOL_WANTED_PATCH"; then
+         if test "$3" -lt "$LIBTOOL_WANTED_PATCH"; then
+             lt_status="bad"
+         fi
+     fi
+  fi
+  if test $lt_status != "good"; then
+    echo "buildcheck: libtool version $lt_pversion found."
+    echo "            You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
+    exit 1
+  fi
+
+  echo "check: libtool version $lt_pversion (ok)"
+}
+
+create_dist_checksums() {
+  if ! openssl version >/dev/null; then
+    fail "unable to find 'openssl' in path"
+  fi
+  for path in "$@"; do
+    pushd `dirname "$path"` >/dev/null
+    file=`basename "$path"`
+    echo " - create checksums for ${file}"
+    openssl sha256 ${file} | sed -e 's#^SHA256(\(.*\))= \([0-9a-f]*\)$#\2 *\1#' > ${file}.sha256
+    openssl sha512 ${file} | sed -e 's#^SHA512(\(.*\))= \([0-9a-f]*\)$#\2 *\1#' > ${file}.sha512
+    popd > /dev/null
+  done
+}
+
+sign_dist_files() {
+  signing_user="$1"; shift
+
+  # check for executables
+  gpg2="`which gpg2 2> /dev/null | head -1`"
+  gpg="`which gpg 2> /dev/null | head -1`"
+  pgp="`which pgp 2> /dev/null | head -1`"
+
+  # there are 3 possible ways to sign, check in preference
+  if test -x "${gpg2}"; then
+    if test -z "${signing_user}"; then
+      args="--default-key"
+    else
+      args="-u ${signing_user}"
+    fi
+    for file in "$@"; do
+      echo " - gpg2: creating asc signature file for ${file} ..."
+      ${gpg2} --armor ${args} --detach-sign ${file}
+    done
+  elif test -x "${gpg}"; then
+    args=""
+    if test -n "${signing_user}"; then
+      args="-u ${signing_useruser}"
+    fi
+    for file in "$@"; do
+      echo " - gpg: creating asc signature file for ${file} ..."
+      ${gpg} --armor ${args} --detach-sign ${file}
+    done
+  elif test -x "${pgp}"; then
+    args=""
+    if test -n "${signing_user}"; then
+      args="-u ${signing_user}"
+    fi
+    for file in "$@"; do
+      echo " - pgp: creating asc signature file for ${file} ..."
+      ${pgp} -sba ${file} ${args}
+    done
+  else
+    fail "neither PGP nor GnuPG found! Not signing release!"
+  fi
+}
+
+export_httpd_srclib() {
+  apr_tag="$1"
+  apu_tag="$2"
+  export_dir="$3"
+  test -d "$export_dir" || fail "not a directory: $export_dir"
+
+  if test -z "$apr_tag" -o -z "$apu_tag"; then
+    if ! curl --version >/dev/null 2>&1;then
+      fail "curl must be available to retrieve the latest apr versions."
+    fi
+
+    if test "`echo 'test-1.2.3' | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+'`" != "1.2.3";then
+      fail "your system must support 'grep -o' to retrieve the latest apr versions."
+    fi
+  fi
+
+  SVNHOST=svn.apache.org
+  download_url="https://apr.apache.org/download.cgi"
+  echo "Determining latest APR and APU versions from $download_url..."
+
+  if test -z "$apr_tag"; then
+    apr_tag=`curl -s $download_url | grep 'APR [0-9].*is the best available version' | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+'`
+    if test -z "$apr_tag"; then
+      fail "failed to determine latest APR version from $download_url"
+    else
+      echo "  APR: $apr_tag"
+    fi
+  fi
+
+  if test -z "$apu_tag"; then
+    apu_tag=`curl -s $download_url | grep 'APR-util [0-9].*is the best available version' | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+'`
+    if test -z "$apu_tag"; then
+      fail "failed to determine latest APR version from $download_url"
+    else
+      echo "  APU: $apu_tag"
+    fi
+  fi
+
+  echo "Exporting apr-${apr_tag} to ${export_dir}/srclib ..."
+  svn export https://${SVNHOST}/repos/asf/apr/apr/tags/${apr_tag} "${export_dir}"/srclib/apr > /dev/null || exit 1
+  echo "Exporting apr-util-${apu_tag} to ${export_dir}/srclib ..."
+  svn export https://${SVNHOST}/repos/asf/apr/apr-util/tags/${apu_tag} "${export_dir}"/srclib/apr-util > /dev/null || exit 1
+}
+
+buildconf_httpd_export() {
+  export_dir="$1"
+  test -d "$export_dir" || fail "not a directory: $export_dir"
+  pushd "${export_dir}" > /dev/null
+    find . -name autom4te*.cache | xargs rm -rf
+    ./buildconf || fail
+    find . -name autom4te*.cache | xargs rm -rf
+  popd > /dev/null
+}
+
+fixup_httpd_export() {
+  export_dir="$1"
+  test -d "$export_dir" || fail "not a directory: $export_dir"
+
+  find "${export_dir}" -name STATUS | xargs rm -rf
+  if test -f "${export_dir}/modules/ssl/ssl_expr_parse.y"; then
+      touch "${export_dir}"/modules/ssl/ssl_expr_parse.c
+      touch "${export_dir}"/modules/ssl/ssl_expr_parse.h
+      touch "${export_dir}"/modules/ssl/ssl_expr_scan.c
+  elif test -f "${export_dir}/server/util_expr_parse.y"; then
+      touch "${export_dir}"/server/util_expr_parse.c
+      touch "${export_dir}"/server/util_expr_parse.h
+      touch "${export_dir}"/server/util_expr_scan.c
+  else
+      warn "found no expression parser to fix in export!"
+  fi
+  find "${export_dir}"/docs/manual -name \*.xml -o -name \*.xml.\* | xargs rm -rf
+  find "${export_dir}"/docs/manual -name \*.xsl -o -name \*.xsl.\* | xargs rm -rf
+}
+
+indent_entry() {
+  indent="$1"
+  indent="${indent:-  *) }"
+  while read line; do
+     echo "${indent}${line}"
+     indent="     "
+  done
+}
+
+cve_changes() {
+  CVE_JSON="$1"
+  test -f "${CVE_JSON}" || fail "cve_changes: ${CVE_JSON} not found"
+  CVE_ID=`jq -r .cveMetadata.cveId "${CVE_JSON}"`
+  CVE_TITLE=`jq -r .containers.cna.title "${CVE_JSON}"`
+  test -n "${CVE_ID}" -a "${CVE_ID}" != "null" || fail "CVE ID missing in ${CVE_JSON}"
+  CVE_DESCR=`jq -r '.containers.cna.descriptions[0].value' "${CVE_JSON}"`
+  cat << EOF | fold -sw 65 | indent_entry
+SECURITY: ${CVE_ID}: ${CVE_TITLE} (cve.mitre.org)
+${CVE_DESCR}
+
+EOF
+  CVE_CREDIT=`jq -r '.containers.cna.credits[0].value' "${CVE_JSON}"`
+  if test -n "${CVE_CREDIT}" -a "${CVE_CREDIT}" != "null"; then
+    cat << EOF | fold -sw 65 | indent_entry "     "
+Credits: ${CVE_CREDIT}
+
+EOF
+  fi
+}
+
+add_changes_entry() {
+  CHANGES="$1"
+  CVE_JSON="$2"
+  test -f "${CHANGES}" || fail "add_changes_entry: changes ${CHANGES} not found"
+
+  cp "${CHANGES}" "${CHANGES}.tmp" ;
+  cve_changes "${CVE_JSON}" > "${CHANGES}.entry.tmp"
+  awk -v fname="${CHANGES}.entry.tmp" \
+    'BEGIN{done = 0; active = 0} done == 0 && active == 0 && /^Changes with Apache /{
+        active = 1; print; next};
+      /^( *\*|Changes with Apache )/ && active == 1 && done == 0 {
+        rec=$0; while(getline<fname) {
+          if (! ($0 ~ /^ *$/)){print}
+        }
+        printf "\n"; print rec; active = 0; done = 1; next
+      } //;' "${CHANGES}".tmp > "${CHANGES}"
+  rm -f "${CHANGES}".tmp "${CHANGES}.entry.tmp"
+}
+
+stage_checkout_release() {
+  # make sure we are up-to-date
+  svn up
+  # calculate the next patch version
+  is_int ${v_patch} || fail "version patch '${v_patch}' is not a number"
+  next_patch=`expr ${v_patch} + 1`
+  NEXT_VERSION="${v_major}.${v_minor}.${next_patch}"
+
+  # Add the corresponding version placeholder in CHANGES.
+  perl -pi -e "s{(.*coding: utf-8.*)}{\$1\nChanges with Apache ${NEXT_VERSION}\n}" CHANGES
+  # Note the tag date in the STATUS file.
+  if test -f STATUS; then
+    date_string=`date '+%B %d, %Y'`
+    perl -pi -e '
+      if(/^(\s+)('${VERSION}'\s+):/){
+        $size = length $2;
+        $newline1 = sprintf("${1}%-${size}s", "'${NEXT_VERSION}'") . ": In development\n";
+        $newline2 = sprintf("${1}%-${size}s", "'${VERSION}'") . ": Released on '"${date_string}"'\n";
+        $_="${newline1}${newline2}";
+      }
+      ' STATUS
+  fi
+
+  # set the patch number of the next version
+  if test -f include/ap_release.h; then
+    echo "setting patch number in include/ap_release.h"
+    perl -pi -e 's/(#define\s+AP_SERVER_PATCHLEVEL_NUMBER\s+)\d*/${1}'${next_patch}'/g' include/ap_release.h
+    if ! grep -e "^#define *AP_SERVER_PATCHLEVEL_NUMBER *${next_patch}\$" include/ap_release.h >/dev/null 2>&1;then
+      fail "setting of AP_SERVER_PATCHLEVEL_NUMBER did not return expected value of ${next_patch}"
+    fi
+  fi
+
+  # Ensure the Copyright date reflects the current year
+  current_year=`date +%Y`
+  for src in NOTICE docs/manual/style/xsl/common.xsl; do
+    if test -f "$src"; then
+      perl -pi -e "s/Copyright \d+ The Apache Software Foundation./Copyright $current_year The Apache Software Foundation./g" "$src"
+    fi
+  done
+
+  if test -d docs/manual; then
+    if test -f docs/manual/style/version.ent; then
+      # Set ENTITY httpd.patch in docs/manual/style/version.ent.
+      echo "setting patch version in docs/manual/style/version.ent"
+      perl -pi -e 's/(.*ENTITY httpd.patch ")(\d+)(.*)/${1}'${next_patch}'${3}/g' docs/manual/style/version.ent
+      if ! grep -e "ENTITY *httpd.patch *\"${next_patch}\"" docs/manual/style/version.ent >/dev/null 2>&1;then
+        fail "setting of ENTITY httpd.patch did not return expected value of ${next_patch}"
+      fi
+    fi
+
+    echo "rebuilding manuals"
+    pushd docs/manual >/dev/null
+    #See http://httpd.apache.org/docs-project/docsformat.html for these instructions
+    if test -d build; then
+      svn update build
+    else
+      svn checkout "${SVN_DOCS_BUILD_URL}/trunk" build
+    fi
+    pushd build >/dev/null
+    ./build.sh all convmap
+    ./build.sh validate-xml
+    ./build.sh validate-xhtml
+    popd >/dev/null
+    popd >/dev/null
+  fi
+}
+
+checkout_pmc() {
+  dest="$1"
+  test -n "${SVN_PMC_URL}" || fail "SVN_PMC_URL not set"
+  echo "checking out pmc/${PROJECT} as ${dest}"
+  rm -rf "${dest}"
+  svn checkout "${SVN_PMC_URL}/${PROJECT}" "${dest}" >/dev/null
+}
+
+calc_ready_CVE_DIRS() {
+  dest="$1"
+  checkout_pmc "${dest}"
+  pushd "${dest}/SECURITY" >/dev/null
+  CVE_SUBDIRS=`./tools/readiness.sh -n | fgrep '[OK]'| awk '{print $2}' | sort `
+  popd >/dev/null
+
+  cves_ok=1
+  CVE_DIRS=""
+  for CVE in $CVE_SUBDIRS; do
+    CVE=`basename "${CVE}"`
+    if test -f "${dest}/SECURITY/${CVE}/CVE.json"; then
+      CVE_DIRS="$CVE_DIRS ${CVE}"
+    else
+      echo "ERROR: CVE ${CVE} does not have a CVE.json file."
+      cves_ok=0
+    fi
+  done
+  if test "${cves_ok}" != 1; then
+    fail "Please correct the files mentioned."
+  fi
+}
+
+get_version_CVE_DIRS() {
+  dest="$1"
+  checkout_pmc "${dest}"
+  cve_version_dir="${dest}/SECURITY/${PROJECT}-${FULL_VERSION}"
+  if ! test -d "${cve_version_dir}"; then
+    echo "CVE Directory '${cve_version_dir}' does not exist."
+    echo "It should have been created and committed during creation of the candidate."
+    fail "something is wrong with the state of ${cve_version_dir}"
+  fi
+  cves_ok=1
+  CVE_DIRS=""
+  for CVE in "${cve_version_dir}"/*; do
+    if ! test -d "${CVE}"; then
+      continue
+    fi
+    CVE=`basename "${CVE}"`
+    if test -f "${dest}/SECURITY/${CVE}/CVE.json"; then
+      CVE_DIRS="$CVE_DIRS ${CVE}"
+    else
+      echo "ERROR: CVE ${CVE} does not have a CVE.json file."
+      cves_ok=0
+    fi
+  done
+  if test "${cves_ok}" != 1; then
+    fail "Please correct the files mentioned."
+  fi
+}

Propchange: apr/site/trunk/tools/common-lib.sh
------------------------------------------------------------------------------
    svn:executable = *

Added: apr/site/trunk/tools/env.sh
URL: http://svn.apache.org/viewvc/apr/site/trunk/tools/env.sh?rev=1907145&view=auto
==============================================================================
--- apr/site/trunk/tools/env.sh (added)
+++ apr/site/trunk/tools/env.sh Tue Jan 31 14:47:46 2023
@@ -0,0 +1,5 @@
+DIST_DIR="dist"
+SVN_DIST_URL="https://dist.apache.org/repos/dist/"
+SVN_PMC_URL="https://svn.apache.org/repos/private/pmc"
+SVN_DOCS_BUILD_URL="https://svn.apache.org/repos/asf/httpd/docs-build"
+GIT_SITE_URL="git@github.com:apache/httpd-site.git"

Added: apr/site/trunk/tools/r6-announce.sh
URL: http://svn.apache.org/viewvc/apr/site/trunk/tools/r6-announce.sh?rev=1907145&view=auto
==============================================================================
--- apr/site/trunk/tools/r6-announce.sh (added)
+++ apr/site/trunk/tools/r6-announce.sh Tue Jan 31 14:47:46 2023
@@ -0,0 +1,134 @@
+#!/bin/sh
+
+# Announce a committed release to the world. Copied from httpd.
+# Note: This is safe to run while debugging as it only creates mail input
+
+#Useful for debugging
+#set -x
+
+#Bail when non-zero return codes are encountered
+set -e
+
+usage () {
+    cat <<EOF 1>&2
+usage: $0 [options]
+  Announce a committed release to the world.
+  Options:
+    -h             print usage information
+    -u user-id     your apache user-id, e.g 'ylavic'
+    -p project (apr, apr-util)
+    -v VERSION (1.7.1)
+EOF
+  exit 1
+}
+
+asf_id=""
+PROJECT=""
+VERSION=""
+
+while getopts "hu:yp:v:" opt; do
+    case $opt in
+        h)  usage
+            ;;
+        u)  asf_id="$OPTARG"
+            ;;
+        p)  PROJECT="$OPTARG"
+            ;;
+        v)  VERSION="$OPTARG"
+            ;;
+        y)  ALWAYS_YES=1
+            ;;
+    esac
+done
+shift $((OPTIND-1))
+
+source `dirname $0`/common-lib.sh
+source `dirname $0`/env.sh
+
+test -n "${asf_id}" || fail "please specify your ASF id as '-u <asf-id>'"
+test -n "${PROJECT}" || fail "please specify your apr or apr-util with -p'"
+test -n "${VERSION}" || fail "please specify your VERSION with -v'"
+
+v_major=`echo $VERSION| cut -d "." -f 1`
+v_minor=`echo $VERSION| cut -d "." -f 2`
+
+PROJECT_SUBJECT="Apache Portable Runtime"
+CHANGES_FILE="CHANGES-APR"
+case ${PROJECT} in
+    apr) ;;
+    apr-util) PROJECT_SUBJECT="Apache Portable Runtime Utility"
+              CHANGES_FILE="CHANGES-APR-UTIL"
+        ;;
+    *) echo "Teach me about ${PROJECT}"
+       exit 1
+       ;;
+esac
+
+AO_DIST_PATH="dist/apache.org-dist"
+AO_DIST_RELEASE_PATH="${AO_DIST_PATH}/release/apr"
+
+TAR_BASENAME="${PROJECT}-${VERSION}"
+ANNOUNCEMENT="Announcement${v_major}.x.txt"
+ANNOUNCE_LISTS="announce@apache.org announce@apr.apache.org"
+
+# SVN repository is huge, carefully check out only what we need
+rm -rf "${AO_DIST_PATH}"
+echo "checking out dist from ${SVN_DIST_URL} ..."
+svn checkout --depth=empty "$SVN_DIST_URL" "${AO_DIST_PATH}" >/dev/null
+echo "checking out ${AO_DIST_RELEASE_PATH} ..."
+svn update --set-depth immediates --parents "${AO_DIST_RELEASE_PATH}" >/dev/null
+
+if ! ls "${AO_DIST_RELEASE_PATH}/${TAR_BASENAME}".* >/dev/null 2>&1; then
+  fail "not found: ${AO_DIST_RELEASE_PATH}/${TAR_BASENAME}.*"
+fi
+if ! test -f "${AO_DIST_RELEASE_PATH}/${CHANGES_FILE}-${v_major}.${v_minor}"; then
+  fail "not found: ${AO_DIST_RELEASE_PATH}/${CHANGES_FILE}-${v_major}.${v_minor}"
+fi
+if ! test -f "${AO_DIST_RELEASE_PATH}/${ANNOUNCEMENT}"; then
+  fail "not found: ${AO_DIST_RELEASE_PATH}/${ANNOUNCEMENT}"
+fi
+
+
+DATE=`date '+%a, %d %b %Y %H:%M:%S %z'`
+email="${asf_id}@apache.org"
+
+echo "Announcement Emails are being prepared in ${DIST_DIR}/mail_announce_*."
+echo "You may use the following commands to send these:"
+echo ""
+counter=0
+for rcpt in ${ANNOUNCE_LISTS}; do
+    MID="<`perl -e 'print time . ".";@chars=("A".."Z",0..0);print $chars[rand @chars] for 1..8;'`@apr.apache.org>"
+    mail_file="${DIST_DIR}/mail_announce_${VERSION}-${counter}.txt"
+    cat <<EOF > "$mail_file"
+From: ${asf_id} <$email>
+To: $rcpt
+Reply-To: dev@apr.apache.org
+Subject: [ANNOUNCEMENT] $PROJECT_SUBJECT $VERSION Released
+Date: $DATE
+Message-ID: $MID
+
+EOF
+
+  cat "${AO_DIST_RELEASE_PATH}/${ANNOUNCEMENT}" >> "${mail_file}"
+  cat <<EOF
+  curl --url 'smtps://mail-relay.apache.org:465' \\
+    --ssl-reqd --mail-from "${email}" \\
+    --mail-rcpt "${rcpt}"  --user '${asf_id}' \\
+    --upload-file '${mail_file}'
+
+EOF
+
+  counter=`expr $counter + 1`
+done
+
+
+CVES_MENTIONED=`fgrep CVE- dist/apache.org-dist/release/apr/${CHANGES_FILE}-${v_major}-${v_minor}`
+if test -n "${CVES_MENTIONED}"; then
+  cat << EOF
+Then set the following CVEs mentioned to READY on the ASF cveprocess site (and send the emails from the OSS/ASF tab):
+${CVES_MENTIONED}
+EOF
+else
+  echo "There seem to be no CVEs mentioned in the ${CHANGES_FILE}-${VERSION} file."
+fi
+echo "You are done. Open the champagne!"

Propchange: apr/site/trunk/tools/r6-announce.sh
------------------------------------------------------------------------------
    svn:executable = *