From 8cd87804592a2815e35cbdaff2cd98e5e3dc59ce Mon Sep 17 00:00:00 2001 From: Mark Polesky Date: Mon, 23 Jun 2014 01:28:24 -0700 Subject: [PATCH] Add `make-countdown-announcement.sh'. --- Documentation/contributor/issues.itexi | 42 +-- .../auxiliar/make-countdown-announcement.sh | 259 ++++++++++++++++++ 2 files changed, 272 insertions(+), 29 deletions(-) create mode 100755 scripts/auxiliar/make-countdown-announcement.sh diff --git a/Documentation/contributor/issues.itexi b/Documentation/contributor/issues.itexi index d534b073e4..8fe73428ee 100644 --- a/Documentation/contributor/issues.itexi +++ b/Documentation/contributor/issues.itexi @@ -885,38 +885,22 @@ PATCH: Countdown to 20130113 The text of the email sets the deadline for this countdown batch. At present, batches are done on Tuesday, Thursday and Sunday evenings. -The body of the email lists the patches grouped by patch type, and for -each patch, shows the tracker issue number and title, with a link to -the Rietveld item. Copying the information from the website and pasting -into the email gives a hyperlinked version of the information. - -@smallexample - -For 20:00 MST Tuesday January 8: - -Crash: - Issue 2990: \RemoveEmptyStaves in StaffGroup context crashes - R 7069044 - -Defect: - Issue 677: \score markup confuses paper settings - R 7028045 - Issue 3050: displayLilyMusic produced erroneous code for rightHandFinger arguments - R 7032045 - -Documentation: - Issue 2952: Upgrade documentation of \once - R 7031053 - Issue 3044: Dual license the files under mf/ using OFL. - R 6970046 - Issue 3084: [DOC]Add "Known issue" in NR 1.2.1 about Scaling durations with rational numbers - R 7071044 - -Enhancement: - Issue 3061: make \articulate handle colon-type tremolos - R 7033045 - Issue 3082: Patch: Let ChordNameVoice use the same performers as Voice - R 7054043 - Issue 3083: Patch: Chord change detection in fretboards should depend on placements, not notes - R 7062043 - Issue 2983: assertion failed with \glissando - R 6625078 +To create the countdown announcement, use the +@code{make-countdown-announcement.sh} script, which takes the +deadline date, and optionally your name. Follow the instructions +provided: +@example +cd $LILYPOND_BUILD_DIR +../scripts/auxiliar/make-countdown-announcement.sh "Jan 1, 2001" James +@end example -Cheers, -Colin +The script produces an announcement that is easily readable in all +email clients. Also, whenever a new contributor submits a patch, +you will be prompted to add the new username and author name to +the script itself, and then commit those changes to the main git +repository. -@end smallexample @item On the scheduled countdown day, the Patch Meister reviews the diff --git a/scripts/auxiliar/make-countdown-announcement.sh b/scripts/auxiliar/make-countdown-announcement.sh new file mode 100755 index 0000000000..757f5de6f6 --- /dev/null +++ b/scripts/auxiliar/make-countdown-announcement.sh @@ -0,0 +1,259 @@ +#!/bin/bash + +# convert a Google code CSV file into a countdown announcement +# +# USAGE: +# make-countdown-announcement.sh NEXT_DEADLINE_DATE [PATCH-MEISTER] +# OR +# make-countdown-announcement.sh NEXT_DEADLINE_DATE [PATCH-MEISTER] > OUTPUT-FILE +# +# EXAMPLES: +# make-countdown-announcement.sh "Jan 1, 2001" "John Doe" +# make-countdown-announcement.sh "Jan 1, 2001" John +# make-countdown-announcement.sh "Jan 1, 2001" > countdown.txt + + +CSV_FILE=lilypond-issues.csv # comma-separated values +TSV_FILE=lilypond-issues.tsv # tab-separated values +URL_BASE="http://code.google.com/p/lilypond/issues" +QUERY_STR="q=Patch%3Apush%2Ccountdown%2Creview%2Cnew%2Cwaiting&colspec=Patch%20Owner%20ID%20Summary&sort=patch" +DEADLINE=$1 +PATCH_MEISTER=${2:-"The Patch Mister"} +MAILMAP=' +"adam.spiers","Adam Spiers" +"aleksandr.andreev","Aleksandr Andreev" +"benko.pal","Benkő Pál" +"bordage.bertrand","Bertrand Bordage" +"brownian.box","Dmytro O. Redchuk" +"Carl.D.Sorensen","Carl Sorensen" +"carlopeterson","Carl Peterson" +"colinghall","Colin Hall" +"ColinPKCampbell","Colin Campbell" +"d8valily","Mark Mathias" +"dak@gnu.org","David Kastrup" +"david.nalesnik","David Nalesnik" +"dschudy","Devon Schudy" +"Eluzew","Eluze W" +"erlenda","Erlend Aasland" +"fedelogy","Federico Bruni" +"frederic.bron.1995@polytechnique.org","Frédéric Bron" +"graham@percival-music.ca","Graham Percival" +"hanwenn","Han-Wen Nienhuys" +"hjunes","Heikki Junes" +"ianhulin44","Ian Hulin" +"idragosani","Brett McCoy" +"jameselihubailey","James E. Bailey" +"janek.lilypond","Janek Warchoł" +"jan.nieuwenhuizen","Jan Nieuwenhuizen" +"joeneeman","Joe Neeman" +"john.mandereau","John Mandereau" +"joseph.wakeling","Joseph Wakeling" +"julien.rioux","Julien Rioux" +"kieren@alumni.rice.edu","Kieren MacMillan" +"k-ohara5a5a@oco.net","Keith OHara" +"lemzwerg","Werner Lemberg" +"lilyliska","Urs Liska" +"lilypond.patchy.graham","Graham Percival" +"mandolaerik","Erik Sandberg" +"marc@hohlart.de","Marc Hohl" +"marek@gregoriana.sk","Marek Klein" +"markpolesky","Mark Polesky" +"milimetr88","Łukasz Czerwiński" +"mtsolo","Mike Solomon" +"neziap","Janek Warchoł" +"nicolas.sceaux","Nicolas Sceaux" +"n.puttock","Neil Puttock" +"paconet.org","Francisco Vila" +"PhilEHolmes","Phil Holmes" +"pkx166h","James Lowe" +"plroskin","Pavel Roskin" +"pnorcks","Patrick McCarty" +"RalphBugList","Ralph Palmer" +"reinhold.kainhofer","Reinhold Kainhofer" +"rzedeler","Rune Zedeler" +"schilke.60","Derek Klinge" +"shingarov","Boris Shingarov" +"tdanielsmusic","Trevor Daniels" +"thomasmorley65","Thomas Morley" +"v.villenave","Valentin Villenave" +' + + +usage() { + cat << EOF >&2 +USAGE: + `basename $0` NEXT_DEADLINE_DATE [PATCH-MEISTER] + OR + `basename $0` NEXT_DEADLINE_DATE [PATCH-MEISTER] > OUTPUT-FILE + +EXAMPLES: + `basename $0` "Jan 1, 2001" "John Doe" + `basename $0` "Jan 1, 2001" John + `basename $0` "Jan 1, 2001" > countdown.txt +EOF + exit 1 +} + + +# display USAGE +case $# in + 1|2) case $1 in + -h|--help) usage ;; + *) ;; + esac ;; + *) usage ;; +esac + + +# clean up in case of a previous interrupt +remove-if-exists() { + if [ -e $1 ]; then rm $1; fi +} +remove-if-exists push.tmp +remove-if-exists countdown.tmp +remove-if-exists review.tmp +remove-if-exists new.tmp +remove-if-exists waiting.tmp +remove-if-exists $TSV_FILE + + +# show initial instructions +read -p "First, in your web browser, make sure you're logged in to: + + $URL_BASE/list + +Then save the following link as a file called \"$CSV_FILE\" +(save it to this directory -- $PWD/): + + $URL_BASE/csv?$QUERY_STR + +Then press enter" + + +if [ ! -e $CSV_FILE ]; then + echo -e "\nError: can't find \`$CSV_FILE': No such file or directory" >&2 + exit 1 +fi + + +# If the user wasn't logged in when downloading $CSV_FILE, the emails will +# appear truncated, e.g. "abc...@gmail.com", and won't be properly replaced by +# the author names later on. This code block complains if the string "...@" is +# found anywhere in the email field. +if [ "`cut -d, -f2 $CSV_FILE | grep -o '\.\.\.@'`" ]; then + read -p " +It looks like you were not logged in to Google code when you downloaded +$CSV_FILE. Continue anyway (y/n)? " + while : + do + case "$REPLY" in + y) break ;; + n) exit 1 ;; + *) read -p "Enter \`y' to continue; \`n' to quit and try again: " + esac + done +fi + + +# change the quoted, comma-separated file +# into an unquoted, tab-separated file +# and keep only the first 4 fields: Patch,Owner,ID,Summary +sed '{ +1d +/^$/d +s/^"// +s/","/\t/g +s/",*$// +s/""/"/g +}' $CSV_FILE | cut -sf1-4 > $TSV_FILE + + +EMAILS_USED=`awk -F"\t" '{ print $2 }' $TSV_FILE | sort --unique` +KNOWN_EMAILS=` +IFS=$'\n' +for i in $MAILMAP; do + echo "$i" | sed 's/^"\(.*\)",".*/\1/' +done` +UNKNOWN_EMAILS=`comm -23 <(echo "$EMAILS_USED") <(echo "$KNOWN_EMAILS")` + + +# Unknown emails/usernames usually mean new contributors. +# If any are found, the user is prompted to add the new +# authors' names to the MAILMAP list above. +if [ "$UNKNOWN_EMAILS" ]; then + COUNT=`wc --lines <(echo "$UNKNOWN_EMAILS") | sed 's/ .*//'` + if [ $COUNT -eq 1 ]; then + echo -e "\nError: The following email/username needs to be associated with a name:" >&2 + echo "$UNKNOWN_EMAILS" | sed 's/^/ /' >&2 + echo -e "Please add it to the MAILMAP list in\n $0" >&2 + else + echo -e "\nError: The following emails/usernames need to be associated with names:" >&2 + echo "$UNKNOWN_EMAILS" | sed 's/^/ /' >&2 + echo -e "Please add them to the MAILMAP list in\n $0" >&2 + fi + echo "using the following form:" >&2 + echo "$UNKNOWN_EMAILS" | sed 's/.*/ "&","author name"/' >&2 + echo "and commit your changes to the main git repository." >&2 + remove-if-exists $TSV_FILE + exit 1 +fi + + +EMAIL_REPLACEMENTS=` +IFS=$'\n' +for i in $MAILMAP; do + echo "$i" | sed 's/^"\(.*\)","\(.*\)"$/s\/\1\/\2\/g/' +done` + + +# replace emails/usernames with author names +# and separate the issues by patch type +sed -n "{ +$EMAIL_REPLACEMENTS +/^push/w push.tmp +/^countdown/w countdown.tmp +/^review/w review.tmp +/^new/w new.tmp +/^waiting/w waiting.tmp +}" $TSV_FILE + + +# clean up; $TSV_FILE is no longer needed +remove-if-exists $TSV_FILE + + +format-entry() { + TYPE=$1 + FILE="$1.tmp" + if [ -s $FILE ]; then + echo -e "$TYPE:\n" | tr 'a-z' 'A-Z' + awk -v UB=$URL_BASE -F"\t" \ + '{ printf("%s: %s\n%s/detail?id=%d\n\n"), $2, $4, UB, $3 }' $FILE + echo -e "____________________\n\n" + fi + remove-if-exists $FILE +} + +echo >&2 + + +# display the countdown announcement +echo "Hello, + +Here is the current patch countdown list. +The next countdown will be on $DEADLINE. + +You can always view the most current countdown list here: +$URL_BASE/list?$QUERY_STR + +____________________ + +" + +format-entry push +format-entry countdown +format-entry review +format-entry new +format-entry waiting + +echo -e "Thank you,\n$PATCH_MEISTER" -- 2.39.2