summaryrefslogtreecommitdiff
path: root/Master/tlpkg/bin/tlpkg-ctan-check
blob: d01ae0171e2ed85ffd9d053efdeb64bca1ddaace (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
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
#!/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;

my @TLP_working = qw( # these packages should be up to date
  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
    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
    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
    bibleref biblist bibtopic
    bibtopicprefix bibexport
    bibunits bidi bigfoot bigints binomexp bizcard
    blacklettert1 blindtext blkarray blockdraw_mp blowup
    boisik bold-extra
    boites boldtensors bookest booklet booktabs boolexpr bophook bosisio
    boxedminipage boxhandler bpchem
    bracketkey breakurl bullcntr bussproofs bytefield 
  cachepic calctab calligra calrsfs
    capt-of captcont caption carlisle casyl
    catechis carolmin-ps 
    cbcoptic cbfonts cc-pl ccaption ccicons cclicenses cd cdpbundl
    cell cellspace censor
    changebar changelayout changepage changes chappg chapterfolder
    chem-journal chembst chemcompounds chemcono
    chemstyle cherokee chess-problem-diagrams chessboard chessfss
    chicago-annote chletter chngcntr circ 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 commath compactbib complexity comprehensive
    computational-complexity 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 dcpic decimal dehyph-exptl
    delimtxt diagmac2 digiconfigs din1505
    dinat dingbat directory dirtree disser dk-bib dlfltxb
    doc-pictex docmfp docmute doi doipubmed
    dotarrow dot2texi 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
    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
    eulervm euproposal euro europecv eurosans eurosym
    everypage exam examdesign examplep 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
    fixfoot fixme fixpdfmag flacards
    flagderiv flashmovie flippdf float floatrow flowfram fltpage fltpoint
    fmtcount fn2end fnbreak
    fncychap foekfont font-change fontch fontinst fontools
    fontspec fonttable fontwrap
    footbib footmisc footnpag forarray forloop formular
    fouridx fourier fouriernc
    fp fpl fragmaster fragments frankenstein free-math-font-survey
    frenchle fribrief frletter frontespizio ftnxtra
    fullblck fullpict functan
  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
    grid gridset gu guitar guitlogo
  HA-prosper hands hanging harmony
    harvard harvardkyoto harvmac hc hep hepnames
    hepparticles hepthesis hepunits here
    hhtensor histogr hitec hrlatex hvfloat hvindex
    hypdvips hyperref hyperxmp hyph-utf8 hyphen-base 
    hyphenat hyphenex hyplain
  ibygrk icsv idxlayout IEEEconf IEEEtran ifmtarg ifplatform ifxetex
    ijmart ijqc 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 keyreader keystroke
    knitting 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
    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
    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 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 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 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
    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
  ziffer zhmetrics zhspacing zwgetfdate zwpagelayout
); 

my @TLP_no_check = qw( # these packages we do not expect to check
  afm2pl  # not on CTAN
);

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: