On 24 April 2018 at 07:53,  <[email protected]> wrote:
> Author: henkp
> Date: Tue Apr 24 06:53:17 2018
> New Revision: 1829960
>
> URL: http://svn.apache.org/viewvc?rev=1829960&view=rev
> Log:
> += gen-flags
>
> Added:
>     attic/site-jekyll/src/gen-flags   (with props)
>
> Added: attic/site-jekyll/src/gen-flags
> URL: 
> http://svn.apache.org/viewvc/attic/site-jekyll/src/gen-flags?rev=1829960&view=auto
> ==============================================================================
> --- attic/site-jekyll/src/gen-flags (added)
> +++ attic/site-jekyll/src/gen-flags Tue Apr 24 06:53:17 2018
> @@ -0,0 +1,162 @@
> +#! /usr/bin/perl
> +
> +use strict ;
> +use warnings ;
> +use JSON ;
> +
> +my $DEF_JSON_FILE = '_data/projects.json' ;
> +my $DEF_FLAGS_DIR = 'flags' ;

Assumes the script is run from the src/ directory
Directories under src/flags will be copied by the Jekyll build to the
site directory.
Which is fine, but the script will also be copied.

Although one can add an exclusion,
I think it would be better to keep tools out of the site source dir.
e.g in the parent directory alongside the build.sh file

