#!/bin/bash version=0.24 program=${0##*/} progdir=${0%/*} svn_url_base="https://svn.ietf.org/svn/tools/ietfdb" if [ "$progdir" = "$program" ]; then progdir="."; fi # ---------------------------------------------------------------------- function usage() { cat < COPYRIGHT Copyright 2016 Henrik Levkowetz. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. There is NO WARRANTY; not even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. EOF } # ---------------------------------------------------------------------- function die() { echo -e "\n$program: error: $*" >/dev/stderr exit 1 } function warn() { echo "$program: Warning: $*" 1>&2 } function note() { if [ -n "$VERBOSE" ]; then echo -e "$*"; fi } # ---------------------------------------------------------------------- function version() { echo -e "$program $version" } # ---------------------------------------------------------------------- function check_svn_path_exists() { local __resultvar=$1 local __path=$2 local myresult svn info "${__path}" >/dev/null 2>&1 myresult=$? # shellcheck disable=SC2086 eval $__resultvar="'$myresult'" } function mksvndir() { who=$1 if [ "$2" ]; then dir=$2; else dir=$who; fi check_svn_path_exists exists "${svn_url_base}/personal/$dir" # shellcheck disable=SC2154 if [ "$exists" != "0" ]; then $do echo "Creating personal directory area for IETF datatracker coding: /personal/$dir" $do svn mkdir "${svn_url_base}/personal/$dir" -m "Personal SVN dir for $who, for IETF datatracker code" else echo "Repository area personal/$dir is already in place." fi } function mksvntarget() { local who=$1 local target=$2 local source=$3 local email=$4 local name=$5 check_svn_path_exists exists "${svn_url_base}/personal/$who/$target" if [ "$exists" != "0" ]; then $do echo " creating $target branch for $who ($name)." $do svn cp "${svn_url_base}/$source" \ "${svn_url_base}/personal/$who/$target/" \ -m "New branch for $target" $do echo "New branch: ^/personal/$who/$target" if [ -n "$email" ]; then notify_user "$who" "$target" "$email" "$name" fi else $do echo " branch personal/$who/$target already exists." fi } function notify_user() { local login=$1 local target=$2 local email=$3 local name=$4 $do mail "$name <$email>" -s "A new SVN branch for you for IETF datatracker coding${rev:+, based on $rev}." -b rjsparks@nostrum.com <<-EOF Hi, $msg This mail has been automatically generated by the $program script. A new SVN branch has been set up for you for IETF datatracker coding, at ${svn_url_base}/personal/$login/$target ${rev:+This branch is based on $rev. }You can check it out by doing svn co ${svn_url_base}/personal/$login/$target There's also a database dump available at https://www.ietf.org/lib/dt/sprint/ietf_utf8.sql.gz -- this dump is served via CDN, and should hopefully be swifter to download than the alternatives. Please read the instructions about sprint coder setup at https://trac.ietf.org/tools/ietfdb/wiki/SprintCoderSetup -- both the workflow description and the details of setting up your environment. Best regards, The IETF tools team (via the $program script) EOF } function get_sprinters_info() { local n=$1 curl -L -s "https://trac.ietf.org/trac/ietfdb/wiki/IETF${n}SprintSignUp?format=txt" | \ grep -E "^\|\|" | \ grep -Ev "^\|\|\s+\|\|\s+" | \ tail -n +2 | \ python3 sprintcoders.py | \ update "$progdir/sprint${n}.txt" } # ---------------------------------------------------------------------- trap 'echo "$program($LINENO): Command failed with error code $? ([$$] "$0" $*)"; exit 1' ERR # ---------------------------------------------------------------------- # Option parsing # Options short_options=hm:M:nsvV long_options=help,meeting=,message=,dry-run,sprint,verbose,version # Default values num="" msg="" do="" if [ "$(uname)" = "Linux" ]; then # shellcheck disable=SC2086 # shellcheck disable=SC2048 if ! args=$(getopt -o $short_options --long $long_options -n $program -- $SV $*); then die "Terminating..." >&2 exit 1 fi # shellcheck disable=SC2086 eval set -- $args sed="sed -r" else # Darwin, BSDs # shellcheck disable=SC2086 # shellcheck disable=SC2048 if ! args=$(getopt -o$short_options $SV $*); then die "Terminating..." >&2 exit 1 fi # shellcheck disable=SC2086 set -- $args sed="sed -E" fi while true; do case "$1" in -h | --help) usage exit ;; # Show this help, then exit -m | --meeting) num=$2 shift ;; # Specify the IETF meeting number -M | --message) msg=$2 shift ;; # Specify extra message text -n | --dry-run) do="echo -- ==>" ;; # Only show what would be done -s | --sprint) SPRINT=1 ;; # Make branches for sprint sign-ups -v | --verbose) VERBOSE=1 ;; # Be more talkative -V | --version) version exit ;; # Show program version, then exit --) shift break ;; *) die "Internal error, inconsistent option specification: '$1'" ;; esac shift done # ---------------------------------------------------------------------- # The program itself who="" tag=$(svn log -v ${svn_url_base}/tags/dev/ --limit 1 | grep '/tags/' | awk '{print $2}') source="${tag:1}" target="${tag##*/}" rev="dev tag $target" [ "$1" ] && who="$1" [ "$2" ] && target="${target%.dev*}-$2" if [ -z "${who}${SPRINT}" ]; then die "Specify either individual developer name or --sprint"; fi cd $progdir || exit if [ "$who" ]; then mksvndir "$who" mksvntarget "$who" "$target" "$source" fi if [ "$SPRINT" ]; then [ "$msg" ] && msg=" $msg " [ "$num" ] || num=$(curl -L -s "https://tools.ietf.org/meta/current-ietf-number.txt") for n in $(seq $((num - 3)) "$num"); do get_sprinters_info "$n" done # shellcheck disable=SC2046 # shellcheck disable=SC2012 # shellcheck disable=SC2162 # sed -E (regexp extended) breaks this usage on MacOS 10.15, so back to regular sed. cat $(ls $progdir/sprint*.txt | tail -n 2) $progdir/extras.txt | \ sed -e 's/[ \t]*$//' -e 's/[ \t]+/ /g' | \ sort | uniq | \ while read login email name; do echo "" echo "$login ($name <$email>):" mksvndir "$login" mksvntarget "$login" "$target" "$source" "$email" "$name" done fi