Replace Jarkko's manicheck utility with my own
Rafael Garcia-Suarez [Sat, 20 Dec 2008 22:28:17 +0000 (23:28 +0100)]
My manicheck is more crude, but I find its output more readable,
and more importantly it handles git-related files and directories.
Options can be re-added later.

Porting/manicheck

index 251c7ee..0439292 100644 (file)
@@ -1,86 +1,23 @@
-#!/usr/bin/perl -ws
-
-#
-# manicheck - check files against the MANIFEST
-#
-# Without options prints out (possibly) two lines:
-#
-# extra: a b c
-# missing: d
-#
-# With option -x prints out only the missing files (and without the "extra: ")
-# With option -m prints out only the extra files (and without the "missing: ")
-#
-
-BEGIN {
-  $SIG{__WARN__} = sub {
-    help() if $_[0] =~ /"main::\w" used only once: possible typo at /;
-  };
-}
+#!/usr/bin/perl
 
 use strict;
-
-sub help {
-  die <<EOF;
-$0: Usage: $0 [-x|-m|-l|-h]
--x show only the extra files
--m show only the missing files
--l show the files one per line instead of one line
--h show only this help
-EOF
-}
-
-use vars qw($x $m $l $h);
-
-help() if $h;
-
-open(MANIFEST, "MANIFEST") or die "MANIFEST: $!";
-
-my %mani;
-my %mand = qw(. 1);
-use File::Basename qw(dirname);
-
-while (<MANIFEST>) {
-  if (/^(\S+)\t+(.+)$/) {
-    $mani{$1}++;
-    my $d = dirname($1);
-    while($d ne '.') {
-       $mand{$d}++;
-       $d = dirname($d);
-    }
-  } else {
-    warn "MANIFEST:$.:$_";
-  }
-}
-
-close(MANIFEST);
-
-my %find;
+use warnings;
 use File::Find;
-find(sub {
-       my $n = $File::Find::name;
-       $n =~ s:^\./::;
-       $find{$n}++;
-     }, '.' );
-
-my @xtra;
-my @miss;
-
-for (sort keys %find) {
-  push @xtra, $_ unless $mani{$_} || $mand{$_};
-}
 
-for (sort keys %mani) {
-  push @miss, $_ unless $find{$_};
+open my $fh, 'MANIFEST' or die "Can't read MANIFEST: $!\n";
+my @files = map { (split)[0] } <$fh>;
+close $fh;
+for (@files) {
+    print "$_ from MANIFEST doesn't exist\n" if ! -f;
 }
-
-$" = "\n" if $l;
-
-unshift @xtra, "extra:"   if @xtra && !$x;
-unshift @miss, "missing:" if @miss && !$m;
-
-print "@xtra\n", if @xtra && !$m;
-print "@miss\n"  if @miss && !$x;
-
-exit 0;
+my %files = map { $_ => 1 } @files;
+find {
+    wanted => sub {
+        my $x = $File::Find::name; $x =~ s/^..//;
+        return if -d;
+       return if $_ eq '.gitignore';
+       return if $x =~ /^\.git\b/;
+        print "$File::Find::name not in MANIFEST\n" if !$files{$x};
+    },
+}, ".";