summaryrefslogblamecommitdiff
path: root/Tools/scripts/distinfochecker
blob: c485108ef575689c53cf16c83324ee3c08e247d8 (plain) (tree)
1
                      






























                                                                      


              

























                                                              




















                                                              





                                                        
                          




                                                          
                              

                 
                       





                                                     
                          




                                                          
                              







                                                     
                          



                                                        
                          







                    

                                             
#!/usr/bin/env perl -w

#
# $FreeBSD$
#
# Author: Edwin Groothuis <edwin@FreeBSD.org>
#

#
# Small tool to find distinfo with missing MD5/SHA256/SIZE statements,
# based on the assumption that if there is one of the MD5/SHA256/SIZE
# statements, then there should be all of them (except for SIZE
# when MD5/SHA256 is set to IGNORE).
#
# Usage: distinfochecker [-v] [-d directory]
# -v	- verbose (print)
# -d	- use directory instead of /usr/ports
#

use Getopt::Std;
use strict;
use Data::Dumper;

my $UP="/usr/ports";
my $verbose=0;

my %opts=();
getopt('d:v',\%opts);

$UP=$opts{d} if (defined $opts{d});
$verbose=1 if (defined $opts{v});

my $errors=0;
my $checked=0;

opendir(DHUP,$UP);
while (my $c=readdir(DHUP)) {

    next if ($c=~/^\./);
    next if ($c=~/^[A-Z]/);
    next if ($c=~/^distfiles/);

    opendir(DHUPC,"$UP/$c");
    while (my $p=readdir(DHUPC)) {
	next if ($p=~/^\./);
	next if ($p=~/^Makefile/);

	if (!-f "$UP/$c/$p/distinfo") {
	    print "$c/$p - No distinfo found\n" if ($verbose);
	    next;
	}
	open(FIN,"$UP/$c/$p/distinfo");
	my @lines=<FIN>;
	chomp(@lines);
	close(FIN);

	my %MD5=();
	my %SHA256=();
	my %SIZE=();

	foreach my $line (@lines) {
	    if ($line=~/^MD5 \((.+?)\) = (.+?)$/) {
		if (defined $MD5{$1}) {
		    print "$c/$p - Duplicate MD5 for $1\n";
		    $errors++;
		}
		$MD5{$1}=$2;
	    }
	    if ($line=~/^SHA256 \((.+?)\) = (.+?)$/) {
		if (defined $SHA256{$1}) {
		    print "$c/$p - Duplicate SHA256 for $1\n";
		    $errors++;
		}
		$SHA256{$1}=$2;
	    }
	    if ($line=~/^SIZE \((.+?)\) = (.+?)$/) {
		if (defined $SIZE{$1}) {
		    print "$c/$p - Duplicate SIZE for $1\n";
		    $errors++;
		}
		$SIZE{$1}=$2;
	    }
	}

	foreach my $f (sort(keys(%MD5))) {
	    if (!defined ($SHA256{$f})) {
		print "$c/$p - Missing SHA256 for $f\n";
		$SHA256{$f}="missing";
		$errors++;
	    }
	    if ($MD5{$f} ne "IGNORE") {
		if (!defined ($SIZE{$f})) {
		    print "$c/$p - Missing SIZE for $f\n";
		    $SIZE{$f}="missing";
		    $errors++;
		}
	    }
	    $checked++;
	}

	foreach my $f (sort(keys(%SHA256))) {
	    if (!defined ($MD5{$f})) {
		print "$c/$p - Missing MD5 for $f\n";
		$MD5{$f}="missing";
		$errors++;
	    }
	    if ($SHA256{$f} ne "IGNORE") {
		if (!defined ($SIZE{$f})) {
		    print "$c/$p - Missing SIZE for $f\n";
		    $SIZE{$f}="missing";
		    $errors++;
		}
	    }
	}

	foreach my $f (sort(keys(%SIZE))) {
	    if (!defined ($MD5{$f})) {
		print "$c/$p - Missing MD5 for $f\n";
		$MD5{$f}="missing";
		$errors++;
	    }
	    if (!defined ($SHA256{$f})) {
		print "$c/$p - Missing SHA256 for $f\n";
		$SHA256{$f}="missing";
		$errors++;
	    }
	}


    }
    closedir(DHUPC);
}
closedir(DHUP);

print "Errors: $errors\nChecked: $checked\n";