summaryrefslogtreecommitdiff
path: root/Master/tlpkg/bin/check-depend-consistency
blob: 0c75e4ef5bd5d5bab4ebdfd91e1ee289452317d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env perl
# $Id$
# Copyright 2007, 2008, 2009 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<file> are accepted; see the C<process_logging_options>
function in L<TeXLive::TLUtils> for details.

=head1 DESCRIPTION

Check that all C<depend> 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<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: #