summaryrefslogtreecommitdiff
path: root/Master/tlpkg/bin/tlpkg-ctan-check
blob: a5692c219fd79179f8b13dd4df73f3bd7f786d26 (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
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
#!/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 autotab
  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-apa biblatex-chem biblatex-chicago-notes-df
    biblatex-dw biblatex-nature biblatex-philosophy 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 bpolynomial
    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 de-macro 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 etextools 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 fc_arith 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 fncylab 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 gauss
    gb4e gcard gchords gcite gene-logic
    genmisc genmpage gentium gentle geometry
    german germbib germkorr getfiledate
    gfsartemisia gfsbaskerville gfsbodoni gfscomplutum gfsdidot gfsneohellenic
    gfsporson gfssolomos
    ginpenc gloss glossaries gmdoc gmdoc-enhance gmeometric
    gmiflink gmutils gmverb gmverse gnuplottex gost
    graphics graphics-pln
    graphicx-psmin greek-inputenc greekdates greenpoint grfpaste
    grid gridset grverb gu guitar guitlogo
  HA-prosper hands hanging har2nat harmony
    harvard harvardkyoto harvmac hc hep hepnames
    hepparticles hepthesis hepunits here hexgame
    hhtensor histogr historische-zeitschrift hitec hrlatex hvfloat hvindex
    hypdvips hyper hypernat hyperref hyperxmp hyph-utf8 hyphen-base 
    hyphenat hyphenex hyplain
  ibygrk icsv idxlayout IEEEconf ieeepes IEEEtran ifmtarg ifplatform ifxetex
    ijmart ijqc imac image-gallery impatient impatient-fr import imtekda
    inconsolata inlinebib inlinedef insbox
    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 kix
    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 lazylist
    lcd lcg lcyw leading leaflet ledmac leftidx lettrine
    lewis lexikon lfb lgreek lh
    libertine librarian libris limap linearA lineno linguex
    lipsum listbib listing 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 magaz magyar mailing mailmerge
    makebarcode makebox makecell makecirc makecmds makeglos makeplot
    manuscript 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
    method
    mff mfnfss mfpic mfpic4ode mftinc mh mhchem
    mhequ mhs microtype midnight midpage
    minibox minipage-marginpar miniplot minitoc
    minted minutes
    mkgrkindex mkjobtexmf mkpattern
    mla-paper mlist mmap mnsymbol
    moderncv modref modroman mongolian-babel montex morefloats moresize
    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 nonfloat nostarch notes notes2bib
    ntgclass ntheorem-vn numname numprint
  oberdiek ocgtools 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
    pdf14 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-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 standalone 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 threeparttable 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 turkmen 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 vruler 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 xypdf xypic-tut-pt xytree
  yagusylo york-thesis youngtab yplan
  zed-csp zefonts ziffer zhmetrics zhspacing zwgetfdate zwpagelayout
); 

# these packages we do not expect to check:
my @TLP_no_check = (
  "afm2pl",		# not on CTAN
  "aleph",		# binary
  "asymptote",		# binary
  "bibtex",		# binary
  "bibtex8",		# binary
  "ctie",		# binary
  "fontname",		# tl-update-auto
  "gnu-freefont",	# only packed on CTAN
  "gsftopk",		# binary
  "ifluatex",		# part of oberdiek
  "kpathsea",		# binary
  "lcdftypetools",	# binary
  "metapost",		# binary
  "powerdot",		# stale generated files on CTAN
  "synctex",		# binary
  "texinfo",		# tl-update-auto
  "texlive.infra",	# binary
  "texware",		# binary
  "xetex",		# binary
);

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") {
    my @not_checked = ();
    for my $b (&normal_tlps ()) {
      if (! grep ($b eq $_, @TLP_working, @TLP_no_check)) {
        push (@not_checked, $b);
      }
    }
    print "" . (@not_checked+0) . " TL packages not checked against CTAN:\n";
    print "@not_checked\n";
    @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: