#! /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 $k | \n $d | \n
\n" ;
}
$tab .= "
\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} ;