minor code updates to bts followup
authorStefano Zacchiroli <zack@debian.org>
Sat, 26 Jan 2008 15:24:50 +0000 (16:24 +0100)
committerStefano Zacchiroli <zack@debian.org>
Sat, 26 Jan 2008 15:24:50 +0000 (16:24 +0100)
blog/posts/2008/01/bts_followup.mdwn
blog/posts/2008/01/bts_followup/bts
blog/posts/2008/01/bts_followup/followup.patch

index d722111..03d238f 100644 (file)
@@ -80,4 +80,15 @@ Comments?
 Anyone else find this useful? If so I can just go ahead and commit it to
 [[debpkg devscripts]] mainline ...
 
+----
+
+*Update*: some changes to the code, thanks to Adam Barrat for the feedback.  
+Changelog:
+
+* safer handling of RFC822 line continuation
+* instead of always mailing -submitter, mail the author of the message we are
+replying to (the bug report is always on Cc though)
+* bug message number is now 1-based, following the convention of the BTS
+`get_bug_log` method
+
 [[tag planet/debian debian devscripts lang/english hack]]
index 6e654fb..e46f85f 100755 (executable)
@@ -934,10 +934,10 @@ sub bts_followup {
   die "bts: Couldn't run bts followup: $soap_broken\n" unless have_soap();
   my $bug = checkbug(shift) or die "bts followup: follow up on which bug?\n";
   my $msglogid = shift;
-  $msglogid = 0 unless defined $msglogid;
+  $msglogid = 1 unless defined $msglogid;
   my $soap = SOAP::Lite->uri($soapurl)->proxy($soapproxyurl);
   my $log = $soap->get_bug_log($bug)->result();
-  my $msg = $log->[$msglogid];
+  my $msg = $log->[$msglogid-1];
   my %headers = parse_rfc822_headers($msg->{header});
 
   # extract data needed to compose the follow up email
@@ -951,6 +951,8 @@ sub bts_followup {
   }
   my $ref = "";        # id for In-Reply-To 
   $ref = $headers{'message-id'} if defined $headers{'message-id'};
+  my $submitter = "";
+  $submitter = $headers{'from'} if defined $headers{'from'};
 
   # compose follow up email
   my ($fh, $mailtpl) = tempfile("btsXXXXXX",
@@ -959,7 +961,8 @@ sub bts_followup {
     UNLINK => 1);
   open (MAIL, ">/dev/fd/" . fileno($fh))
     or die "bts: writing to temporary file: $!\n";
-  print MAIL "To: $bug\@$btsserver, $bug-submitter\@$btsserver\n";
+  print MAIL "To: $submitter\n";
+  print MAIL "Cc: $bug\@$btsserver\n";
   print MAIL "Subject: $subject\n";
   print MAIL "In-Reply-To: $ref\n" if $ref;
   print MAIL "\n";
@@ -2284,7 +2287,7 @@ sub parse_rfc822_headers {
     if ($line =~ /^([^:]+):\s+(.*)$/) {        # 1st header field
       my $key = lc $1;
       $headers{$key} = $2;
-    } elsif ($line =~ /^\s(.*)/ ) { # header field continuation
+    } elsif ($line =~ /^\s+(.*)/ ) { # header field continuation
       $headers{$key} .= " $1";
     }
   }
index 5b8a0d0..653a856 100644 (file)
@@ -1,5 +1,5 @@
 --- /usr/bin/bts       2008-01-11 21:59:45.000000000 +0100
-+++ bts        2008-01-25 15:18:35.000000000 +0100
++++ bts        2008-01-26 16:04:34.000000000 +0100
 @@ -266,6 +266,13 @@
  shell.  Default is 'mutt -f %s'.  (Also, %% will be substituted by a
  single % if this is needed.)
@@ -70,7 +70,7 @@
  if ($opt_sendmail and $opt_smtphost) {
      die "bts: --sendmail and --smtp-host mutually exclusive\n";
  }
-@@ -901,6 +920,66 @@
+@@ -901,6 +920,69 @@
       print map {qq($_\n)} @{$bugs};
  }
  
 +  die "bts: Couldn't run bts followup: $soap_broken\n" unless have_soap();
 +  my $bug = checkbug(shift) or die "bts followup: follow up on which bug?\n";
 +  my $msglogid = shift;
-+  $msglogid = 0 unless defined $msglogid;
++  $msglogid = 1 unless defined $msglogid;
 +  my $soap = SOAP::Lite->uri($soapurl)->proxy($soapproxyurl);
 +  my $log = $soap->get_bug_log($bug)->result();
-+  my $msg = $log->[$msglogid];
++  my $msg = $log->[$msglogid-1];
 +  my %headers = parse_rfc822_headers($msg->{header});
 +
 +  # extract data needed to compose the follow up email
 +  }
 +  my $ref = "";       # id for In-Reply-To 
 +  $ref = $headers{'message-id'} if defined $headers{'message-id'};
++  my $submitter = "";
++  $submitter = $headers{'from'} if defined $headers{'from'};
 +
 +  # compose follow up email
 +  my ($fh, $mailtpl) = tempfile("btsXXXXXX",
 +    UNLINK => 1);
 +  open (MAIL, ">/dev/fd/" . fileno($fh))
 +    or die "bts: writing to temporary file: $!\n";
-+  print MAIL "To: $bug\@$btsserver, $bug-submitter\@$btsserver\n";
++  print MAIL "To: $submitter\n";
++  print MAIL "Cc: $bug\@$btsserver\n";
 +  print MAIL "Subject: $subject\n";
 +  print MAIL "In-Reply-To: $ref\n" if $ref;
 +  print MAIL "\n";
  =item clone <bug> [new IDs]
  
  The clone control command allows you to duplicate a bug report. It is useful
-@@ -2194,6 +2273,24 @@
+@@ -2194,6 +2276,24 @@
      return $header;
  }
  
 +    if ($line =~ /^([^:]+):\s+(.*)$/) {       # 1st header field
 +      my $key = lc $1;
 +      $headers{$key} = $2;
-+    } elsif ($line =~ /^\s(.*)/ ) { # header field continuation
++    } elsif ($line =~ /^\s+(.*)/ ) { # header field continuation
 +      $headers{$key} .= " $1";
 +    }
 +  }
  ##########  Browsing and caching subroutines
  
  # Mirrors a given thing; if the online version is no newer than our
-@@ -3217,6 +3314,11 @@
+@@ -3217,6 +3317,11 @@
  If this is set, specifies a mail reader to use instead of mutt.  Same as
  the --mailreader command line option.