Merge in sprint branch management commands from old trunk

- Legacy-Id: 4138
This commit is contained in:
Henrik Levkowetz 2012-03-16 17:57:26 +00:00
parent d086d8c4a5
commit 2846665223
10 changed files with 550 additions and 0 deletions

143
test/mergedevbranch Executable file
View file

@ -0,0 +1,143 @@
#!/bin/bash
version=0.20
program=${0##*/}
progdir=${0%/*}
if [ "$progdir" = "$program" ]; then progdir="."; fi
# ----------------------------------------------------------------------
function usage() {
cat <<EOF
NAME
$program - merge and commit a sprint branch
SYNOPSIS
$program [OPTIONS] BRANCH SVNREV
DESCRIPTION
Merge and commit a sprint branch
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@tools.ietf.org>
COPYRIGHT
Copyright 2010 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 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=chvV
longopts=commit,help,verbose,version
# Default values
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
-c| --commit) ARG_COMMIT=1;; # Run commit in addition to merge
-h| --help) usage; exit;; # Show this help, then exit
-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
[[ $1 =~ @ ]] && set ${1/@/ }
[ $# -ge 2 ] || die "Expected branch and repository revision on the command line"
[ ${PWD##*/} = trunk ] || die "Expected this script to be run in trunk"
branch=$1
rev=$2
fix=$3
note "Extract who and what:"
info=$(svn log http://svn.tools.ietf.org/svn/tools/ietfdb/ -r $rev --incremental)
set $(echo "$info" | tail -n +2 | head -n 1 | tr "|" "\t")
who=$2; echo -e "\n$who"
comment=$(echo "$info" | tail -n +3); echo -e "$comment\n"
note "Do the merge:"
svn merge -c $rev http://svn.tools.ietf.org/svn/tools/ietfdb/personal/$branch .
mail -s "Merged datatracker branch personal/$branch@$rev to trunk" $who -c henrik@levkowetz.com <<-EOF
Hi,
This is an automatic merge info message. Your code in personal/$branch@$rev
has been merged to trunk, and will be part of the next release if nothing
goes wrong during final testing.
Regards,
Henrik
(via the mergesprintbranch script)
EOF
if [ "$ARG_COMMIT" ]; then
echo "Committing the merge:"
echo ""
svn commit -m "Merged [$rev] from $who: $comment $fix"
else
echo "This merge has not been committed yet."
echo "To commit it, run this commit command:"
echo ""
echo "svn commit -m \"Merged [$rev] from $who: $comment $fix\""
fi

93
test/mkdevbranch Executable file
View file

@ -0,0 +1,93 @@
#!/bin/bash
version=0.21
program=${0##*/}
progdir=${0%/*}
if [ "$progdir" = "$program" ]; then progdir="."; fi
function die() {
echo -e "\n$program: Error: ${1:0:160} ..." >&2
exit 1
}
function warn() {
logger -i -p user.warn -t $program "$*"
echo "$program: Warning: $*" 1>&2;
}
function note() {
logger -i -p user.notice -t $program "$*"
if [ -n "$OPT_VERBOSE" ]; then echo -e "$*"; fi
}
function version() {
echo -e "$program: v$version\n\nRunning as $(id -urn) on $(date +'%Y-%m-%d %H:%M')"
}
#[ "$#" -gt 0 ] || die "Expected the ietf number as argument on the command line, but found nothing"
#[ $1 -gt 70 ] || die "Expected the ietf number as argument on the command line, but found '$1'"
#if [ "$1" ]; then arg=$1; else arg=$(svn info http://svn.tools.ietf.org/svn/tools/ietfdb/trunk/ | egrep "^Last Changed Rev" | awk '{print $4}'); fi
if [ "$1" ]; then arg=$1; else arg=$(svn ls http://svn.tools.ietf.org/svn/tools/ietfdb/tags/ | tail -n 1 | sed -r 's/^(.*)\/$/v\1/' ); fi
if [ "${arg:0:1}" = "v" ]; then
source="tags/${arg:1}"
target="$arg"
rev="release $arg"
else
source="trunk@$arg"
target="r$arg"
rev="repository rev r$arg"
fi
function mksvndir() {
who=$1
if [ "$2" ]; then dir=$2; else dir=$who; fi
if ! svn info http://svn.tools.ietf.org/svn/tools/ietfdb/personal/$dir >/dev/null 2>&1 ; then
echo "Creating personal directory area for IETF datatracker coding: /personal/$dir"
svn mkdir http://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
}
num=$( < /www/tools.ietf.org/meta/current-ietf-number.txt)
trac-admin /www/tools.ietf.org/tools/ietfdb wiki export IETF${num}SprintSignUp \
| egrep "^\|\|" | tail -n +2 | python -c '
import sys, re
for line in sys.stdin:
blank, name, email, rest = line.strip().split("||", 3)
login, dummy = re.split("[@.]", email, 1)
print "\t".join((login.strip().lower(), email.strip().lower(), name.strip())) ' \
| $progdir/update $progdir/sprint$num.txt
cat $(ls $progdir/sprint*.txt | tail -n 4) | sed 's/[ \t]*$//' | sort | uniq | while read login email name; do
echo ""
echo "$login ($name <$email>):"
mksvndir $login
if ! svn info http://svn.tools.ietf.org/svn/tools/ietfdb/personal/$login/$target >/dev/null 2>&1 ; then
echo " creating $target branch for $login ($name)."
svn cp http://svn.tools.ietf.org/svn/tools/ietfdb/$source http://svn.tools.ietf.org/svn/tools/ietfdb/personal/$login/$target/ -m "New IETF datatracker coding branch for $name" \
&& mail "$name <$email>" -s "A new SVN branch for you for IETF datatracker coding${rev:+, based on $rev}." -b henrik@levkowetz.com <<-EOF
Hi,
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
http://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 http://svn.tools.ietf.org/svn/tools/ietfdb/personal/$login/$target
(More instructions about setup is available at
http://trac.tools.ietf.org/tools/ietfdb/wiki/SprintCoderSetup)
Best,
Henrik (via the $program script)
EOF
else
echo " branch personal/$login/$target already exists."
fi
done

11
test/sprint76.txt Normal file
View file

@ -0,0 +1,11 @@
henrik henrik@levkowetz.com Henrik Levkowetz
chris chris.newman@sun.com Chris Newman
pasi pasi.eronen@nokia.com Pasi Eronen
rjs rjs@nostrum.com Robert Sparks
tony tony@att.com Tony Hansen
ben ben@nostrum.com Ben Campbell
kivinen kivinen@iki.fi Tero Kivinen
adam adam@nostrum.com Adam Roach
arifumi arifumi@nttv6.net Arifumi Matsumoto
edj edj.etc@gmail.com Ed Juskevicius
lars lars.eggert@gmail.com Lars Eggert

16
test/sprint77.txt Normal file
View file

@ -0,0 +1,16 @@
henrik henrik@levkowetz.com Henrik Levkowetz
rjs rjs@nostrum.com Robert Sparks
adam adam@nostrum.com Adam Roach
pasi pasi.eronen@nokia.com Pasi Eronen
kivinen kivinen@iki.fi Tero Kivinen
housley housley@vigilsec.com Russ Housley
tony tony@att.com Tony Hansen
lars lars.eggert@gmail.com Lars Eggert
richard richard.barnes@gmail.com Richard Barnes
cabo cabo@tzi.org Carsten Bormann
ben ben@nostrum.com Ben Campbell
fenner fenner@fenron.net Bill Fenner
suresh suresh.krishnan@ericsson.com Suresh Krishnan
matthijs matthijs@nlnetlabs.nl Matthijs Mekking
edj edj.etc@gmail.com Ed Juskevicius
george george.bullis@jdsu.com George Bullis

14
test/sprint78.txt Normal file
View file

@ -0,0 +1,14 @@
henrik henrik@levkowetz.com Henrik Levkowetz
rjs rjs@nostrum.com Robert Sparks
housley housley@vigilsec.com Russ Housley
tony tony@att.com Tony Hansen
lars lars.eggert@gmail.com Lars Eggert
kivinen kivinen@iki.fi Tero Kivinen
peter peter.musgrave@magorcorp.com Peter Musgrave
matthijs matthijs@nlnetlabs.nl Matthijs Mekking
jelte jelte@isc.org Jelte Jansen
yuri yuri@nlnetlabs.nl Yuri Schaeffer
adam adam@nostrum.com Adam Roach
paul paul.hoffman@vpnc.org Paul Hoffman
rcross rcross@amsl.com Ryan Cross
warren warren@kumari.net Warren Kumari

11
test/sprint79.txt Normal file
View file

@ -0,0 +1,11 @@
henrik henrik@levkowetz.com Henrik Levkowetz
rjs rjs@nostrum.com Robert Sparks
housley housley@vigilsec.com Russ Housley
tony tony@att.com Tony Hansen
peter peter.musgrave@magorcorp.com Peter Musgrave
warren warren@kumari.net Warren Kumari
suresh suresh.krishnan@ericsson.com Suresh Krishnan
kivinen kivinen@iki.fi Tero Kivinen
lars lars.eggert@gmail.com Lars Eggert
fenner fenner@fenron.net Bill Fenner
adam adam@nostrum.com Adam Roach

14
test/sprint80.txt Normal file
View file

@ -0,0 +1,14 @@
henrik henrik@levkowetz.com Henrik Levkowetz
rjs rjs@nostrum.com Robert Sparks
housley housley@vigilsec.com Russ Housley
tony tony@att.com Tony Hansen
rcross rcross@amsl.com Ryan Cross
shane shane@time-travellers.org Shane Kerr
kivinen kivinen@iki.fi Tero Kivinen
adam adam@nostrum.com Adam Roach
peter peter.musgrave@magorcorp.com Peter Musgrave
julian julian.reschke@greenbytes.de Julian Reschke
warren warren@kumari.net Warren Kumari
jelte jelte@isc.org Jelte Jansen
bmheight bmheight@gmail.com Brandon Height
lars lars.eggert@gmail.com Lars Eggert

15
test/sprint81.txt Normal file
View file

@ -0,0 +1,15 @@
henrik henrik@levkowetz.com Henrik Levkowetz
rjs rjs@nostrum.com Robert Sparks
housley housley@vigilsec.com Russ Housley
lars lars.eggert@gmail.com Lars Eggert
adam adam@nostrum.com Adam Roach
kivinen kivinen@iki.fi Tero Kivinen
suresh suresh.krishnan@ericsson.com Suresh Krishnan
wes wes@mti-systems.com Wes Eddy
dow dow.street@linquest.com Dow Street
ondrej ondrej@sury.org Ondřej Surý
tony tony@att.com Tony Hansen
rcross rcross@amsl.com Ryan Cross
julian julian.reschke@greenbytes.de Julian Reschke
elwynd elwynd@folly.org.uk Elwyn Davies
presnick presnick@qualcomm.com Pete Resnick

8
test/sprint82.txt Normal file
View file

@ -0,0 +1,8 @@
henrik henrik@levkowetz.com Henrik Levkowetz
rjs rjs@nostrum.com Robert Sparks
housley housley@vigilsec.com Russ Housley
adam adam@nostrum.com Adam Roach
lars lars.eggert@gmail.com Lars Eggert
kivinen kivinen@iki.fi Tero Kivinen
tony tony@att.com Tony Hansen
mahoney mahoney@nostrum.com Jean Mahoney

225
test/update Executable file
View file

@ -0,0 +1,225 @@
#!/bin/bash
version="0.34"
program=$(basename $0)
NEW="" # If there are more than $NEW % new lines, skip update
OLD="" # If there are more than $OLD % deleted lines, skip update
FILE=""
verbose=""
silent=""
# ----------------------------------------------------------------------
function usage() {
cat <<EOF
NAME
$program - conditionally update target file.
SYNOPSIS
$program [OPTIONS] FILE
DESCRIPTION
$program reads input from a pipe or file and saves it to a target
(FILE) if there are changes. If the new content is the same as the
old, the target is left untouched. By default, the target is also
left untouched if the new content is empty. There are options to
also abstain from applying an update if the changes are too large,
and to back up the previous version.
The purpose is to handle files with dynamically generated content in
such a manner that timestamps don't change if the content doesn't change,
and mistakes in content generation doesn't unnecessarily propagate to
the target.
OPTIONS
EOF
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
AUTHOR
Henrik Levkowetz <henrik@levkowetz.com>
EOF
exit
}
# ----------------------------------------------------------------------
function note() {
if [ -n "$verbose" ]; then
echo -e "$program: $*"
fi
}
# ----------------------------------------------------------------------
function warn() {
[ "$QUIET" ] || echo -e "$program: $*"
}
# ----------------------------------------------------------------------
function err() {
echo -e "$program: $*" > /dev/stderr
}
# -----------------------------------------------------------------------------
function leave() {
errcode=$1; shift
if [ "$errcode" -ge "2" ]; then warn "$*"; else note "$*"; fi
if [ -f "$tempfile" ]; then rm $tempfile; fi
if [ -f "$difffile" ]; then rm $difffile; fi
if [ "$errcode" = "1" -a "$RESULT" = "0" ]; then exit 0; else exit $errcode; fi
}
# ----------------------------------------------------------------------
# Set up error trap
trap 'leave 127 "$program($LINENO): Command failed with error code $? while processing '$origfile'."' ERR
# exit with a message if a command fails
set -e
# ----------------------------------------------------------------------
# Get any options
#
# Default values
PAT="\$path\$base.%Y-%m-%d_%H%M"
RESULT="0"
QUIET=""
# Based on the sample code in /usr/share/doc/util-linux/examples/parse.bash.gz
GETOPT_RESULT=$(getopt -o bc:ef:hn:o:p:qrvV --long backup,maxchg:,empty,file:,help,maxnew:,maxold:,prefix:,report,quiet,verbose,version -n "$program" -- "$@")
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
note "GETOPT_RESULT: $GETOPT_RESULT"
eval set -- "$GETOPT_RESULT"
while true ; do
case "$1" in
-b|--backup) backup=1; shift ;; # Back up earlier versions by creating a backup file
-c|--maxchg) CHG="$2"; shift 2 ;; # Limit on percentage of changed lines
-e|--empty) empty=1; shift ;; # Permit the update to be empty (default: discard)
-f|--file) FILE="$2"; shift 2 ;; # Read input from FILE instead of standard input
-h|--help) usage; shift ;; # Show this text and exit
-n|--maxnew) NEW="$2"; shift 2 ;; # Limit on percentage of new (added) lines
-o|--maxold) OLD="$2"; shift 2 ;; # Limit on percentage of old (deleted) lines
-p|--pat*) PAT="$2"; shift 2 ;; # Backup name base ('$path$base.%Y%m%d_%H%M')
-q|--quiet) QUIET=1; shift;; # Be less verbose
-r|--result) RESULT=1; shift ;; # Return 1 if update not done
-v|--verbose) verbose=1; shift ;; # Be more verbose about what's happening
-V|--version) echo -e "$program\t$version"; exit;; # Show version and exit
--) shift ; break ;;
*) echo "$program: Internal error, inconsistent option specification." ; exit 1 ;;
esac
done
if [ $CHG ]; then OLD=$CHG; NEW=$CHG; fi
if [ $# -lt 1 ]; then echo -e "$program: Missing output filename\n"; usage; fi
origfile=$1
tempfile=$(tempfile)
difffile=$(tempfile)
if [ -e "$origfile" ]; then
cp -p $origfile $tempfile # For ownership and permissions
cat $FILE > $tempfile
[ "$FILE" ] && touch -r $FILE $tempfile
# This won't work if we don't have sufficient privileges:
#chown --reference=$origfile $tempfile
#chmod --reference=$origfile $tempfile
else
cat $FILE > $origfile
[ "$FILE" ] && touch -r $FILE $tempfile
leave 0 "Created file '$origfile'"
fi
origlen=$(wc -c < $origfile)
newlen=$(wc -c < $tempfile)
if [ $origlen = 0 -a $newlen = 0 ]; then
rm $tempfile
leave 1 "New content is identical (and void) - not updating '$origfile'."
fi
if [ $newlen = 0 -a -z "$empty" ]; then
leave 1 "New content is void - not updating '$origfile'."
fi
diff $origfile $tempfile > $difffile || [ $? -le 1 ] && true # suppress the '1' error code on differences
difflen=$(wc -l < $difffile)
if [ $difflen = 0 ]; then
leave 1 "New content is identical - not updating '$origfile'."
fi
if [ "$OLD" -o "$NEW" ]; then
if [ "$NEW" ]; then maxnew=$(( $origlen * $NEW / 100 )); fi
if [ "$OLD" ]; then maxdel=$(( $origlen * $OLD / 100 )); fi
newcount=$(grep "^> " $difffile | wc -c)
outcount=$(grep "^< " $difffile | wc -c)
delcount=$(grep "^! " $difffile | wc -c)
delcount=$(( $outcount + $delcount ))
rm $difffile
if [ "$OLD" ]; then
if [ "$delcount" -ge "$maxdel" ]; then
cp $tempfile $origfile.update
leave 2 "New content has too many removed lines ($delcount/$origlen)\n - not updating '$origfile'.\nNew content placed in '$origfile.update' instead"
fi
fi
if [ "$NEW" ]; then
if [ "$newcount" -ge "$maxnew" ]; then
cp $tempfile $origfile.update
leave 2 "New content has too many added lines ($newcount/$origlen)\n - not updating '$origfile'.\nNew content placed in '$origfile.update' instead"
fi
fi
fi
if [ "$backup" ]; then
path=${origfile%/*}
name=${origfile##*/}
base=${name%.*}
ext=${origfile##*.}
if [ "$ext" = "$origfile" ]; then
ext=""
elif [ ! "${ext%/*}" = "$ext" ]; then
ext=""
else
ext=".$ext"
fi
if [ "$path" = "$origfile" ]; then
path=""
else
path="$path/"
fi
ver=1
backfile=$(eval date +"$PAT")
backpath="${backfile%/*}"
if [ "$backpath" = "$backfile" ]; then
backpath="."
fi
if [ ! -d $backpath ]; then
if [ -e $backpath ]; then
leave 3 "The backup path '$backpath' exists but isn't a directory"
else
mkdir -p $backpath
fi
fi
while [ -e "$backfile,$ver$ext" ]; do
ver=$(( $ver+1 ))
done
note "Saving backup: $backfile,$ver$ext"
cp -p "$origfile" "$backfile,$ver$ext"
chmod -w "$backfile,$ver$ext" || true
fi
if ! mv $tempfile $origfile; then cp -p $tempfile $origfile; fi
leave 0 "Updated file '$origfile'"