summaryrefslogtreecommitdiff
path: root/Master/tlpkg/bin/tl-check-files-by-format
blob: 1e83a3bf582d3c8c7c4a90d2d71f21380f2ec27b (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#!/usr/bin/env perl
# $Id$
#
# Check that files in various formats are in good shape.
#
# The following formats are checked currenly: pdf, pfb.
#
# For each format, there is one routine &check_<format> and an exclusion 'list'
# (hash reference) $exclude_<format>: the keys are either a directory name if
# they have a trailing slash, or a file name. If a key named '*base*' is
# present, then the paths are relative to this base, otherwise to $tlroot. The
# values of the keys may be free or have a special meaning depending on the
# associated check_<format> routine.
#
# Formats that might be added:
# - tfm with tftopl $file /tmp/dummy.pl (no exit code, check stderr)
# - vf with vftovp $file vf_to_tfm($file) /tmp/dummy.vpl (stderr)
# - afm with (afm2pl?)
# - otf with otfinfo -i -q >/dev/null
#
# Manuel Pégourié-Gonnard, 2010. WTFPL v2.

use warnings;
use File::Basename;
use File::Temp;

BEGIN {
  my $mydir = dirname($0);
  $tlroot = "$mydir/../..";
  unshift (@INC, "$tlroot/tlpkg");
}

use TeXLive::TLPDB;

# 1 means pdfinfo issues errors but still exits successfully
# 2 means pdfinfo exits non-zero
my $exclude_pdf = {
  'texmf-dist/doc/latex/dvdcoll/dcexample.pdf' => 1,  # [1]
  'texmf-dist/doc/latex/etextools/etextools.pdf' => 1,# [1]
  'texmf/dvips/tetex/config.pdf' => 2, # not a PDF file actually
};
# [1] may be a false positive, mpg asked pdftex@ on 2010-03-01

# the value has no meaning here
my $exclude_pfb = { '*base*' => 'texmf-dist/fonts/type1',
  'adobe/courier/' => 1,
  'arabi/arabeyes/' => 1,
  'arabi/farsiweb/' => 1,
  'arkandis/libris/' => 1,
  'arkandis/venturis/' => 1,
  'arphic/bkaiu/' => 1,
  'arphic/bsmiu/' => 1,
  'arphic/gbsnu/' => 1,
  'arphic/gkaiu/' => 1,
  'hoekwater/stmaryrd/' => 1,
  'public/allrunes/' => 1,
  'public/amsfonts/cm/' => 1,
  'public/amsfonts/cmextra/' => 1,
  'public/arev/' => 1,
  'public/ascii/' => 1,
  'public/augie/' => 1,
  'public/aurical/' => 1,
  'public/belleek/' => 1,
  'public/bera/' => 1,
  'public/brushscr/' => 1,
  'public/burmese/' => 1,
  'public/carolmin-ps/' => 1,
  'public/chemarrow/' => 1,
  'public/cjhebrew/' => 1,
  'public/cmcyr/' => 1,
  'public/cm-super/' => 1,
  'public/cs/' => 1,
  'public/doublestroke/' => 1,
  'public/epiolmec/' => 1,
  'public/ethiop-t1/' => 1,
  'public/eurosym/' => 1,
  'public/foekfont/' => 1,
  'public/fonetika/' => 1,
  'public/fourier/' => 1,
  'public/gfsartemisia/' => 1,
  'public/gfsbaskerville/' => 1,
  'public/gfsbodoni/' => 1,
  'public/gfscomplutum/' => 1,
  'public/gfsdidot/' => 1,
  'public/gfsneohellenic/' => 1,
  'public/gfssolomos/' => 1,
  'public/initials/' => 1,
  'public/itrans/' => 1,
  'public/iwona/' => 1,
  'public/kerkis/' => 1,
  'public/kpfonts/' => 1,
  'public/kurier/' => 1,
  'public/libertine/' => 1,
  'public/linearA/' => 1,
  'public/lm/' => 1,
  'public/lxfonts/' => 1,
  'public/marvosym/' => 1,
  'public/mathpazo/' => 1,
  'public/musixtex/' => 1,
  'public/ocherokee/' => 1,
  'public/oinuit/' => 1,
  'public/omega/' => 1,
  'public/phaistos/' => 1,
  'public/pl/' => 1,
  'public/pxfonts/' => 1,
  'public/rsfs/' => 1,
  'public/staves/' => 1,
  'public/tabvar/' => 1,
  'public/tex-gyre/' => 1,
  'public/txfonts/' => 1,
  'public/txfontsb/' => 1,
  'public/wasy/' => 1,
  'public/xypic/' => 1,
  'public/yhmath/' => 1,
  'uhc/umj/' => 1,
  'urw/avantgar/' => 1,
  'urw/bookman/' => 1,
  'urw/courier/' => 1,
  'urw/helvetic/' => 1,
  'urw/ncntrsbk/' => 1,
  'urw/palatino/' => 1,
  'urw/symbol/' => 1,
  'urw/times/' => 1,
  'urw/zapfding/' => 1,
  'vntex/arevvn/' => 1,
  'vntex/comicsansvn/' => 1,
  'vntex/txttvn/' => 1,
  'vntex/urwvn/' => 1,
  'vntex/vnr/' => 1,
  'wadalab/dgj/' => 1,
  'wadalab/dmj/' => 1,
  'wadalab/mcj/' => 1,
  'wadalab/mrj/' => 1,
};
# mpg: are these files actually broken?? Should look for the actual errors an
# check with a font expert which are dummy, then filter them out.
# For remaining packages, we'll have to contact upstream authors.

my $tmpdir = File::Temp::tempdir(CLEANUP => 1);

exit(main());

sub main
{
  my @files = get_file_list();
  for my $file (grep { /\.pdf$/ } @files) {
    check_pdf($file);
  }
  for my $file (grep { /\.pfb$/ } @files) {
    check_pfb($file);
  }
  return 0;
}

# get the list of files in the database of a TL installation
sub get_file_list
{
  my $tlpdb = TeXLive::TLPDB->new(root => $tlroot);
  my @files;
  for my $tlpname ($tlpdb->list_packages) {
    my $tlp = $tlpdb->get_package($tlpname);
    push(@files, $tlp->docfiles, $tlp->runfiles, $tlp->srcfiles);
  }
  return @files;
}

# return the value in exclude list associated to a file, or undef
sub exclude_value
{
  my ($exclude, $file) = @_;
  my $base = $exclude->{'*base*'};
  $file =~ s!$base/!! if $base;
  (my $filedir = $file) =~ s![^/]*$!!;
  return $exclude->{$file} || $exclude->{$filedir};
}

# check a pdf file
sub check_pdf
{
  my ($file) = @_;
  my $errfile = "$tmpdir/pdferr";
  unlink($errfile);
  my $bad_exit = system("pdfinfo $tlroot/$file >/dev/null 2>$errfile");
  my $badness = $bad_exit ? 2 : -s $errfile ? 1 : 0;
  my $limit = exclude_value($exclude_pdf, $file) || 0;
  return if $badness <= $limit;
  print "Broken PDF: $file\n" if $badness == 2;
  print "Damaged PDF: $file\n" if $badness == 1;
}

# check a pfb file
sub check_pfb
{
  my ($file) = @_;
  return if defined exclude_value($exclude_pfb, $file);
  my $errfile = "$tmpdir/pfberr";
  unlink($errfile);
  my $bad = system("t1lint -q $tlroot/$file");
  print "Broken PFB: $file\n" if $bad;
}


# vim: sw=2 expandtab