Module: tools Branch: master Commit: 2edc6a46c48e80abc64f4e50021b7f9afc8334ec URL: http://source.winehq.org/git/tools.git/?a=commit;h=2edc6a46c48e80abc64f4e500...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Nov 13 11:46:09 2017 +0100
patches: Also use References: header to find parent patch for expiration.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
patches/expire | 89 +++++++++++++++++++++++++++------------------------------- 1 file changed, 41 insertions(+), 48 deletions(-)
diff --git a/patches/expire b/patches/expire index 513a5b1..759f6c8 100755 --- a/patches/expire +++ b/patches/expire @@ -150,6 +150,7 @@ my $now = time(); my $email_from = "Marvin <testbot@winehq.org>"; my $base_url = "https://source.winehq.org/patches/data"; my %reviews; +my %patches;
foreach my $arg (@ARGV) { @@ -159,54 +160,37 @@ foreach my $arg (@ARGV) else { $dir = $arg; } }
-sub get_patch_subject($) -{ - my $file = shift; - my $ret; - - return undef unless open PATCH, "<$dir/$file"; - while (<PATCH>) - { - if (/^Subject: (.*)$/) - { - $ret = $1; - last; - } - } - close PATCH; - return $ret; -} - sub get_patch_state($) { my $file = shift; - my $status = "nil"; - my $mtime = 0; - my ($subject, $msgid, $reply); + my %patch;
return undef unless open PATCH, "<$dir/$file"; while (<PATCH>) { - if (/^Subject: (.*)$/) { $subject = $1; } - elsif (/^Message-Id: (.*)$/) { $msgid = $1; } - elsif (/^In-Reply-To: (.*)$/) { $reply = $1; } + if (/^Subject: (.*)$/) { $patch{subject} = $1; } + elsif (/^Message-Id: (.*)$/) { $patch{msgid} = $1; } + elsif (/^In-Reply-To: (.*)$/) { push @{$patch{reply}}, $1; } + elsif (/^References: (.*)$/) { push @{$patch{reply}}, split(/\s+/, $1); } last if (/^$/); } while (<PATCH>) { - if (/^diff --git a//) { $reply = undef; last; } + if (/^diff --git a//) { delete $patch{reply}; last; } } close PATCH;
if (open STATUS, "<$dir/$file.status") { - $status = <STATUS>; - chomp $status; - $mtime = (stat STATUS)[9] unless $status eq "nil"; + $patch{status} = <STATUS>; + chomp $patch{status}; + $patch{mtime} = (stat STATUS)[9] unless $patch{status} eq "nil"; close STATUS; } - $mtime ||= (stat "$dir/$file")[9]; - return ($subject, $msgid, $reply, $status, $mtime); + $patch{file} = $file; + $patch{status} ||= "nil"; + $patch{mtime} ||= (stat "$dir/$file")[9]; + return %patch; }
sub get_previous_state($) @@ -363,40 +347,49 @@ EOF } }
-# expire current patches +sub assign_expire($); +sub assign_expire($) +{ + my $patch = shift;
-my %patches; + return $patch->{expire} if defined $patch->{expire}; + + foreach my $p (@{$patch->{reply}}) + { + next unless defined $patches{$p}; + $patch->{expire} = assign_expire( $patches{$p} ); + return $patch->{expire} if defined $patch->{expire}; + } + + my $limit = $status_expiry{$patch->{status}} || 7; + $patch->{expire} = (($now - $patch->{mtime} - 12*60*60) / (24*60*60) > $limit); + return $patch->{expire}; +} + +# expire current patches
opendir DIR, $dir or die "cannot open '$dir': $!\n"; foreach my $file (sort readdir DIR) { next unless $file =~ /^[0-9]+$/; - my ($subject, $msgid, $reply, $status, $mtime) = get_patch_state( $file ); + my %patch = get_patch_state( $file ); my $prev_status = get_previous_state( $file ); - my $limit = $status_expiry{$status} || 7; - my $expire = (($now - $mtime - 12*60*60) / (24*60*60) > $limit);
- notify_state_change( $file, $prev_status, $status ); + notify_state_change( $file, $prev_status, $patch{status} );
- $patches{$msgid} = [ $file, $subject, $reply, $status, $expire ]; + $patches{$patch{msgid}} = %patch; } closedir DIR;
foreach my $p (keys %patches) { - my ($file, $subject, $reply, $status, $expire) = @{$patches{$p}}; - my $orig_status = $status; - - # for replies, inherit expire flag from top parent - while ($reply && $status eq "reply") - { - last unless defined $patches{$reply}; - (undef, undef, $reply, $status, $expire) = @{$patches{$reply}}; - } + my $patch = $patches{$p}; + my $orig_status = $patch->{status}; + my $file = $patch->{file};
- if ($expire) + if (assign_expire( $patch )) { - printf "unlink $file %s %s\n", $orig_status, $subject unless $quiet; + printf "unlink $file %s %s\n", $orig_status, $patch->{subject} unless $quiet; unless ($dry_run) { unlink "$dir/$file";