X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=Documentation%2Fmknews.perl;h=1936cea72ae9a8b03d2046707375882795755b8c;hb=23af251dd607c4e75ab1e68063f2c885c48cc035;hp=e78c1cb87c57062e074abe37c0d0becce69c36dc;hpb=8edf9493a92f53a5135b9d36f5e913b46d6486c8;p=public-inbox.git diff --git a/Documentation/mknews.perl b/Documentation/mknews.perl index e78c1cb8..1936cea7 100755 --- a/Documentation/mknews.perl +++ b/Documentation/mknews.perl @@ -1,15 +1,16 @@ #!/usr/bin/perl -w -# Copyright (C) 2019 all contributors +# Copyright (C) 2019-2021 all contributors # License: AGPL-3.0+ # Generates NEWS, NEWS.atom, and NEWS.html files using release emails # this uses unstable internal APIs of public-inbox, and this script # needs to be updated if they change. use strict; -use PublicInbox::MIME; +use PublicInbox::Eml; use PublicInbox::View; -use Plack::Util; +use PublicInbox::Hval qw(fmt_ts); use PublicInbox::MsgTime qw(msg_datestamp); use PublicInbox::MID qw(mids mid_escape); +END { $INC{'Plack/Util.pm'} and warn "$0 should not have loaded Plack::Util\n" } my $dst = shift @ARGV or die "Usage: $0 "; # newest to oldest @@ -21,8 +22,8 @@ my $atom_url = 'https://public-inbox.org/NEWS.atom'; my $addr = 'meta@public-inbox.org'; my $latest = shift(@releases) or die 'no releases?'; -my $mime_latest = release2mime($latest); -my $mtime = msg_datestamp($mime_latest->header_obj); +my $mtime; +my $mime_latest = release2mime($latest, \$mtime); my $tmp = "$dst+"; my $out; if ($dst eq 'NEWS') { @@ -34,15 +35,15 @@ if ($dst eq 'NEWS') { } } elsif ($dst eq 'NEWS.atom' || $dst eq 'NEWS.html') { open $out, '>', $tmp or die; - my $ibx = Plack::Util::inline_object( - description => sub { 'public-inbox releases' }, - over => sub { undef }, - search => sub { 1 }, # for WwwStream:_html_top - base_url => sub { "$base_url/" }, + my $ibx = My::MockObject->new( + description => 'public-inbox releases', + over => undef, + search => 1, # for WwwStream::html_top + base_url => "$base_url/", ); $ibx->{-primary_address} = $addr; my $ctx = { - -inbox => $ibx, + ibx => $ibx, -upfx => "$base_url/", -hr => 1, }; @@ -73,17 +74,25 @@ rename($tmp, $dst) or die; exit 0; sub release2mime { - my $f = "$dir/$_[0].eml"; + my ($release, $mtime_ref) = @_; + my $f = "$dir/$release.eml"; open(my $fh, '<', $f) or die "open($f): $!"; - PublicInbox::MIME->new(do { local $/; <$fh> }); + my $mime = PublicInbox::Eml->new(\(do { local $/; <$fh> })); + # Documentation/include.mk relies on mtimes of each .eml file + # to trigger rebuild, so make sure we sync the mtime to the Date: + # header in the .eml + my $mtime = msg_datestamp($mime->header_obj); + utime($mtime, $mtime, $fh) or warn "futimes $f: $!"; + $$mtime_ref = $mtime if $mtime_ref; + $mime; } sub mime2txt { my ($out, $mime) = @_; - my $title = $mime->header_str('Subject'); + my $title = $mime->header('Subject'); $title =~ s/^\s*\[\w+\]\s*//g; # [ANNOUNCE] or [ANN] my $dtime = msg_datestamp($mime->header_obj); - $title .= ' - ' . PublicInbox::View::fmt_ts($dtime) . ' UTC'; + $title .= ' - ' . fmt_ts($dtime) . ' UTC'; print $out $title, "\n" or die; my $uline = '=' x length($title); print $out $uline, "\n\n" or die; @@ -94,24 +103,26 @@ sub mime2txt { } sub mime2html { - my ($out, $mime, $ctx) = @_; - my $smsg = bless { mime => $mime }, 'PublicInbox::SearchMsg'; - print $out PublicInbox::View::index_entry($smsg, $ctx, 1) or die; + my ($out, $eml, $ctx) = @_; + my $smsg = $ctx->{smsg} = bless {}, 'PublicInbox::Smsg'; + $smsg->populate($eml); + $ctx->{msgs} = [ 1 ]; # for
in eml_entry + print $out PublicInbox::View::eml_entry($ctx, $eml) or die; } sub html_start { my ($out, $ctx) = @_; require PublicInbox::WwwStream; - $ctx->{www} = Plack::Util::inline_object(style => sub { '' }); - my $www_stream = PublicInbox::WwwStream->new($ctx); - print $out $www_stream->_html_top, '
' or die;
+	$ctx->{www} = My::MockObject->new(style => '');
+	my $www_stream = PublicInbox::WwwStream::init($ctx);
+	print $out $www_stream->html_top, '
' or die;
 }
 
 sub html_end {
-	print $out <
-EOF
+	for (@$PublicInbox::WwwStream::CODE_URL) {
+		print $out "	git clone $_\n" or die;
+	}
+	print $out "
\n" or die; } sub atom_start { @@ -119,10 +130,10 @@ sub atom_start { require PublicInbox::WwwAtomStream; # WwwAtomStream stats this dir for mtime my $astream = PublicInbox::WwwAtomStream->new($ctx); - delete $ctx->{emit_header}; - my $ibx = $ctx->{-inbox}; + delete $astream->{emit_header}; + my $ibx = $ctx->{ibx}; my $title = PublicInbox::WwwAtomStream::title_tag($ibx->description); - my $updated = PublicInbox::WwwAtomStream::feed_updated(gmtime($mtime)); + my $updated = PublicInbox::WwwAtomStream::feed_updated($mtime); print $out < $mime }, 'PublicInbox::SearchMsg'; - if (defined(my $str = $astream->feed_entry($smsg))) { + my ($out, $astream, $eml, $ctx) = @_; + my $smsg = bless {}, 'PublicInbox::Smsg'; + $smsg->populate($eml); + if (defined(my $str = $astream->feed_entry($smsg, $eml))) { print $out $str or die; } } +package My::MockObject; +use strict; +our $AUTOLOAD; + +sub new { + my ($class, %values) = @_; + bless \%values, $class; +} + +sub AUTOLOAD { + my ($self) = @_; + my $attr = (split(/::/, $AUTOLOAD))[-1]; + $self->{$attr}; +} + +1;