summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2007-12-27 11:33:46 +0000
committerNorbert Preining <preining@logic.at>2007-12-27 11:33:46 +0000
commitcc66a70788e2ffe5b72298345ec3fa0ff2eaa53b (patch)
tree59155582b406101c70420b2184b26be11a111dec
parent8322c99a6cf060c963dd390638034c8d480a537b (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
-rw-r--r--Master/tlpkg/TeXLive/TLPDB.pm22
-rw-r--r--Master/tlpkg/TeXLive/TLPOBJ.pm17
-rwxr-xr-xMaster/tlpkg/bin/check-execute-consistency147
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: #