> +my $BANNER_FILE   = 'banners' ;
> +
> +my $prog = substr $0, rindex ( $0, '/' ) + 1 ;
> +my $Usage = <<USAGE ;
> +Usage: $prog [-v] [-q] [-d] [-f] [json [flags]]
> +option v : be verbose
> +option q : be quiet
> +option d : show debug info
> +option f : action ; otherwise dry-run
> +argument json  : JSON file ; default $DEF_JSON_FILE
> +argument flags : flag directory ; default $DEF_FLAGS_DIR
> +----------------------------------------------------------
> +$prog generates flag files in directory \$flags/ ;
> +-- these flags are used in the httpd config of www.a.o ;
> +-- the presence of directory flags/\$tag.apache.org/
> +   triggers a redirect for www.a.o/dist/\$tag ;
> +-- the presence of file flags/\$tag.apache.org/$BANNER_FILE
> +   triggers banners to be added to site \$tag.apache.org.
> +----------------------------------------------------------
> +USAGE
> +sub Usage { die "$_[0]$Usage" ; }
> +sub Error { die "[error] $prog: $_[0]\n" ; }
> +sub Warn  { warn "[warn] $prog: $_[0]\n" ; }
> +
> +# usage: &GetOptions(ARG,ARG,..) defines $opt_ID as 1 or user spec'ed value
> +# usage: &GetOptions(\%opt,ARG,ARG,..) defines $opt{ID} as 1 or user value
> +# ARG = 'ID' | 'ID=SPC' | 'ID:SPC' for no-arg, required-arg or optional-arg
> +# ID  = perl identifier
> +# SPC = i|f|s for integer, fixedpoint real or string argument
> +
> +use Getopt::Long ;
> +Getopt::Long::config ( 'no_ignore_case' ) ;
> +my %opt = () ; Usage '' unless GetOptions
> +  ( \%opt, qw(v q d f) ) ;
> +Usage "Arg count\n" if @ARGV > 2 ;
> +
> +$opt{v} ||= $opt{d} ;
> +
> +my $TAG  = $opt{f} ? 'DID' : 'WOULD' ;
> +my $mods = 0 ;
> +
> +my $JSON_FILE = shift || $DEF_JSON_FILE ;
> +my $FLAGS_DIR = shift || $DEF_FLAGS_DIR ;
> +chop $FLAGS_DIR while $FLAGS_DIR =~ m!/$! ;
> +
> +if ( $opt{v} )
> +  { print "using json file '$JSON_FILE'\n" ;
> +    print "using flags dir '$FLAGS_DIR'\n" ;
> +  }
> +
> +Error "no json file ($JSON_FILE)" unless -f $JSON_FILE ;
> +Error "no flags dir ($FLAGS_DIR)" unless -d $FLAGS_DIR ;
> +
> +sub mk_tag
> +  { my $hash = shift ;
> +    my $res = $hash -> {id} ;
> +    unless ( $res )
> +      { $res = lc $hash -> {name} ;
> +        $res =~ s![/\s]!-!g ;
> +      }
> +    $res ;
> +  }
> +
> +sub get_json
> +  { open JSON, '<', $JSON_FILE or Error "can't open $JSON_FILE ($!)" ;
> +    my $json = from_json join '', <JSON> ;
> +    close JSON ;
> +    my $res = {} ;
> +    for my $hash ( @$json )
> +      { next if exists $hash -> {subproject} ;
> +        my $tag = mk_tag $hash ;
> +        $res -> { $tag } = $hash ;
> +      }
> +    $res ;
> +  }
> +
> +sub banners
> +  { my $hash = shift ;
> +    my $date = $hash -> {retired} ;
> +    ( split ' ', $date ) [ 1 ] >= 2018 ;

Are we positive that all retirements after 2018 will need to use the banners?

> +  }
> +
> +sub touch
> +  { my $file = shift ;
> +    my $res  = 1 ;
> +    if ( open FILE, '>', $file )
> +      { close FILE ; }
> +    else
> +      { $res = 0 ; }
> +    $res ;
> +  }
> +
> +sub mk_flags
> +  { my $JSON = shift ;
> +    my $res  = {} ;
> +    for my $tag ( sort keys %$JSON )
> +      { my $hash = $JSON -> { $tag } ;
> +        my $fdir = sprintf "%s/%s.apache.org", $FLAGS_DIR, $tag ;
> +        $res -> { $fdir } ++ ;
> +        unless ( -d $fdir )
> +          { printf "$TAG mkdir $fdir\n" unless $opt{q} ;
> +            $mods ++ ;
> +            if ( $opt{f} )
> +              { mkdir $fdir, 0755 or Error "can't mkdir $fdir ($!)" ; }
> +          }
> +        if ( banners $hash )
> +          { my $file = "$fdir/$BANNER_FILE" ;
> +            $res -> { $file } ++ ;
> +            unless ( -f $file )
> +              { printf "$TAG touch $file\n" unless $opt{q} ;
> +                $mods ++ ;
> +                if ( $opt{f} )
> +                  { touch $file or Error "can't touch $file ($!)" ; }
> +              }
> +          }
> +      }
> +    $res ;
> +  }
> +
> +sub get_have
> +  { opendir FDIR, $FLAGS_DIR or Error "can't opendir $FLAGS_DIR ($!)" ;
> +    my @fdir = map "$FLAGS_DIR/$_", grep ! /^\./, readdir FDIR ;
> +    closedir FDIR ;
> +    my $res = {} ;
> +    for my $fdir ( @fdir )
> +      { my $file = "$fdir/$BANNER_FILE" ;
> +        $res -> { $fdir } ++ ;
> +        $res -> { $file } ++ if -f $file ;
> +      }
> +    $res ;
> +  }
> +
> +sub cleanup
> +  { my $want = shift ;
> +    my $have = get_have ;
> +    for my $item ( reverse sort keys %$have )
> +      { if ( $want -> { $item } )
> +          { print "we do want $item\n" if $opt{d} ; }
> +        else
> +          { print "$TAG remove $item\n" ;
> +            $mods ++ ;
> +            if ( $opt{f} )
> +              { if ( -d $item )
> +                  { rmdir $item or Error "can't rmdir $item ($!)" ; }
> +                else
> +                  { unlink "$item" or Error "can't unlink $item ($!)" ; }
> +              }
> +          }
> +      }
> +  }
> +
> +cleanup mk_flags get_json ;
> +
> +printf "$prog : no change\n" unless $opt{q} or $mods ;
>
> Propchange: attic/site-jekyll/src/gen-flags
> ------------------------------------------------------------------------------
>     svn:executable = *
>
>

Reply via email to