scripts: add five-bugs-a-day script
authorTim-Philipp Müller <tim.muller@collabora.co.uk>
Thu, 24 May 2012 06:54:50 +0000 (07:54 +0100)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Thu, 24 May 2012 06:54:50 +0000 (07:54 +0100)
Cron fodder.

scripts/five-bugs-a-day.pl [new file with mode: 0755]

diff --git a/scripts/five-bugs-a-day.pl b/scripts/five-bugs-a-day.pl
new file mode 100755 (executable)
index 0000000..7fe614a
--- /dev/null
@@ -0,0 +1,175 @@
+#!/bin/perl -w
+#
+# ----------------------------------------------------------------------------
+#
+# five-bugs-a-day.pl
+#
+# Little script that outputs a list of N random open bugs from bugzilla
+# for a certain bugzilla product
+#
+# ----------------------------------------------------------------------------
+#
+# Copyright (C) 2011-2012 Tim-Philipp Muller <tim centricular net>
+#
+# This script is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+#
+# ----------------------------------------------------------------------------
+#
+# You can use it to send yourself an e-mail with a few bugs to check up on
+# every day, just put it into your crontab on a computer of your choice
+# (with proper e-mail forwarding configured in some way):
+#
+# $ crontab -e
+#
+# add:
+#
+#   MAILTO=you@nowhere.org
+#   # send ten random buglinks every day at 16.30
+#   30 16### /usr/bin/perl  /path/to/five-bugs-a-day.pl
+#
+#
+# Yes, it's PERL, sorry.
+#
+# Yes, I know the default is 10 bugs.
+#
+# ----------------------------------------------------------------------------
+#
+# Known bugs:
+#   - there may be an issue with apostrophes or quotes in bug summaries,
+#     descriptions sometimes get cut off
+#
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+#    subroutines
+# ----------------------------------------------------------------------------
+
+sub shuffle
+{
+    my $array = shift;
+    my $i = @$array;
+    while ( --$i )
+    {
+        my $j = int rand( $i+1 );
+        print "j = $j, i = $i \n";
+        @$array[$i,$j] = @$array[$j,$i];
+    }
+
+    return @$array;
+}
+
+# ----------------------------------------------------------------------------
+#    main
+# ----------------------------------------------------------------------------
+
+my $NUM_BUGS = 10;
+
+my $PRODUCT = "GStreamer";
+
+# ----- command line options -----
+
+if (@ARGV) {
+  $NUM_BUGS = shift @ARGV;
+}
+
+if (@ARGV) {
+  $PRODUCT = shift @ARGV;
+}
+
+
+my $QUERY_URL = "https://bugzilla.gnome.org/buglist.cgi?product=$PRODUCT&" .
+                'bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&' .
+                'bug_status=REOPENED&' .
+                'query_format=advanced&ctype=csv';
+
+my $COL_ID;
+my $COL_DESC;
+
+my %BUGS;
+
+# for testing/debugging:
+# unless (@lines = `cat bugs.csv`) {
+unless (@lines = `wget --no-check-certificate --quiet -O - '$QUERY_URL'`) {
+  die 'Could not download bug list';
+}
+
+# ----- parse column headers -----
+
+my $headers;
+
+# get first line which contains the field names
+$headers = shift @lines;
+
+# get rid of newline at end
+chop $headers;
+
+my @fields = split (/,/, $headers);
+my $num_fields = scalar(@fields);
+
+for (my $c = 0; $c < $num_fields; $c++) {
+  #print "$c $fields[$c] \n";
+  if ($fields[$c] =~ m/bug_id/) {
+    $COL_ID = $c;
+  } elsif ($fields[$c] =~ m/short_desc/) {
+    $COL_DESC = $c;
+  }
+}
+
+die "Could not find bug_id column in CVS file" if not defined ($COL_ID);
+die "Could not find short_desc column in CVS file" if not defined ($COL_DESC);
+
+#print "bugid is column $COL_ID\n";
+#print "desc  is column $COL_DESC\n";
+
+foreach (@lines) {
+  if (m/,/) {
+    chop;
+
+    # We specify num_fields as limit here, because the short_desc field
+    # might contain commas as well, and we don't want it to get cut off.
+    # This is a hack for the fact that we don't handle quoted fields
+    # (12345,"UNCONFIRMED","foo, bar: errors out") properly. As long as the
+    # short_desc field is the last one, that should be ok. (FIXME)
+    my @vals = split (/,/, $_, $num_fields);
+    my $id = $vals[$COL_ID];
+    my $desc = $vals[$COL_DESC];
+
+    $desc =~ s/^"(.*)"$/$1/;
+    $BUGS{$id} = $desc;
+  }
+}
+
+my @all_bugs = keys %BUGS;
+my @bugs = shuffle (\@all_bugs);
+
+# only want first NUM_BUGS bugs
+$#bugs = $NUM_BUGS;
+
+print "\n";
+print "$NUM_BUGS random bugs:\n";
+print "\n";
+
+for my $bug_id ( @bugs ) {
+  print "$BUGS{$bug_id}\n";
+  print "https://bugzilla.gnome.org/show_bug.cgi?id=$bug_id\n";
+  print "\n";
+}
+
+print "\n";
+print "More bugs at:\n";
+print "  - http://gstreamer.freedesktop.org/bugs/\n";
+print "  - https://bugzilla.gnome.org/browse.cgi?product=GStreamer\n";
+print "\n";