#!/usr/bin/perl -w

my @removedpack = ("ZZZRemovedPackages");
my $setupini;

if(@ARGV == 1) {
  open(F, "<$ARGV[0]") || die("Can't access $ARGV[0]: $!");
  {
    local $/;   # slurp
    $setupini = <F>;
  }
  close(F);
} else {
  die("usage: $0 filename");
}

# parse setup.ini into data structure
my $packages = parse_ini(\$setupini);
lint($packages);

sub lint
{
  my $p = shift;
 
  foreach my $pack (sort keys %$p) {

    if (!exists($p->{$pack}->{'sdesc'})) {
      print "$pack: no sdesc\n";
    } elsif (lc($p->{$pack}->{'sdesc'}) eq lc($pack)) {
      print "$pack: sdesc contains only name of package\n";
    } elsif ($p->{$pack}->{'sdesc'} =~ m/^\s*\Q$pack\E\b/i) {
      print "$pack: sdesc begins with name of package\n";
    }

    foreach my $req (@{ $p->{$pack}->{'requires'} }) {
      foreach my $reqcat (@{ $p->{$req}->{'category'} }) {
        foreach my $remcat (@removedpack) {
          if (lc($reqcat) eq lc($remcat)) {
            print "$pack: references removed package in 'requires'\n";
          }
        }
      }
    }
  }
}    

sub parse_ini
# passed a reference to the contents of setup.ini, this returns
# a hashref containing the parsed structure
{
  my $s = shift;
  my $p = {};
  my $id = 1;
  
  # el ghetto parser
  while( $$s =~ m/\n@ ([^\s]+)\n/g ) {
    my $pack = $1;
    $p->{$pack} = {};
    $p->{$pack}->{'vers'} = {};
    $p->{$pack}->{'id'} = $id++;
    
    LOOP: {
      $p->{$pack}->{'sdesc'} = $1, redo LOOP if( $$s =~ m/\Gsdesc: *\"([^"]*)\"\n/igc );
      $p->{$pack}->{'ldesc'} = $1, redo LOOP if( $$s =~ m/\Gldesc: *\"([^"]*)\"\n/igcs );
      $p->{$pack}->{'category'} = [ split(/ +/, $1) ], redo LOOP if( $$s =~ m/\Gcategory: *(.*)\n/igc );
      $p->{$pack}->{'requires'} = [ split(/ +/, $1) ], redo LOOP if( $$s =~ m/\Grequires: *(.*)\n/igc );
      $p->{$pack}->{'vers'}->{'curr'} = $1, redo LOOP if( $$s =~ m/\Gversion: *(.*)\ninstall: [^\n]+\n(source: [^\n]+\n)?/igc );
      $p->{$pack}->{'vers'}->{'prev'} = $1, redo LOOP if( $$s =~ m/\G\[prev\]\nversion: *(.*)\ninstall: [^\n]+\n(source: [^\n]+\n)?/igc );
      $p->{$pack}->{'vers'}->{'test'} = $1, redo LOOP if( $$s =~ m/\G\[test\]\nversion: *(.*)\ninstall: [^\n]+\n(source: [^\n]+\n)?/igc );      
    }
    if(!exists($p->{$pack}->{'sdesc'})
       || !exists($p->{$pack}->{'category'})
     # || scalar keys %{$p->{$pack}->{'vers'}} < 1   # some packages have no version ?!?  eg. gcc-gm2
       ) {
      print STDERR "Warning: package $pack missing some fields.\n";
    }
  }
  
  return $p;
}
 