#!/usr/bin/perl use warnings; use strict; # Check that the 'MANIFEST' and 'MANIFEST.SKIP' files are valid, and that # they match the files which really exist, printing warnings if any files # appear to be missing from the manifest. use File::Find qw( find ); # Read MANIFEST my %manifest; { open my $fh, '<', 'MANIFEST' or die "$0: error opening 'MANIFEST': $!\n"; while (<$fh>) { next unless /\S/; chomp or warn "MANIFEST:$.: missing newline\n"; s/\s.*//; next if $_ eq 'SIGNATURE'; # doesn't exist until the dist is made if (-d $_) { warn "MANIFEST:$.: file '$_' is a directory\n"; } elsif (!-f $_) { warn "MANIFEST:$.: file '$_' is missing\n"; } else { warn "MANIFEST:$.: file '$_' listed a second time\n" if exists $manifest{$_}; $manifest{$_} = 1; } } } # Read MANIFEST.SKIP my @skip; { open my $fh, '<', 'MANIFEST.SKIP' or die "$0: error opening 'MANIFEST.SKIP': $!\n"; while (<$fh>) { next unless /\S/; next if /^\s*#/; chomp or warn "MANIFEST.SKIP:$.: missing newline\n"; push @skip, qr/$_/; } } # Check the files which exist, looking for ones which aren't listed. my @missing; find({ wanted => \&_wanted, no_chdir => 1 }, '.'); if (@missing) { print STDERR "Files missing from MANIFEST:\n"; for (@missing) { print STDERR "$_\n"; } } sub _wanted { s/^\.\///; return if -d; my $file = $_; for (@skip) { return if $file =~ /$_/; } push @missing, $file unless $manifest{$file}; } # vi:ts=4 sw=4 expandtab