#!/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 @WorkingTLP = qw( 12many a0poster a2ping aastex abbr abc abstract abstyles accfonts achemso acmconf acmtrans acronym active-conf addlines adrconv adrlist 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 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 bbold bclogo beamer beamer-FUBerlin beamer-contrib beamer-tut-pt beamerposter begriff bera betababel beton bez123 bezos bgreek bib-fr bibarts bibhtml bibleref bibtopic bibtopicprefix bibunits bidi bigfoot binomexp bizcard blacklettert1 blindtext blockdraw_mp blowup boisik boites boldtensors bookest booklet booktabs boolexpr bophook bosisio boxhandler bpchem bracketkey breakurl bullcntr bussproofs bytefield cachepic calctab calligra calrsfs captcont caption carlisle casyl catechis carolmin-ps cbcoptic cbfonts cc-pl ccaption cclicenses cd cdpbundl cell cellspace changebar changelayout changepage changes chappg chapterfolder chem-journal chembst chemcompounds 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 combine 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-simplefonts context-simpleslides context-top-ten context-typearea context-typescripts context-vim cooking 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 ellipsis elpres elsarticle elsevier elsevier-bib eltex elvish emptypage emulateapj emp encxvlna endfloat endheads engpron engrec enumitem envbig environ envlab epigrafica epigraph epiolmec eplain epsdice epsf epsincl epslatex-fr 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 flagderiv 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 gentle geometry germbib germkorr getfiledate gfsartemisia 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 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 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 jeopardy jknapltx jneurosci jpsj junicode jura juraabbrev jurabib juramisc jurarsp kalender kastrup kerkis kerntest keycommand keys3 keystroke knuth koma-script kpfonts l2picfaq l2tabu l2tabu-english l2tabu-french l2tabu-it l2tabu-spanish labbook labelcas labels lastpage latex latex-doc-ptr latex-notes-zh-cn latex-veryshortguide latex2e-help-texinfo latex2man latex-course latex-tds latexcheat latexcheat-ptbr 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 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 noitcrul nomencl nomentbl nostarch notes notes2bib ntgclass ntheorem-vn numname numprint oberdiek ocr-latex octavo ofs ogham oldstyle onlyamsmath opcit ordinalpt orkhun othello outline pagecont pagenote pagerange paper papercdcase papertex parallel paresse parrun passivetex patch 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 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 poemscol polski polyglossia polynom polynomial polytable popupmenu powerdot powerdot-FUBerlin ppr-prv pracjourn preprint 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-asr pst-bar pst-barcode pst-bezier pst-blur pst-bspline pst-calendar pst-circ pst-cox pst-dbicons pst-diffraction pst-eps pst-eucl 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-ob3d pst-optexp pst-optic pst-osci pst-pad pst-pdf pst-pdgr pst-qtree pst-sigsys pst-solides3d pst-soroban pst-spectra pst-slpe pst-stru pst-support pst-text 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 resumemac revtex rjlparshap robustcommand robustindex romannum rotating rsc rsfs rtkinenc rtklage sageep sagetex 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 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 ted templates-fenn templates-sommer tengwarscript tensor termcal termlist teubner tex-ewd tex-gyre texcount texdiff texdirflatten texilikecover texloganalyser texmate texments texpower texshade textcase textfit textopo textpath textpos thailatex theoremref thesis-titlepage-fhac thinsp thmbox thmtools threeparttablex thumb thumbpdf thuthesis ticket tikz-inet tikz-timing timetable tipa titlefoot titlepages titlepic titlesec titling tkz-doc tkz-linknodes 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 twoup txfonts Type1fonts typedref typogrid uaclasses uebungsblatt ucdavisthesis ucthesis uhrzeit uiucthesis ulqda ulsy umich-thesis uml umlaute umthesis umtypewriter underlin undertilde units unitsdef universa unroman upmethodology upquote urlbst ushort ut-thesis uwthesis vancouver variations varindex varisize varsfromjobname varwidth vaucanson-g vector velthuis venn venturisadf verbatimbox verbatimcopy verse version versions vertbars vertex 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-pstricks xetexfontinfo xetexref xfor xgreek xifthen xkeyval xlop xltxtra xmpincl xnewcommand xoptarg xpackages xq xskak xstring xtab xtcapts xunicode xyling xypic-tut-pt xytree yagusylo york-thesis yplan ziffer zhmetrics zhspacing zwgetfdate zwpagelayout ); # epspdf - skip since Siep updates it manually. # etextools - skip since it's different on CTAN and apparently unfixable. exit (&main ()); sub main { # get the Master dir and texlive.tlpdb 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$/, @WorkingTLP); } @ARGV = (); # no normal checks } elsif ($ARGV[0] eq "--check") { # check all/only those packages we have actually run through this mill. @ARGV = @WorkingTLP; } 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: