diff options
Diffstat (limited to 'scripts/build-bmo-push-data.pl')
-rwxr-xr-x | scripts/build-bmo-push-data.pl | 195 |
1 files changed, 101 insertions, 94 deletions
diff --git a/scripts/build-bmo-push-data.pl b/scripts/build-bmo-push-data.pl index e3cefe533..dcce29652 100755 --- a/scripts/build-bmo-push-data.pl +++ b/scripts/build-bmo-push-data.pl @@ -8,10 +8,10 @@ use File::Spec::Functions qw(catdir rel2abs); use Cwd qw(realpath); BEGIN { - require lib; - my $dir = realpath( catdir(dirname(__FILE__), '..') ); - lib->import( $dir, catdir( $dir, 'lib' ), catdir( $dir, qw(local lib perl5) ) ); - chdir $dir or die "chdir $dir failed: $!"; + require lib; + my $dir = realpath(catdir(dirname(__FILE__), '..')); + lib->import($dir, catdir($dir, 'lib'), catdir($dir, qw(local lib perl5))); + chdir $dir or die "chdir $dir failed: $!"; } use autodie; @@ -37,53 +37,51 @@ chomp @log; my @revisions; foreach my $line (@log) { - say $line; - my ($revision, $message); - unless ( ( $revision, $message ) = $line =~ /^(\S+) (.+)$/ ) { - warn "skipping $line\n"; - next; + say $line; + my ($revision, $message); + unless (($revision, $message) = $line =~ /^(\S+) (.+)$/) { + warn "skipping $line\n"; + next; + } + + my @bug_ids; + if ($message =~ /\bBug (\d+)/i) { + push @bug_ids, $1; + } + + if (!@bug_ids) { + warn "skipping $line (no bug)\n"; + next; + } + + foreach my $bug_id (@bug_ids) { + my $duplicate = 0; + foreach my $revisions (@revisions) { + if ($revisions->{bug_id} == $bug_id) { + $duplicate = 1; + last; + } } + next if $duplicate; - my @bug_ids; - if ($message =~ /\bBug (\d+)/i) { - push @bug_ids, $1; + my $bug = fetch_bug($bug_id); + if ($bug->{status} eq 'RESOLVED' && $bug->{resolution} ne 'FIXED') { + next; } - - if (!@bug_ids) { - warn "skipping $line (no bug)\n"; - next; - } - - foreach my $bug_id (@bug_ids) { - my $duplicate = 0; - foreach my $revisions (@revisions) { - if ($revisions->{bug_id} == $bug_id) { - $duplicate = 1; - last; - } - } - next if $duplicate; - - my $bug = fetch_bug($bug_id); - if ($bug->{status} eq 'RESOLVED' && $bug->{resolution} ne 'FIXED') { - next; - } - if ($bug->{summary} =~ /\bbackport\s+(?:upstream\s+)?bug\s+(\d+)/i) { - my $upstream = $1; - $bug->{summary} = fetch_bug($upstream)->{summary}; - } - push @revisions, { - hash => $revision, - bug_id => $bug_id, - summary => $bug->{summary}, - }; + if ($bug->{summary} =~ /\bbackport\s+(?:upstream\s+)?bug\s+(\d+)/i) { + my $upstream = $1; + $bug->{summary} = fetch_bug($upstream)->{summary}; } + push @revisions, + {hash => $revision, bug_id => $bug_id, summary => $bug->{summary},}; + } } if (!@revisions) { - die "no new revisions. make sure you run this script before production is updated.\n"; + die + "no new revisions. make sure you run this script before production is updated.\n"; } else { - @revisions = reverse @revisions; + @revisions = reverse @revisions; } my $first_revision = $revisions[0]->{hash}; @@ -100,10 +98,11 @@ close $tag_fh; say 'write bug.push.txt'; open my $bug_fh, '>', 'bug.push.txt'; -say $bug_fh 'https://bugzilla.mozilla.org/enter_bug.cgi?product=bugzilla.mozilla.org&component=Infrastructure&short_desc=push+updated+bugzilla.mozilla.org+live'; +say $bug_fh + 'https://bugzilla.mozilla.org/enter_bug.cgi?product=bugzilla.mozilla.org&component=Infrastructure&short_desc=push+updated+bugzilla.mozilla.org+live'; say $bug_fh "revisions: $first_revision - $last_revision"; foreach my $revision (@revisions) { - say $bug_fh "bug $revision->{bug_id} : $revision->{summary}"; + say $bug_fh "bug $revision->{bug_id} : $revision->{summary}"; } close $bug_fh; @@ -111,22 +110,28 @@ say 'write blog.push.txt'; open my $blog_fh, '>', 'blog.push.txt'; say $blog_fh "[release tag]($tag_url)\n"; -say $blog_fh "the following changes have been pushed to bugzilla.mozilla.org:\n<ul>"; +say $blog_fh + "the following changes have been pushed to bugzilla.mozilla.org:\n<ul>"; foreach my $revision (@revisions) { - printf $blog_fh '<li>[<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=%s" target="_blank">%s</a>] %s</li>%s', - $revision->{bug_id}, $revision->{bug_id}, html_escape($revision->{summary}), "\n"; + printf $blog_fh + '<li>[<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=%s" target="_blank">%s</a>] %s</li>%s', + $revision->{bug_id}, $revision->{bug_id}, html_escape($revision->{summary}), + "\n"; } say $blog_fh '</ul>'; -say $blog_fh q{discuss these changes on <a href="https://lists.mozilla.org/listinfo/tools-bmo" target="_blank">mozilla.tools.bmo</a>.}; +say $blog_fh + q{discuss these changes on <a href="https://lists.mozilla.org/listinfo/tools-bmo" target="_blank">mozilla.tools.bmo</a>.}; close $blog_fh; say 'write email.push.txt'; open my $email_fh, '>', 'email.push.txt'; -say $email_fh "the following changes have been pushed to bugzilla.mozilla.org:\n"; +say $email_fh + "the following changes have been pushed to bugzilla.mozilla.org:\n"; say $email_fh "(tag: $tag_url)\n"; foreach my $revision (@revisions) { - printf $email_fh "https://bugzil.la/%s : %s\n", $revision->{bug_id}, $revision->{summary}; + printf $email_fh "https://bugzil.la/%s : %s\n", $revision->{bug_id}, + $revision->{summary}; } close $email_fh; @@ -137,19 +142,20 @@ say $wiki_fh 'https://wiki.mozilla.org/BMO/Recent_Changes'; say $wiki_fh '== ' . DateTime->now->set_time_zone('UTC')->ymd('-') . " ==\n"; say $wiki_fh "[$tag_url $tag]"; foreach my $revision (@revisions) { - printf $wiki_fh "* {{bug|%s}} %s\n", $revision->{bug_id}, $revision->{summary}; + printf $wiki_fh "* {{bug|%s}} %s\n", $revision->{bug_id}, $revision->{summary}; } close $wiki_fh; sub html_escape { - my ($s) = @_; - $s =~ s/&/&/g; - $s =~ s/</</g; - $s =~ s/>/>/g; - return $s; + my ($s) = @_; + $s =~ s/&/&/g; + $s =~ s/</</g; + $s =~ s/>/>/g; + return $s; } -use constant BUG_FIELDS => [qw( +use constant BUG_FIELDS => [ + qw( id product version @@ -158,46 +164,47 @@ use constant BUG_FIELDS => [qw( status resolution assigned_to -)]; + ) +]; sub fetch_bug { - my ($bug_id) = @_; - die 'missing id' unless $bug_id; + my ($bug_id) = @_; + die 'missing id' unless $bug_id; - my $response = _get( 'bug/' . $bug_id, { include_fields => BUG_FIELDS, } ); - return $response->{bugs}->[0]; + my $response = _get('bug/' . $bug_id, {include_fields => BUG_FIELDS,}); + return $response->{bugs}->[0]; } sub _get { - my ($endpoint, $args) = @_; - my $ua = LWP::UserAgent->new( agent => $PROGRAM_NAME ); - $args //= {}; - - if (exists $args->{include_fields} && ref($args->{include_fields})) { - $args->{include_fields} = join ',', @{ $args->{include_fields} }; - } - - my $uri = URI->new('https://bugzilla.mozilla.org/rest/' . $endpoint); - foreach my $name (sort keys %$args) { - $uri->query_param($name => $args->{$name}); - } - - my $request = HTTP::Request->new('GET', $uri->as_string); - $request->header( Content_Type => 'application/json' ); - $request->header( Accept => 'application/json' ); - if ( $ENV{BMO_API_KEY} ) { - $request->header( X_Bugzilla_API_Key => $ENV{BMO_API_KEY} ); - } - - my $response = $ua->request($request); - if ($response->code !~ /^2/) { - my $error = $response->message; - my $ok = eval { - $error = decode_json($response->decoded_content)->{message}; - 1; - }; - $error = $@ unless $ok; - die $error . "\n"; - } - return decode_json($response->decoded_content); + my ($endpoint, $args) = @_; + my $ua = LWP::UserAgent->new(agent => $PROGRAM_NAME); + $args //= {}; + + if (exists $args->{include_fields} && ref($args->{include_fields})) { + $args->{include_fields} = join ',', @{$args->{include_fields}}; + } + + my $uri = URI->new('https://bugzilla.mozilla.org/rest/' . $endpoint); + foreach my $name (sort keys %$args) { + $uri->query_param($name => $args->{$name}); + } + + my $request = HTTP::Request->new('GET', $uri->as_string); + $request->header(Content_Type => 'application/json'); + $request->header(Accept => 'application/json'); + if ($ENV{BMO_API_KEY}) { + $request->header(X_Bugzilla_API_Key => $ENV{BMO_API_KEY}); + } + + my $response = $ua->request($request); + if ($response->code !~ /^2/) { + my $error = $response->message; + my $ok = eval { + $error = decode_json($response->decoded_content)->{message}; + 1; + }; + $error = $@ unless $ok; + die $error . "\n"; + } + return decode_json($response->decoded_content); } |