diff options
author | Norbert Preining <preining@logic.at> | 2007-12-27 11:33:46 +0000 |
---|---|---|
committer | Norbert Preining <preining@logic.at> | 2007-12-27 11:33:46 +0000 |
commit | cc66a70788e2ffe5b72298345ec3fa0ff2eaa53b (patch) | |
tree | 59155582b406101c70420b2184b26be11a111dec /Master/tlpkg | |
parent | 8322c99a6cf060c963dd390638034c8d480a537b (diff) |
add check-execute-consistency, add $tlpdb->find_file and $tlpobj->contains_file
git-svn-id: svn://tug.org/texlive/trunk@5953 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/tlpkg')
-rw-r--r-- | Master/tlpkg/TeXLive/TLPDB.pm | 22 | ||||
-rw-r--r-- | Master/tlpkg/TeXLive/TLPOBJ.pm | 17 | ||||
-rwxr-xr-x | Master/tlpkg/bin/check-execute-consistency | 147 |
3 files changed, 186 insertions, 0 deletions
diff --git a/Master/tlpkg/TeXLive/TLPDB.pm b/Master/tlpkg/TeXLive/TLPDB.pm index b289ca87df3..007dc3477d3 100644 --- a/Master/tlpkg/TeXLive/TLPDB.pm +++ b/Master/tlpkg/TeXLive/TLPDB.pm @@ -30,6 +30,7 @@ C<TeXLive::TLPDB> -- A database of TeX Live Packages $tlpdb->add_tlpobj($tlpobj); $tlpdb->get_package("packagename"); $tlpdb->list_packages; + $tlpdb->find_file("filename"); $tlpdb->collections; $tlpdb->schemes; $tlpdb->updmap_cfg_lines; @@ -307,6 +308,27 @@ sub list_packages { =pod +=item C<< $tlpdb->find_file("filename") >> + +The C<find_file> returns a list of packages:filename +containing a file named C<filename>. + +=cut + +sub find_file { + my ($self,$fn) = @_; + my @ret; + foreach my $pkg ($self->list_packages) { + my @foo = $self->get_package($pkg)->contains_file($fn); + foreach my $f ($self->get_package($pkg)->contains_file($fn)) { + push @ret, "$pkg:$f"; + } + } + return(@ret); +} + +=pod + =item C<< $tlpdb->collections >> The C<collections> function returns the list of all collections. diff --git a/Master/tlpkg/TeXLive/TLPOBJ.pm b/Master/tlpkg/TeXLive/TLPOBJ.pm index 0d2fdea3af1..fc6f6f5edb4 100644 --- a/Master/tlpkg/TeXLive/TLPOBJ.pm +++ b/Master/tlpkg/TeXLive/TLPOBJ.pm @@ -764,6 +764,17 @@ sub remove_files { $self->{"${type}files"} = [ @finalfiles ]; } +sub contains_file { + my ($self,$fn) = @_; + # if the filename already contains a / do not add it at the beginning + my $ret = ""; + if ($fn =~ m!/!) { + return(grep(m!$fn$!, $self->all_files)); + } else { + return(grep(m!/$fn$!,$self->all_files)); + } +} + sub all_files { my ($self) = shift; my @ret = (); @@ -1222,6 +1233,12 @@ adds or removes files from the list of C<binfiles> for the given architecture. adds or removes files for the given type (only for C<run>, C<src>, C<doc>). +=item C<contains_file($filename)> + +returns the list of files matching $filename which are contained in +the package. If $filename contains a / the matching is only anchored +at the end with $. Otherwise it is prefix with a / and anchored at the end. + =item C<all_files> returns a list of all files of all types. diff --git a/Master/tlpkg/bin/check-execute-consistency b/Master/tlpkg/bin/check-execute-consistency new file mode 100755 index 00000000000..514a157f359 --- /dev/null +++ b/Master/tlpkg/bin/check-execute-consistency @@ -0,0 +1,147 @@ +#!/usr/bin/env perl +# $Id: check-execute-consistency 0 2007-10-14 20:32:44Z karl $ +# Copyright 2007 Norbert Preining +# This file is licensed under the GNU General Public License version 2 +# or any later version. +# +# Check that files needed for execute statements are present + +BEGIN { + $^W = 1; + ($mydir = $0) =~ s,/[^/]*$,,; + unshift (@INC, "$mydir/.."); +} + +our $mydir; + +use strict; + +use TeXLive::TLConfig; +use TeXLive::TLPOBJ; +use TeXLive::TLPDB; +use Getopt::Long; +use Pod::Usage; +use File::Path; + +my $help = 0; + +GetOptions("help|?" => \$help) or pod2usage(1); +pod2usage(-exitstatus => 0, -verbose => 2) if $help; + +exit (&main ()); + +sub main +{ + # get the db. + chomp (my $Master = `cd $mydir/../.. && pwd`); # xx TLPDB should default + my $tlpdb = TeXLive::TLPDB->new ("root" => "$Master"); + die("Cannot find tlpdb in $Master!\n") unless defined($tlpdb); + my (%maps,%langcodes,%fmtcodes); + for my $pkg ($tlpdb->list_packages) { + for my $e ($tlpdb->get_package($pkg)->executes) { + if ($e =~ m/add(Mixed)?Map\s+(.*)$/) { + my $foo = $2; + chomp($foo); + push @{$maps{$foo}}, $pkg; + } elsif ($e =~ m/BuildFormat\s+(.*)$/) { + my $foo = $1; + chomp($foo); + push @{$fmtcodes{$foo}}, $pkg; + } elsif ($e =~ m/BuildLanguageDat\s+(.*)$/) { + my $foo = $1; + chomp($foo); + push @{$langcodes{$foo}}, $pkg; + } else { + warn "$pkg: unmatched execute: $e\n"; + } + } + } + my %badmaps; + foreach my $mf (keys %maps) { + my @found = $tlpdb->find_file($mf); + if ($#found < 0) { + $badmaps{$mf} = $maps{$mf}; + } + if ($#found > 0) { + # we want to check for multiple inclusions + my %mapfn; + foreach my $foo (@found) { + $foo =~ m/^(.*):(.*)$/; + push @{$mapfn{$2}}, $1; + } + foreach my $k (keys %mapfn) { + my @bla = @{$mapfn{$k}}; + if ($#bla > 0) { + warn "map file $mf occurs multiple times (in pkg @bla)!\n"; + } + } + } + } + if (keys %badmaps) { + print "mentioned map file not occuring in any package:\n"; + foreach my $mf (keys %badmaps) { + print "\t$mf (execute in @{$badmaps{$mf}})\n"; + } + } + my %badlangcodes; + foreach my $lc (keys %langcodes) { + my @found = $tlpdb->find_file("texmf/tex/generic/config/language.$lc.dat"); + if ($#found < 0) { + $badlangcodes{$lc} = $langcodes{$lc}; + } + } + if (keys %badlangcodes) { + print "mentioned lang codes without language.XXX.dat:\n"; + foreach my $mf (keys %badlangcodes) { + print "\t$mf (execute in @{$badlangcodes{$mf}})\n"; + } + } + my %badfmtcodes; + foreach my $lc (keys %fmtcodes) { + my @found = $tlpdb->find_file("texmf/fmtutil/format.$lc.cnf"); + if ($#found < 0) { + $badfmtcodes{$lc} = $fmtcodes{$lc}; + } + } + if (keys %badfmtcodes) { + print "mentioned fmt codes without fmtutil.XXX.cnf:\n"; + foreach my $mf (keys %badfmtcodes) { + print "\t$mf (execute in @{$badfmtcodes{$mf}})\n"; + } + } +} + + + +__END__ + +=head1 NAME + +check-depend-consistency - check that all depends actually exist as packages + +=head1 SYNOPSIS + +check-depend-consistency + +=head1 OPTIONS + +There are no options bug C<-help>. + +=head1 DESCRIPTION + +See above + +=head1 AUTHORS AND COPYRIGHT + +This script and its documentation were written for the TeX Live +distribution (L<http://tug.org/texlive>) 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: # |