xref: /openbsd/gnu/usr.bin/perl/t/porting/manifest.t (revision 09467b48)
1#!./perl -w
2
3# What does this test?
4# This tests the well-formed-ness of the MANIFEST file.
5#
6# Why do we test this?
7# TK
8#
9# It's broken - how do I fix it?
10# If MANIFEST is not sorted properly, you will get this error output:
11#      got ''MANIFEST' is NOT sorted properly
12#      # '
13#      # expected /(?^:is sorted properly)/
14#
15# To correct this, run either:
16#
17#   ./perl -Ilib Porting/manisort -o MANIFEST MANIFEST
18#
19# which will output "'MANIFEST' is NOT sorted properly" but which will
20# correct the problem; or:
21#
22#   make manisort
23#
24# which will output "WARNING: re-sorting MANIFEST" but which will also
25# correct the problem.
26
27use Config;
28BEGIN {
29    @INC = '..' if -f '../TestInit.pm';
30}
31use TestInit qw(T); # T is chdir to the top level
32
33require './t/test.pl';
34
35skip_all("Cross-compiling, the entire source might not be available")
36    if $Config{usecrosscompile};
37
38
39plan('no_plan');
40
41my $manifest = 'MANIFEST';
42
43open my $m, '<', $manifest or die "Can't open '$manifest': $!";
44my @files;
45# Test that MANIFEST uses tabs - not spaces - after the name of the file.
46while (<$m>) {
47    chomp;
48    unless( /\s/ ) {
49        push @files, $_;
50        # no need for further tests on lines without whitespace (i.e., filename only)
51        next;
52    }
53    my ($file, $separator) = /^(\S+)(\s+)/;
54    push @files, $file;
55
56    isnt($file, undef, "Line $. doesn't start with a blank") or next;
57    ok(-f $file, "File $file exists");
58    if ($separator !~ tr/\t//c) {
59	# It's all tabs
60	next;
61    } elsif ($separator !~ tr/ //c) {
62	# It's all spaces
63	fail("Spaces in entry for $file in MANIFEST at line $.");
64    } elsif ($separator =~ tr/\t//) {
65	fail("Mixed tabs and spaces in entry for $file in MANIFEST at line $.");
66    } else {
67	fail("Odd whitespace in entry for $file in MANIFEST at line $.");
68    }
69}
70
71close $m or die $!;
72
73# Test that MANIFEST is properly sorted
74SKIP: {
75    skip("Sorting order is different under EBCDIC", 1) if $::IS_EBCDIC || $::IS_EBCDIC;
76    skip("'Porting/manisort' not found", 1) if (! -f 'Porting/manisort');
77
78    my $result = runperl('progfile' => 'Porting/manisort',
79                         'args'     => [ '-c', $manifest ],
80                         'stderr'   => 1,
81                         'nolib'    => 1 );
82
83    like($result, qr/is sorted properly/, 'MANIFEST sorted properly');
84}
85
86SKIP: {
87    find_git_or_skip(6);
88    my %seen; # De-dup ls-files output (can appear more than once)
89    chomp(my @repo= grep {
90        !m{\.gitignore$} &&
91        !$seen{$_}++
92        } `git ls-files`);
93    skip("git ls-files didnt work",3)
94        if !@repo;
95    is( 0+@repo, 0+@files, "git ls-files gives the same number of files as MANIFEST lists");
96    my %repo;
97    ++$repo{$_} for @repo;
98    my %mani;
99    ++$mani{$_} for @files;
100    is( 0+keys %mani, 0+@files, "no duplicate files in MANIFEST")
101      or diag(join("\n  ", "Duplicates:",grep $mani{$_} > 1, keys %mani));
102    delete $mani{$_} for @repo;
103    delete $repo{$_} for @files;
104    my @not_in_mani= keys %repo;
105    my @still_in_mani= keys %mani;
106
107    is( 0+@not_in_mani, 0, "Nothing added to the repo that isn't in MANIFEST");
108    is( "not in MANIFEST: @not_in_mani", "not in MANIFEST: ",
109        "Nothing added to the repo that isn't in MANIFEST");
110    is( 0+@still_in_mani, 0, "Nothing in the MANIFEST that isn't tracked by git");
111    is( "should not be in MANIFEST: @still_in_mani", "should not be in MANIFEST: ",
112        "Nothing in the MANIFEST that isn't tracked by git");
113
114}
115
116# EOF
117