The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

#!/usr/bin/perl
# output a list of:
# a) files listed in MANIFEST which don't exist
# b) files which exist but which aren't in MANIFEST
use v5.14;
use constant SKIP => 125;
my $exitstatus;
GetOptions('exitstatus!', \$exitstatus)
or die "$0 [--exitstatus]";
my %files;
my $missing = 0;
my $bonus = 0;
open my $fh, '<', 'MANIFEST' or die "Can't read MANIFEST: $!\n";
for my $line (<$fh>) {
my ($file) = $line =~ /^(\S+)/;
++$files{$file};
next if -f $file;
++$missing;
print "$file from MANIFEST doesn't exist\n";
}
close $fh;
find {
wanted => sub {
return if -d;
return if $_ eq '.mailmap';
return if $_ eq '.gitignore';
return if $_ eq '.gitattributes';
return if $_ eq '.git_patch';
my $x = $File::Find::name =~ s!^\./!!r;
return if $x =~ /^\.git\b/;
return if $x =~ m{^\.github/};
return if $files{$x};
++$bonus;
print "$x\t\tnot in MANIFEST\n";
},
}, ".";
my $exitcode = $exitstatus ? $missing + $bonus : 0;
# We can't (meaningfully) exit with codes above 255, so we're going to have to
# clamp them to some range whatever we do. So as we need the code anyway, use
# 124 as our maximum instead, and then we can run as a useful git bisect run
# script if needed...
$exitcode = SKIP - 1
if $exitcode > SKIP;
exit $exitcode;