#!/usr/bin/env perl # $Id: check-depend-consistency 0 2007-10-14 20:32:44Z karl $ # Copyright 2007, 2008 Norbert Preining # This file is licensed under the GNU General Public License version 2 # or any later version. # # Check that all packages are contained in at least one collection, and # that all depend statements refer to an existing package. BEGIN { $^W = 1; ($mydir = $0) =~ s,/[^/]*$,,; unshift (@INC, "$mydir/.."); } our $mydir; use strict; use Getopt::Long; use Pod::Usage; use File::Path; use TeXLive::TLConfig; use TeXLive::TLUtils; use TeXLive::TLPOBJ; use TeXLive::TLPDB; my $help = 0; TeXLive::TLUtils::process_logging_options(); GetOptions("help|?" => \$help) or pod2usage(1); pod2usage("-exitstatus" => 0, "-verbose" => 2) if $help; exit (&main ()); sub main { my $ret = 0; # get the db. chomp (my $Master = `cd $mydir/../.. && pwd`); my $tlpdb = TeXLive::TLPDB->new("root" => $Master); die "$0: Cannot find tlpdb in $Master.\n" unless defined($tlpdb); my %presentpkg; for my $pkg ($tlpdb->list_packages) { $presentpkg{$pkg} = 1; } # list of collections. my @colls = $tlpdb->collections; my @coll_deps = $tlpdb->expand_dependencies("-no-collections",$tlpdb,@colls); my %coll_deps; @coll_deps{@coll_deps} = (); # initialize hash with keys from list my (%wrong_dep, @no_dep); for my $pkg ($tlpdb->list_packages) { # do not check any package starting with 00texlive. next if $pkg =~ m/^00texlive/; # For each package, check that it is a dependency of some collection. # Whatever is left in %coll_deps after this loop will be the problem if (! exists $coll_deps{$pkg}) { # Except that schemes and our special .win32 packages are ok. push (@no_dep, $pkg) unless $pkg =~/^scheme-|\.win32$/; } # For each dependency, check that we have a package. for my $d ($tlpdb->get_package($pkg)->depends) { next if ($d =~ m/\.ARCH$/); if (!defined($presentpkg{$d})) { push (@{$wrong_dep{$d}}, $pkg); } } } if (keys %wrong_dep) { $ret++; print "DEPENDS WITHOUT PACKAGES:\n"; for my $d (keys %wrong_dep) { print "$d occurring in ", @{$wrong_dep{$d}}, "\n"; } } if (@no_dep) { $ret++; print "PACKAGES NOT IN ANY COLLECTION: @no_dep\n"; } return $ret; } __END__ =head1 NAME check-depend-consistency - check that all dependencies exist as packages =head1 SYNOPSIS check-depend-consistency [OPTION]... =head1 OPTIONS Only the standard options B<-help> and B<-q>, B<-v>, and B<-logfile>=I are accepted; see the C function in L for details. =head1 DESCRIPTION Check that all C statements in all TeX Live packages (collections, schemes, and normal packages) refer to existing packages. Also check that every package is a dependency of at least one collection. These checks are made according to the tlpdb that is within the hierarchy from which this script is invoked; the actual file tree is not inspected. =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: #