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
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
|
#!/usr/bin/env perl
# $Id$
# Public domain. Originally written 2005, Karl Berry.
# Check if a package in TL has any changes on CTAN.
BEGIN {
chomp ($mydir = `dirname $0`); # we are in Master/tlpkg/bin
unshift (@INC, "$mydir/..");
}
use TeXLive::TLConfig qw/$RelocPrefix $RelocTree/;
use TeXLive::TLPOBJ;
use TeXLive::TLPDB;
use File::Basename;
my $tlpdb;
my $Master;
our %OPT;
# these packages should be up to date:
my @TLP_working = qw(
12many
a0poster a2ping a4wide a5comb
aastex abbr abc abstract abstyles accfonts achemso
acmconf acmtrans acromake acronym
active-conf addlines adrconv adrlist advdate
ae aeguill afthesis
aguplus aiaa aichej AkkTeX akletter
alg algorithm2e algorithmicx algorithms alnumsec alterqcm
altfont ametsoc amsaddr amsfonts amslatex-primer amsldoc-it
amsmath amsrefs amsthdoc-it
animate anonchap antt answers ANUfinalexam anyfontsize anysize
apa apacite apalike apalike2 appendix apl apprends-latex
arabi arabtex arabxetex archaic arcs arev
armenian around-the-bend arphic arrayjob arsclassica
arydshln Asana-Math asaetr ascii assignment astro asyfig
asymptote-faq-zh-cn asymptote-by-example-zh-cn asymptote-manual-zh-cn
attachfile auncial-new aurical authoraftertitle authorindex
auto-pst-pdf autoarea automata
babel babelbib background bangtex barcodes barr
bbcard bbding bbm bbm-macros bbold bclogo
beamer beamer-FUBerlin beamer-tut-pt beamerposter
begriff bera betababel beton
bez123 bezos bgreek
bib-fr bibarts bibhtml
biblatex biblatex-chem biblatex-nature biblatex-science
bibleref biblist bibtopic
bibtopicprefix bibexport
bibunits bidi bigfoot bigints binomexp bizcard
blacklettert1 blindtext blkarray block blockdraw_mp blowup
boisik bold-extra
boites boldtensors bookest booklet booktabs boolexpr bophook bosisio
boxedminipage boxhandler bpchem
bracketkey braille braket breakcites breakurl
bullcntr bussproofs bytefield
cachepic calctab calligra calrsfs cancel
capt-of captcont captdef caption carlisle carolmin-ps cases casyl catechis
cbcoptic cbfonts
cc-pl ccaption ccfonts ccicons cclicenses
cd cd-cover cdpbundl
cell cellspace censor
changebar changelayout changepage changes chappg chapterfolder
chbibref chem-journal chemarrow chembst chemcompounds chemcono
chemstyle cherokee chess-problem-diagrams chessboard chessfss
chicago-annote chletter chngcntr circ circle circuitikz
cite citeref cjhebrew cjk cjkpunct cjw classicthesis
clefval cleveref
clock clrscode cm-super
cmap cmcyr cmdstring cmdtrack cmll cmpica codedoc codepage
collref colorinfo colorsep colortbl colorwav
combelow combine combinedgraphics comma commath comment compactbib
complexity comprehensive computational-complexity
concmath concmath-fonts confproc constants
context-account context-algorithmic context-bnf context-chromato
context-construction-plan context-degrade context-fixme
context-french context-games context-gnuplot
context-letter context-lettrine context-lilypond context-mathsets
context-notes-zh-cn context-ruby
context-simplefonts context-simpleslides
context-top-ten
context-typearea context-typescripts context-vim
cooking cookybooky cool coollist coolstr cooltooltips
coordsys courier-scaled courseoutline coursepaper coverpage
crop crossreference crossword crosswrd cryst csbulletin csquotes
csvtools ctable ctex ctex-faq
cursolatex cursor cuisine
currvita curve curve2e curves
custom-bib cv cweb-latex cyklop cyrillic
dancers dashbox dashrule dashundergaps datatool
dateiliste datetime dblfloatfix dcpic decimal dehyph-exptl
delimtxt diagmac2 dichokey digiconfigs din1505
dinat dingbat directory dirtree disser dk-bib dlfltxb
dnaseq doc-pictex docmfp docmute doi doipubmed
dot2texi dotarrow dotseqn dottex
doublestroke dox dozenal dpfloat dprogress drac draftcopy
draftwatermark dramatist dratex drv dtxgallery
dtxtut duerer-latex dvdcoll dviasm dviincl dvipdfmx-def
dvipsconfig dyntree
ean13isbn easy easylist
ebong ebsthesis eCards ecc ecclesiastic economic
ecv ed edmac edmargin ednotes eemeir eepic egameps
egplot eiad eiad-ltx eijkhout
elbioimp ellipsis elpres elsarticle elsevier elsevier-bib
eltex elvish
emptypage emulateapj emp encxvlna endfloat endheads endnotes
engpron engrec engtlc enumitem envbig environ envlab
epigrafica epigraph epiolmec eplain
epsdice epsf epsincl epslatex-fr epspdf epspdfconversion epstopdf
eqexam eqlist eqparbox errata es-tex-faq
ESIEEcv erdc esdiff esint esint-type1 eskd eskdx eso-pic esvect
estcpmm
etaremune etex-pkg ethiop ethiop-t1 etoolbox euenc eukdate
euler eulervm euproposal euro europecv eurosans eurosym
everypage exam examdesign examplep excludeonly exercise exp-testopt
expdlist expl3 expressg extarrows exteps
extpfeil extract extsizes
faktor fancybox fancyhdr fancynum fancyref fancytooltips fancyvrb
FAQ-en fbs featpost
feyn feynmf fge fig4latex figbas figflow
filecontents findhyph fink first-latex-doc
fix2col fixfoot fixme fixpdfmag
flabels flacards flagderiv flashmovie flippdf float floatrow
flowfram fltpage fltpoint
fmtcount
fn2end fnbreak fncychap fnpara
foekfont font-change fontch fontinst fontools
fontspec fonttable fontwrap
footbib footmisc footnpag forarray forloop formular
fouridx fourier fouriernc
fp fpl
fragmaster fragments framed frankenstein frcursive free-math-font-survey
frenchle fribrief frletter frontespizio ftcap ftnxtra
fullblck fullpict functan fwlw
gaceta galois garrigues gastex gatech-thesis
gb4e gcard gchords gcite gene-logic
genmisc genmpage gentium gentle geometry
german germbib germkorr getfiledate
gfsartemisia gfsbodoni gfscomplutum gfsdidot gfsneohellenic
gfsporson gfssolomos
ginpenc gloss glossaries gmdoc gmdoc-enhance gmeometric
gmiflink gmutils gmverb gmverse gnu-freefont gnuplottex gost
graphics graphics-pln
graphicx-psmin greek-inputenc greekdates greenpoint grfpaste
grid gridset gu guitar guitlogo
HA-prosper hands hanging har2nat harmony
harvard harvardkyoto harvmac hc hep hepnames
hepparticles hepthesis hepunits here
hhtensor histogr hitec hrlatex hvfloat hvindex
hypdvips hyper hypernat hyperref hyperxmp hyph-utf8 hyphen-base
hyphenat hyphenex hyplain
ibygrk icsv idxlayout IEEEconf IEEEtran ifmtarg ifplatform ifxetex
ijmart ijqc imac image-gallery impatient impatient-fr import imtekda
inconsolata inlinebib inlinedef
interactiveworkbook intro-scientific inversepath
ionumbers iopart-num iso
iso10303 isodate isodoc isomath isonums isorot isotope itnumpar iwona
jablantile jeopardy jknapltx jneurosci jpsj junicode
jura juraabbrev jurabib juramisc jurarsp js-misc
kalender kastrup kerkis kerntest
keycommand keystroke
knitting knittingpattern knuth koma-script kpfonts
l2picfaq l2tabu l2tabu-english l2tabu-french l2tabu-it l2tabu-spanish
labbook labelcas labels lastpage
latex latex-course latex-doc-ptr latex-notes-zh-cn
latex-referenz latex-tabellen
latex-tds latex-veryshortguide
latex2e-help-texinfo latex2man
latexcheat latexcheat-esmx latexcheat-ptbr latexdiff latexmk latexmp
layouts lcd lcg lcyw leading leaflet ledmac leftidx lettrine
lewis lfb lgreek lh
libertine libris limap linearA lineno linguex
lipsum listings listings-ext listliketab listofsymbols
lithuanian liturg lkproof lm
logic logical-markup-utils logpap lps lsc
lshort-bulgarian lshort-chinese lshort-dutch lshort-english
lshort-finnish lshort-french lshort-german lshort-italian
lshort-japanese lshort-korean lshort-mongol lshort-persian
lshort-polish lshort-portuguese lshort-slovak lshort-slovenian
lshort-spanish lshort-thai lshort-turkish lshort-ukr
lshort-vietnamese ltablex ltabptch
ltxdockit ltxindex ltxmisc ltxnew
lua-alt-getopt luainputenc luamplib luaotfload luatextra lxfonts
macqassign mafr magyar mailing mailmerge
makebarcode makebox makecell makecirc makecmds makeglos
makeplot maple margbib
marginnote marvosym mathabx mathcomp mathdots mathexam
mathmode mathspec mattens maybemath
mcaption mceinleger mciteplus mdwtools memdesign memexsupp
memoir MemoirChapStyles mentis
menu metafont-beginners
metago metalogo metaobj metaplot metatex metauml
mff mfnfss mfpic mfpic4ode mftinc mh mhchem
mhequ mhs microtype midnight midpage minibox minipage-marginpar
minitoc minted minutes
mkgrkindex mkjobtexmf mkpattern
mla-paper mlist mmap mnsymbol
moderncv modref modroman mongolian-babel montex morefloats moreverb
movie15 mp3d mparhack
mpman-ru ms msc msg mslapa multibib multicap multirow
multido multiobjective munich muthesis mwcls mxedruli
nag namespc natbib nath nature ncclatex ncctools
needspace newfile newlfm nextpage
nfssext-cfr niceframe nicetext nih nkarta noitcrul
nomencl nomentbl nostarch notes notes2bib
ntgclass ntheorem-vn numname numprint
oberdiek ocr-latex octavo ofs ogham oldstyle
onlyamsmath onrannual opcit
ordinalpt orkhun othello oubraces outline
pagecont pagenote pagerange paper papercdcase papertex
parallel paresse parrun passivetex
patch patchcmd patgen2-tutorial pauldoc pax pbox pb-diagram
pdf-forms-tutorial-de pdf-forms-tutorial-en
pdf-trans pdfcomment pdfcprot pdfcrop pdfmarginpar
pdfpages pdfscreen pdfslide pdfsync pdftex-def pdftricks pdfx
perception perltex
permute persian-bib petiteannonce
pgf pgf-soroban pgfopts pgfplots phaistos philex philosophersimprint
phonetic pict2e pictex pictex2 pigpen
pinlabel pittetd pkfix pkfix-helper placeins placeins-plain
plari plates play
plnfss plweb pmgraph pnas2009
poemscol polski polyglossia polynom polynomial
polytable popupmenu
powerdot powerdot-FUBerlin ppr-prv pracjourn preprint presentations
prettyref preview printlen proba probsoln procIAGssymp program
properties protex protocol
psbao pseudocode psfrag psfrag-italian psgo pslatex psnfss pspicture
pst-2dplot pst-3d pst-3dplot pst-abspos pst-am pst-asr pst-bar
pst-barcode pst-bezier pst-blur pst-bspline
pst-calendar pst-circ pst-coil pst-cox pst-dbicons pst-diffraction
pst-eps pst-eucl pst-exa pst-fill
pst-fr3d pst-fractal pst-fun pst-func
pst-gantt pst-geo pst-grad pst-infixplot pst-jtree pst-knot pst-labo
pst-lens pst-light3d pst-math pst-mirror pst-node
pst-ob3d pst-optexp pst-optic
pst-osci pst-pad pst-pdgr pst-platon pst-plot pst-poly pst-pdf
pst-qtree
pst-sigsys pst-solides3d pst-soroban pst-spectra
pst-slpe pst-stru pst-support pst-text pst-thick pst-tree pst-uml
pst-vowel pst-vue3d
pst2pdf pstool pstricks pstricks-add
psu-thesis ptptex purifyeps pxfonts
qcm qobitree qstest qsymbols qtree quotmark
r_und_s randbild rangen rccol rcs rcs-multi rcsinfo
recipe recipecard recycle
refman refstyle regcount register relsize renditions resumemac revtex
rjlparshap
robustcommand robustindex romannum rotating rsc rsfs
rtkinenc rtklage ryethesis
sageep sauerj sauterfonts savefnmark savesym savetrees scale
scalebar schemabloc scientificpaper sciposter screenplay script
sdrt sectionbox sectsty selectp semantic semaphor seminar semioneside
seqsplit setspace sf298 sffms sfg sfheaders
sfmath sgame shadbox shade shadethm shapepar
shipunov shorttoc show2e showdim showexpl showlabels shuffle
SIstyle SIunits
sidecap sides siggraph silence simplecv simplewick siunitx
skak skaknew skeyval slantsc slideshow smalltableof smartref
snapshot songbook sort-by-letters soton soul
spanish spanish-mx sparklines spie
splines splitbib splitindex spotcolor spreadtab sprite spverbatim
srcltx sseq
ssqquote stack stage statex2 staves stdclsdv stdpage steinmetz
stellenbosch stex stringstrings struktex
sttools stubs suanpan subdepth subeqn subeqnarray
subfig subfigure subfloat substr subsupscripts sudoku
sudokubundle sugconf
supertabular susy svgcolor svn svn-multi svn-prov svninfo
swebib syllogism syntax synproof syntrace synttree
t-angles t2 Tabbing
tableaux tablenotes tablists tablor tabls tabto-generic
tabularcalc tabularew
tabulary tabvar talk
tamethebeast tdclock tdsfrmath
technics ted templates-fenn templates-sommer tengwarscript
tensor termcal termlist teubner tex-ewd tex-gyre tex-label texcount
texdiff texdirflatten texilikechaps texilikecover
texloganalyser texmate texments
texpower texshade
textcase textfit textopo textpath textpos
thailatex theoremref thesis-titlepage-fhac
thinsp thmbox thmtools threeparttablex
thumb thumbpdf thumby thuthesis ticket
tikz-3dplot tikz-inet tikz-qtree tikz-timing timetable tipa
titlefoot titlepages titlepic titlesec titling
tkz-doc tkz-linknodes tkz-orm tkz-tab
tocbibind tocloft tocvsec2 todo todonotes
tokenizer toolbox tools toptesi totcount totpages tracking
trajan translator tree-dvips trfsigns trimspaces trivfloat trsym
tufte-latex tugboat tugboat-plain turnstile twoinone twoup txfonts
txfontsb Type1fonts
typedref typehtml typogrid
uaclasses uebungsblatt ucdavisthesis ucs ucthesis uhrzeit uiucthesis
ulem ulqda ulsy
umich-thesis uml umlaute
umthesis umtypewriter underlin undertilde units unitsdef
universa unroman
upmethodology upquote url urlbst ushort ut-thesis uwthesis
vancouver variations varindex varisize
varsfromjobname varwidth vaucanson-g
vector velthuis venn venturisadf verbatimbox verbatimcopy verbdef
verse version versions vertbars
vhistory visualfaq vmargin vntex volumes vpe vwcol vxu
wadalab wallpaper warning warpcol widetable williams wordlike
wrapfig wsuipa
xargs xcolor xdoc xecjk xecolour xecyr xeindex xepersian xesearch
xetex-def xetex-itrans xetex-pstricks xetexfontinfo
xetexref xfor xgreek xifthen
xkeyval xlop xltxtra xmpincl xnewcommand xoptarg xpackages
xq xskak xstring xtab xtcapts xunicode
xwatermark xyling xypic-tut-pt xytree
yagusylo york-thesis yplan
zed-csp zefonts ziffer zhmetrics zhspacing zwgetfdate zwpagelayout
);
# these packages we do not expect to check:
my @TLP_no_check = qw(
afm2pl # not on CTAN
aleph # binary
fontname # tl-update-auto
gnu-freefont # hefferon test case
);
exit (&main ());
sub main
{
chomp ($Master = `cd $mydir/../.. && pwd`);
$tlpdb = TeXLive::TLPDB->new ("root" => $Master);
die "Cannot find tlpdb in $Master!" unless defined $tlpdb;
$OPT{"verbose"} = 0;
if ($ARGV[0] eq "--verbose") {
$OPT{"verbose"} = 1;
shift @ARGV;
}
if ($ARGV[0] eq "--list-not-treated") {
print "TeX Live packages not in $0:\n";
for my $b (&normal_tlps ()) {
print "$b\n" if ! grep ($b eq $_, @TLP_working, @TLP_no_check)
}
@ARGV = (); # no normal checks
} elsif ($ARGV[0] eq "--check") {
# check all/only those packages we have actually run through this mill.
@ARGV = @TLP_working;
} elsif ($ARGV[0] eq "--check-all") {
@ARGV = &normal_tlps ();
}
my $errcount = 0;
for my $tlp (@ARGV) {
print "checking $tlp..." if $OPT{"verbose"};
$errcount += &do_tlp ($tlp);
}
return $errcount;
}
# gives a list with only the 'normal' packages,
# that is, excluding meta-packages and binary packages
# (and hyphen for the moment)
#
sub normal_tlps
{
my @normal;
my $non_normal = `ls $Master/bin`;
$non_normal =~ s/\n/\$|/g;
$non_normal .= '^0+texlive|^bin-|^collection-|^scheme-|^texlive-|^hyphen-';
foreach ($tlpdb->list_packages) {
push (@normal, $_) unless (/$non_normal/);
}
return @normal;
}
# Return 1 if package needs updating, 0 if ok.
#
sub do_tlp
{
my ($tlpn) = @_;
my $needed = 0;
my $tlp = $tlpdb->get_package($tlpn);
if (not(defined($tlp))) {
warn "$0: no package $tlpn\n";
return 1;
}
chomp (my $ctan_dir = `$mydir/tlpkginfo --prepare '$tlpn'`);
if (! $ctan_dir) {
warn "$0: oops, no CTAN directory for $tlpn, fix fix\n";
return ();
}
my @tpm_files = ();
push @tpm_files, $tlp->runfiles;
push @tpm_files, $tlp->docfiles;
push @tpm_files, $tlp->srcfiles;
if ($tlp->relocated) { for (@tpm_files) { s:^$RelocPrefix/:$RelocTree/:; } }
# we don't push bin files, should we?
my @compared = ();
for my $file (@tpm_files) {
#warn "checking file $file\n";
my $tl_file = "$Master/$file";
if (! -e $tl_file) {
warn "$tl_file: TL file missing\n";
next;
}
(my $basefile = $file) =~ s,^.*/,,;
chomp (my @ctan_files = `find $ctan_dir/ -name $basefile`);
#warn "ctan find $basefile: @ctan_files\n";
# the trailing / is so if we happen to hit a symlink on CTAN, it'll
# go through.
next if @ctan_files > 1; # if more than one file by same name, skip
my $ctan_file = $ctan_files[0];
#warn "ctan file is $ctan_file\n";
if (! -e $ctan_file) {
# maybe it'll be there with a case change in the name
chomp (@ctan_files = `find $ctan_dir/ -iname $basefile`);
next if @ctan_files > 1; # if more than one file by same name, skip
$ctan_file = $ctan_files[0];
if (! -e $ctan_file) {
# we generate lots of files, eg perlmacros.sty, so might skip.
warn "$ctan_file: CTAN file missing\n"
if $ctan_file && $ctan_file !~ /(cfg|dvi|sty|tex)$/;
next;
}
}
push (@compared, $basefile);
if (&files_differ ($tl_file, $ctan_file)) {
# we sometimes regenerate pdf's for TL, so we don't complain if
# they are different. On the other hand, we don't always
# regenerate them, so might as well check first.
next if $tl_file =~ /\.pdf$/;
print "# $tlpn\ndiff $ctan_file $tl_file\n";
$needed = 1;
last unless $OPT{"all"};
}
}
# xx check ctan dir for new files somehow?
if (@compared == 0) {
warn "\n$tlpn: no files to compare in $ctan_dir, fixme!\n";
warn "(tpm_files = @tpm_files)\n";
} elsif ($needed == 0) {
print "ok\n" if $OPT{"verbose"};
}
print ((@compared + 0) . " compared (@compared)\n") if $OPT{"verbose"};
# clean up the tmpdir possibly created when invoking 'tlpkginfo --prepare'
chomp (my $ctan_root = `$mydir/tlpkginfo --ctan-root`);
if ($ctan_dir !~ m,^$ctan_root, && ! $OPT{"no-clean"}) {
system ("rm -rf $ctan_dir");
}
return $needed;
}
# 0 if files are the same, 1 if they are different.
#
sub files_differ
{
my ($tl_file,$ctan_file) = @_;
#warn "comparing $ctan_file $tl_file\n";
return system ("$mydir/cmp-textfiles $ctan_file $tl_file");
}
# vim: set ts=8 sw=2 expandtab:
|