#! /usr/bin/perl use strict ; use warnings ; use YAML ; use JSON ; my $YAML_FILE = 'data/attic.yaml' ; my $PAGE_TMPL = 'data/page.tmpl' ; my $INDX_TXT = 'data/index.txt' ; my $PROC_TXT = 'data/process.txt' ; my $RESO_TXT = 'data/resolution.txt' ; my $DEST = 'docs' ; my $DEST_PROJ = 'projects' ; my $DEST_JSON = "$DEST/attic.json" ; my $NA = 'n/a' ; my $prog = substr $0, rindex ( $0, '/' ) + 1 ; my $Usage = < 0 ; $opt{v} ||= $opt{d} ; my $TAG = $opt{f} ? 'DID' : 'WOULD' ; my $mods = 0 ; if ( $opt{v} ) { print "using page templ '$PAGE_TMPL'\n" ; } Error "no page tmpl ($PAGE_TMPL)" unless -f $PAGE_TMPL ; for my $dir ( $DEST, "$DEST/$DEST_PROJ" ) { -d $dir or mkdir $dir, 0755 or Error "can't mkdir $dir ($!)" ; } sub get_file ($) { my $file = shift ; open FILE, '<', $file or Error "can't open $file ($!)" ; my $res = join '', ; close FILE ; $res ; } sub put_file ($$) { my $file = shift ; my $text = shift ; open FILE, '>', $file or Error "can't write $file ($!)" ; print FILE $text ; close FILE ; } sub mk_tag { my $hash = shift ; my $res = $hash -> {stem} ; unless ( $res ) { $res = lc $hash -> {name} ; $res =~ s![/\s]!-!g ; } $res ; } sub get_yaml { my @res = YAML::LoadFile $YAML_FILE ; [ @res ] ; } sub get_prjs { get_yaml ; } sub put_json { my $file = shift ; my $yaml = shift ; put_file $file, JSON::to_json ( [ map { my $r ; %$r = %$_ ; for my $t ( qw(nodist nokeys) ) { $r -> { $t } = ( $_ -> { $t } ? JSON::true : JSON::false ) if exists $_ -> { $t } ; } $r ; } @$yaml ] , { pretty => 1, canonical => 1 } ) ; } sub mk_proj_list { my $prjs = shift ; my @res = () ; for my $hash ( sort { lc $a -> {name} cmp lc $b -> {name} } @$prjs ) { my $tag = mk_tag $hash ; my $name = $hash -> {name} ; my $rviv = $hash -> {revived} ; $name =~ s/\s+\(.*\)// ; my $res = sprintf '%s' , $DEST_PROJ, $tag, $name ; $res .= " until $rviv" if $rviv ; push @res, $res ; } sprintf "\n\n", join '', map "
  • $_
  • \n", @res ; } sub url { sprintf '%s', @_ ; } sub site_url { my $site = shift ; my $proj = shift ; my $sprj = shift ; return $NA if defined $site and $site eq '' ; $site ||= "$proj.apache.org" ; $site .= "/$sprj" if defined $sprj ; url "https://$site", $site ; } sub mail_url { my ( $p, $l ) = @_ ; url ( "https://mail-archives.apache.org/mod_mbox/$p-$l/", $l ) ; } sub jira_url { my $p = shift ; return '' unless defined $p ; url "https://issues.apache.org/jira/browse/$p/", 'JIRA' ; } sub bugz_url { my $b = shift ; return '' unless defined $b ; my $u = "https://bz.apache.org/bugzilla/buglist.cgi?product=%s" ; url sprintf ( $u, $b ), 'Bugzilla' ; } sub trac_url { my $b = shift ; return $NA unless defined $b ; my ( $sys, $sub ) = split ' ', $b ; ( $sys eq 'JIRA' ? jira_url $sub : ( $sys eq 'Bugzilla' ? bugz_url $sub : "bad sys [$sys]" ) ) ; } sub wiki_url { my $u = shift ; return $NA unless defined $u ; url $u, $u ; } sub minutes_url { my $p = shift ; return $NA unless defined $p ; url "https://whimsy.apache.org/board/minutes/$p.html", 'Minutes' } sub scm_url { my ( $scm, $p, $sub ) = @_ ; return $NA unless defined $scm ; $p .= "/$sub" if defined $sub ; ( $scm eq 'svn' ? url ( "http://svn.apache.org/repos/asf/$p/", $scm ) : ( $scm eq 'git-wip' ? url ( "https://git-wip-us.apache.org/repos/asf?p=$p.git", $scm ) : 'todo' ) ) ; } sub arch_url { my ( $p, $sub, $dist ) = @_ ; return $NA unless defined $p ; return $NA if defined $dist and $dist eq '' ; $p .= "/$sub" if defined $sub ; $p = $dist if defined $dist ; url "http://archive.apache.org/dist/$p/", "archive.apache.org/dist/$p/" } sub gen_page { my %opts = ( PAGE => 'no_page' , FILE => 'no_file' , TITLE => 'no_title' , BODY => 'no_body' , @_ ) ; my $page = $opts{PAGE} ; my $OUT = "$DEST/$opts{FILE}" ; print "$TAG create $OUT\n" if $opt{v} ; if ( $opt{f} ) { my $TMP = "$OUT.tmp" ; open TMP, '>', $TMP or Error "can't write $TMP ($!)" ; $page =~ s/%TITLE%/$opts{TITLE}/g ; $page =~ s/%BODY%/$opts{BODY}/g ; print TMP $page ; close TMP ; rename $TMP, $OUT or Error "can't rename $TMP, $OUT ($!)" ; } } sub DEF_POST ($) { my $proj = shift ; <$proj outside of Apache, please let us know so we can link to your project. POST } sub mk_proj_tab { my $hash = shift ; my $name = ucfirst $hash -> {name} ; my $proj = $hash -> {project} ; my $sprj = $hash -> {subproject} ; my $site = $hash -> {website} ; my $mail = $hash -> {mailnames} ; my $trac = $hash -> {tracker} ; my $wiki = $hash -> {wiki} ; my $board = $hash -> {board} ; my $scm = $hash -> {scm} ; my $dist = $hash -> {dist} ; my $tab = '' ; my @tab = ( [ 'Website' , site_url $site, $proj, $sprj ] , [ 'Mailing List Archives' , join ( "\n| ", map { mail_url $proj, $_ } @$mail ) || $NA ] , [ 'Issue Tracker' , trac_url ( $trac ) || $NA ] , [ 'Source' , scm_url $scm, $proj, $sprj ] , [ 'Wiki' , wiki_url $wiki ] , [ 'Board Reports' , minutes_url $board || $proj ] , [ 'Archive' , arch_url $proj, $sprj, $dist ] ) ; $tab = '' . "\n" ; for my $rec ( @tab ) { my ( $k, $d ) = @$rec ; $tab .= "\n \n \n\n" ; } $tab .= "
    $k$d
    \n" ; $tab ; } sub mk_proj { my $hash = shift ; my $name = ucfirst $hash -> {name} ; my $proj = $hash -> {project} ; my $rtrd = $hash -> {retired} ; my $rviv = $hash -> {revived} ; my $dscr = $hash -> {description} ; my $post = $hash -> {postlude} || DEF_POST $name ; my $hist = '' ; my $tab = '' ; if ( $rviv ) { $hist = "Project $name was in the Attic from $rtrd until $rviv." ; } else { $hist = "Project $name moved into the Attic in $rtrd." ; $tab = mk_proj_tab $hash ; } my $res = <$hist

    $dscr

    $tab

    $post

    TAB $res ; } my $prjs = get_prjs ; my $page = get_file $PAGE_TMPL ; my $plist = mk_proj_list $prjs ; $page =~ s/%PROJS%/$plist/ ; gen_page ( PAGE => $page , FILE => 'index.html' , TITLE => 'Apache Attic' , BODY => get_file $INDX_TXT ) ; gen_page ( PAGE => $page , FILE => 'resolution.html' , TITLE => 'Board Resolution to move to the Attic' , BODY => get_file $RESO_TXT ) ; gen_page ( PAGE => $page , FILE => 'process.html' , TITLE => 'Moving a project to the Attic' , BODY => get_file $PROC_TXT ) ; for my $hash ( @$prjs ) { my $tag = mk_tag $hash ; my $nam = $hash -> {name} ; gen_page ( PAGE => $page , FILE => "$DEST_PROJ/$tag.html" , TITLE => "Apache Attic -- $nam" , BODY => mk_proj $hash ) ; } print "$TAG create $DEST_JSON\n" if $opt{v} ; put_json $DEST_JSON, $prjs if $opt{f} ;