This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Typos, POD errors, etc.
[perl5.git] / t / porting / manifest.t
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 manifest
23 #
24 # which will output "WARNING: re-sorting MANIFEST" but which will also
25 # correct the problem.
26
27 use Config;
28 BEGIN {
29     @INC = '..' if -f '../TestInit.pm';
30 }
31 use TestInit qw(T); # T is chdir to the top level
32
33 require 't/test.pl';
34
35 skip_all("Cross-compiling, the entire source might not be available")
36     if $Config{usecrosscompile};
37
38
39 plan('no_plan');
40
41 my $manifest = 'MANIFEST';
42
43 open my $m, '<', $manifest or die "Can't open '$manifest': $!";
44 my @files;
45 # Test that MANIFEST uses tabs - not spaces - after the name of the file.
46 while (<$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");
64     } elsif ($separator =~ tr/\t//) {
65         fail("Mixed tabs and spaces in entry for $file");
66     } else {
67         fail("Odd whitespace in entry for $file");
68     }
69 }
70
71 close $m or die $!;
72
73 # Test that MANIFEST is properly sorted
74 SKIP: {
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
86 SKIP: {
87     find_git_or_skip(6);
88     chomp(my @repo= grep { !/\.gitignore$/ } `git ls-files`);
89     skip("git ls-files didnt work",3)
90         if !@repo;
91     is( 0+@repo, 0+@files, "git ls-files gives the same number of files as MANIFEST lists");
92     my %repo;
93     ++$repo{$_} for @repo;
94     my %mani;
95     ++$mani{$_} for @files;
96     is( 0+keys %mani, 0+@files, "no duplicate files in MANIFEST")
97       or diag(join("\n  ", "Duplicates:",grep $mani{$_} > 1, keys %mani));
98     delete $mani{$_} for @repo;
99     delete $repo{$_} for @files;
100     my @not_in_mani= keys %repo;
101     my @still_in_mani= keys %mani;
102
103     is( 0+@not_in_mani, 0, "Nothing added to the repo that isn't in MANIFEST");
104     is( "not in MANIFEST: @not_in_mani", "not in MANIFEST: ",
105         "Nothing added to the repo that isn't in MANIFEST");
106     is( 0+@still_in_mani, 0, "Nothing in the MANIFEST that isn't tracked by git");
107     is( "should not be in MANIFEST: @still_in_mani", "should not be in MANIFEST: ",
108         "Nothing in the MANIFEST that isn't tracked by git");
109
110 }
111
112 # EOF