]> git.donarmstrong.com Git - debbugs.git/commitdiff
fix lack of unlocking in process before we start control
authorDon Armstrong <don@donarmstrong.com>
Sun, 15 Jul 2012 23:00:45 +0000 (16:00 -0700)
committerDon Armstrong <don@donarmstrong.com>
Sun, 15 Jul 2012 23:00:45 +0000 (16:00 -0700)
scripts/process
t/14_control_at_submit.t

index e5bec482b79368826e6ca16af2608b9b01088775..5b7175f5d032c57c8e7de9e627f7564fa1130581 100755 (executable)
@@ -275,12 +275,14 @@ $subject =~ s/^Re:\s*//i; $_= $subject."\n";
 if (not defined $tryref and m/^Bug ?\#(\d+)\D/i) {
     $tryref = $1 if $1 > 0;
 }
+my $locks = 0;
 my $data;
 if (defined $tryref) {
-     my $bfound;
-    ($bfound, $data)= &lockreadbugmerge($tryref);
-    if ($bfound and not $data->{archived}) {
-        $ref= $tryref; 
+     my $locks_recv;
+     ($locks_recv, $data)= &lockreadbugmerge($tryref);
+     $locks += $locks_recv;
+    if ($locks_recv and not $data->{archived}) {
+        $ref= $tryref;
     } else {
         &sendmessage(create_mime_message(
           [From          => "$gMaintainerEmail ($gProject $gBug Tracking System)",
@@ -408,8 +410,10 @@ if ($codeletter eq 'D' || $codeletter eq 'F')
     for $ref (@process) {
        if ($ref != $orgref) {
            &unfilelock;
+           $locks--;
            $data = &lockreadbug($ref)
                || die "huh ? $ref from $orgref out of ".join(' ',@process);
+           $locks++;
        }
         $data->{done}= $set_done if defined($set_done);
         $data->{forwarded}= $set_forwarded if defined($set_forwarded);
@@ -956,6 +960,8 @@ if (not exists $header{'x-debbugs-no-ack'} and
 }
 
 appendlog($ref,$msg);
+# unlock the locks we have received
+while ($locks--) {unfilelock();}
 
 ## handle control messages at this point, immediately before finishing
 my %clonebugs = (-1 => $ref);
index 38ea9d864181f78c2c3560be0a8b3b39824e9923..6688f53c97aa8d1f78d15aab202d3115098d376a 100644 (file)
@@ -1,7 +1,7 @@
 # -*- mode: cperl;-*-
 # $Id: 05_mail.t,v 1.1 2005/08/17 21:46:17 don Exp $
 
-use Test::More tests => 120;
+use Test::More tests => 122;
 
 use warnings;
 use strict;
@@ -140,6 +140,21 @@ ok(system('sh','-c','find '.$sendmail_dir.q( -type f | xargs grep -q "Subject: P
 $status = read_bug(bug=>2);
 ok($status->{subject} eq 'this is a new title','bug 2 retitled at submit@ time');
 
+send_message(to => '1@bugs.something',
+            headers => [To   => '1@bugs.something',
+                        From => 'foo@bugs.something',
+                        Subject => 'Testing control at 1@bugs.something',
+                       ],
+            body => <<EOF) or fail 'message to 1@bugs.something failed';
+Control: retitle -1 this is now the title of bug 1
+EOF
+
+ok(system('sh','-c','find '.$sendmail_dir.q( -type f | xargs grep -q "Subject: Processed: Testing control at 1@bugs.something")) == 0,
+   '1@bugs.something message was parsed without errors');
+
+$status = read_bug(bug=>1);
+ok($status->{subject} eq 'this is now the title of bug 1','bug 1 retitled at 1@ time');
+
 
 
 # now we're going to go through and methododically test all of the control commands.