datatracker/bin/mkdevbranch
2021-03-04 18:44:09 +00:00

222 lines
7.2 KiB
Bash
Executable file

#!/bin/bash
version=0.24
program=${0##*/}
progdir=${0%/*}
if [ "$progdir" = "$program" ]; then progdir="."; fi
# ----------------------------------------------------------------------
function usage() {
cat <<EOF
NAME
$program - make new dev branches for the IETF sprint
SYNOPSIS
$program [OPTIONS] [DEVELOPER [BRANCHNAME]]
DESCRIPTION
Make new dev branches for sprint participants based on the
content of the sprint registration page. If given a specific
developer name and optionally a branch name as arguments, make a
new branch for the specified developer instead. If run without
arguments, the script assumes that it's being run on the host that
holds the Trac wiki with the sprint signup pages.
EOF
echo -e "OPTIONS"
if [ "$(uname)" = "Linux" ]; then
egrep "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" $0 | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/'
else
egrep "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" $0 | sed 's/\|.*\$2[^#]*#/ /'| sed -E 's/\|.*\)[^#]*#/ /'
fi
cat <<EOF
FILES
AUTHOR
Written by Henrik Levkowetz, <henrik@zinfandel.tools.ietf.org>
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"
}
# ----------------------------------------------------------------------
trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)"; exit 1' ERR
# ----------------------------------------------------------------------
# Option parsing
# Options
shortopts=hm:M:nsvV
longopts=help,meeting=,message=,dry-run,sprint,verbose,version
# Default values
num=""
msg=""
do=""
if [ "$(uname)" = "Linux" ]; then
args=$(getopt -o "$shortopts" --long "$longopts" -n '$program' -- $SV "$@")
if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi
eval set -- "$args"
sed="sed -r"
else
# Darwin, BSDs
args=$(getopt -o$shortopts $SV $*)
if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi
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 https://svn.tools.ietf.org/svn/tools/ietfdb/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"
function mksvndir() {
who=$1
if [ "$2" ]; then dir=$2; else dir=$who; fi
if ! svn info https://svn.tools.ietf.org/svn/tools/ietfdb/personal/$dir >/dev/null 2>&1 ; then
$do echo "Creating personal directory area for IETF datatracker coding: /personal/$dir"
$do svn mkdir https://svn.tools.ietf.org/svn/tools/ietfdb/personal/$dir -m "Personal SVN dir for $who, for IETF datatracker code"
else
echo "Repository area personal/$dir is already in place."
fi
}
# dump="ietf_utf8.sql.gz"
# echo "Copying a database dump to www.ietf.org/lib/dt/sprint/$dump"
# scp /www/tools.ietf.org/tools/$dump ietfa:/a/www/www6s/lib/dt/sprint/
if [ -z "$who" -a -z "$SPRINT" ]; then die "Specify either individual developer name or --sprint"; fi
cd $progdir
if [ "$who" ]; then
mksvndir $who
$do svn cp https://svn.tools.ietf.org/svn/tools/ietfdb/$source https://svn.tools.ietf.org/svn/tools/ietfdb/personal/$who/$target/ -m "New branch for $target"
echo "New branch: ^/personal/$who/$target"
fi
if [ "$SPRINT" ]; then
[ "$msg" ] && msg="
$msg
"
[ "$num" ] || num=$( < /www/tools.ietf.org/meta/current-ietf-number.txt)
for n in $(seq $((num-3)) $num); do
trac-admin /www/tools.ietf.org/tools/ietfdb wiki export IETF${n}SprintSignUp \
| egrep "^\|\|" | tail -n +2 | python -c '
import sys, re
with open("aliases") as afile:
try:
aliases = dict([ line.strip().split(None,1) for line in afile.read().splitlines() if line.strip() ])
except ValueError:
sys.stderr.write([ line.strip().split(None,1) for line in afile.read().splitlines() if line.strip() ])
raise
for line in sys.stdin:
try:
blank, name, email, rest = line.strip().split("||", 3)
email = email.strip()
except ValueError:
sys.stderr.write(line+"\n")
raise
login, dummy = re.split("[@.]", email, 1)
if email in aliases:
login = aliases[email]
print "\t".join((login.strip().lower(), email.strip().lower(), name.strip())) ' \
| update $progdir/sprint$n.txt
done
cat $(ls $progdir/sprint*.txt | tail -n 2) $progdir/extras.txt | sed -r -e 's/[ \t]*$//' -e 's/[ \t]+/ /g' | sort | uniq | while read login email name; do
echo ""
echo "$login ($name <$email>):"
mksvndir $login
if ! svn info https://svn.tools.ietf.org/svn/tools/ietfdb/personal/$login/$target >/dev/null 2>&1 ; then
$do echo " creating $target branch for $login ($name)."
$do svn cp https://svn.tools.ietf.org/svn/tools/ietfdb/$source https://svn.tools.ietf.org/svn/tools/ietfdb/personal/$login/$target/ -m "New IETF datatracker coding branch for $name" \
&& $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
https://svn.tools.ietf.org/svn/tools/ietfdb/personal/$login/$target
${rev:+This branch is based on $rev. }You can check it out by doing
svn co https://svn.tools.ietf.org/svn/tools/ietfdb/personal/$login/$target
There's also a new 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.tools.ietf.org/tools/ietfdb/wiki/SprintCoderSetup
-- both the workflow description and the details of setting up your
environment.
Best regards,
Henrik (via the $program script)
EOF
else
$do echo " branch personal/$login/$target already exists."
fi
done
fi