#!/usr/bin/env perl # $Id: check-file-coverage 5846 2007-12-23 21:38:57Z preining $ # Copyright 2007, 2008 Norbert Preining # This file is licensed under the GNU General Public License version 2 # or any later version. # # check the file coverage of a TLTREE wrt to a texlive.tlpdb BEGIN { $^W = 1; chomp ($mydir = `dirname $0`); unshift (@INC, "$mydir/.."); } use strict; use TeXLive::TLConfig; use TeXLive::TLPSRC; use TeXLive::TLPOBJ; use TeXLive::TLPDB; use TeXLive::TLTREE; use TeXLive::TLUtils qw(dirname info debug); use Getopt::Long; use Pod::Usage; use File::Path; my @IgnorePatterns = qw! .mkisofsrc$ autorun.inf$ config.guess$ support/ source/ setuptl/ texmf-dist/README$ texmf-doc/README$ texmf/README$ texmf-dist/ls-R$ texmf/ls-R$ texmf/lists/ tlpkg/tlpsrc/ tlpkg/bin tlpkg/lib/ tlpkg/tests/ tlpkg/etc/ tlpkg/texlive.tlpdb !; TeXLive::TLUtils::process_logging_options(); chomp (my $opt_master = `cd $::mydir/../.. && pwd`); my $help = 0; GetOptions( "master=s" => \$opt_master, # location of the TL tree "help|?" => \$help) or pod2usage(1); pod2usage(-exitstatus => 0, -verbose => 2) if $help; exit (&main ()); sub main { if (! -d $opt_master) { die "$0: Master $opt_master not a directory, goodbye.\n"; } # checking for duplicates my $pack = ""; open (TLPDB,"<$opt_master/tlpkg/texlive.tlpdb") or die "Cannot open $opt_master/tlpkg/texlive.tlpdb for reading: $!\n"; my %filetopacks; while () { # ignore files mentioned in 00texlive.installer next if ($pack eq "00texlive.installer"); next if m/^\s*#/; next if m/^\s*$/; next if m/^((bin|run|doc|src)files|depend|execute|category|revision|shortdesc|longdesc|catalogue)/; if (m/^name\s+(\S+)\s*$/) { $pack = "$1"; next; } if (m/^ ([^\s]+)\s+/) { push @{$filetopacks{$1}}, $pack; next; } print "NOT HANDLED $_"; } my $found_multiple = 0; foreach (keys %filetopacks) { my @foo = @{$filetopacks{$_}}; if ($#foo < 0) { warn "that shouldn't happen: $_\n"; } elsif ($#foo > 0) { print "$0: MULTIPLE INCLUDED FILES:\n" if $found_multiple++ == 0; print " $_ (@foo)\n"; } } debug("reading Master tree $opt_master, patience...\n"); my $tltree = TeXLive::TLTREE->new( "svnroot" => $opt_master ); $tltree->init_from_svn; my %tltreefiles = %{$tltree->{'_allfiles'}}; my @tlpdbfiles = `grep '^ ' $opt_master/tlpkg/texlive.tlpdb | awk '{print\$1}'`; chomp(@tlpdbfiles); my %tlpdbf; for my $f (@tlpdbfiles) { $tlpdbf{$f} = 1; } my @nothit; for my $f (keys %tltreefiles) { # if it is mentioned in the tlpdb or is ignored it is considered # as covered, thus, otherwise we push it onto the nothit list if (!defined($tlpdbf{$f})) { my $ignored = 0; foreach my $p (@IgnorePatterns) { if ($f =~ m/^$p/) { $ignored = 1; last; } } if (!$ignored) { push @nothit, $f; } } } if (@nothit) { print "$0: NOT COVERED FILES:\n"; for my $f (sort @nothit) { print "\t$f\n"; } } return 0; } __END__ =head1 NAME check-file-coverage - check file coverage TLTREE vs. texlive.tlpdb =head1 SYNOPSIS check-file-coverage [OPTION]... =head1 OPTIONS =over 8 =item B<-master> I The location given by B<-master> must point to a valid svn repository of TeX Live's Master direcory. Defaults to C<../..> of C<$0>. =back The standard options C<-help> and C<-debug> are also accepted. See the tlpfiles documentation for details. =head1 DESCRIPTION Consistency check of the files in the master tree with the TeX Live database. Report on files that are included in more than one package, and on files that are present in the tree but not in any package. =head1 AUTHORS AND COPYRIGHT This script and its documentation were written for the TeX Live distribution (L) and both are licensed under the GNU General Public License Version 2 or later. =cut ### Local Variables: ### perl-indent-level: 2 ### tab-width: 2 ### indent-tabs-mode: nil ### End: # vim:set tabstop=2 expandtab: #