#!/usr/local/bin/perl # $Id$ # Public domain. Originally written 2005, Karl Berry. # Check if a package in TL has any changes on CTAN. Just the beginnings. chomp (my $mydir = `dirname $0`); chomp ($mydir = `cd $mydir && pwd`); chomp ($TL = `cd $mydir/../../Master && pwd`); chdir ($TL) || die "chdir($TL) failed: $!"; exit (&main ()); sub main { $OPT{"verbose"} = 1; # xx read FILES.last7days, determine CTAN changes, map to TL packages # xx alternatively, check all tpm's if ($ARGV[0] eq "--karl") { $OPT{"verbose"} = 0; # xx but for now, just check the few packages we have worked with. @ARGV = ( "12many", "ESIEEcv", "GuIT", "HA-prosper", "IEEEconf", "IEEEtran", "SIstyle", "SIunits", "Tabbing", "Type1fonts", "a0poster", "aastex", "abbr", "abstract", #"abstyles", not updated, but too old to matter "accfonts", "acronym", "algorithm2e", "algorithms", "apacite", "archaic", "arev", "ascii", "babel", "babelbib", "beebe", "betababel", "bghyphen", "bibhtml", "bibleref", "blacklettert1", "booklet", "breakurl", "bytefield" , "caption", "carlisle", "cbcoptic", "changebar", "chappg", "chemcompounds", "circ", "cjhebrew", "colortbl", "commath", "complexity", "comprehensive", "computational-complexity", "csquotes", "curve", "datetime", "devanagr", "dk-bib", "doipubmed", "dottex", "dtxtut", "ednotes", "elpres", "endheads", "enumitem", "etaremune", "esint", "esint-type1", "ethiop", "europecv", "exteps", "featpost", "flagderiv", "floatflt", "floatrow", "flowfram", "fltpoint", "fmtcount", "fncychap", "fontspec", "formular", "fourier", "free-math-font-survey", "genmisc", "glossary", "gost", "graphics", "graphicx-psmin", "hyphen-base", "hyphen-basque", "hyphen-german", "hyphen-greek", "hyphen-norwegian", "hyphen-ukenglish", "hyphen-usorbian", "ibygrk", "iopart-num", "itamsldoc", "koma-script", "labelcase", "ledmac", "lewis", "lfb", "lh", "lineno", "listings", "lshort-bulgarian", "lshort-dutch", "lshort-english", "lshort-finnish", "lshort-french", "lshort-german", "lshort-italian", "lshort-japanese", "lshort-korean", "lshort-mongolian", "lshort-polish", "lshort-portuguese", #"lshort-russian", # only zip files on CTAN "lshort-slovak", "lshort-spanish", "lshort-thai", "lshort-ukrainian", "lshort-vietnamese", "ltabptch", "ltxmisc", #"malayalam", # missing C sources on CTAN, wrote author 5jun05. #"mathspic", # inside pictex, later "makecell", "makeplot", "mathmode", "mcaption", "memoir", "mhchem", "minitoc", "microtype", "mla-paper", "movie15", #"mpattern", # not up-to-date on CTAN, wrote author 28may05. "nag", "ncclatex", "ncctools", "newlfm", "nomencl", "nomentbl", "numprint", "oberdiek", "octavo", "pdf-trans", "pdfcprot", "perception", "perltex", "pgf", "pictex", "placeins", "plnfss", "poemscol", "powerdot", "powerdot-doc-vn", "ppr-prv", "preview", "proof", "pstricks", "pstricks-add", "pst-3d", "pst-barcode", "pst-blur", "pst-eucl", "pst-labo", "pst-lens", "pst-osci", "pst-pdgr", "pst-slpe", "sciposter", "sectionbox", "seminar", "semioneside", "setspace", "sf298", "sides", "skaknew", "sparklines", "spotcolor", "sttools", "struktex", "subfig", "sudoku", "svninfo", "tabulary", "talk", "tamethebeast", "tex-refs", "texmate", "texshade", "textcase", "textpos", "thumbpdf", "bin-thumbpdf", "titlesec", "tokenizer", "totpages", "trajan", "tugboat", "twoup", "verse", "vhistory", "volumes", "wrapfig", "xcolor", "xkeyval" ); } my $errcount = 0; for my $tpm (@ARGV) { # look in our various hierarchies. my $found = ""; for my $dir ("texmf-dist", "texmf-doc", "texmf") { my $try = "$dir/tpm/$tpm.tpm"; if (-r $try) { $found = $try; last; } } if ($found) { print "checking $tpm..." if $OPT{"verbose"}; $errcount += &do_tpm ($found); } else { warn "$0: cannot find tpm file $tpm\n"; $errcount++; } } return $errcount; } # Return 1 if TPM needs updating, 0 if ok. # sub do_tpm { my ($tpm) = @_; my $needed = 0; my %tpm = &read_tpm ($tpm); my @tpm_files = @{$tpm{"files"}}; my @compared = (); for my $file (@tpm_files) { #warn "checking file $file\n"; my $tl_file = "$TL/$file"; if (! -e $tl_file) { warn "$tl_file: TL file missing\n"; next; } (my $basefile = $file) =~ s,^.*/,,; chomp (my @ctan_files = `find $tpm{CTANdir}/ -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 $tpm{CTANdir}/ -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 "# $tpm\ndiff $ctan_file $tl_file\n"; $needed = 1; last; } } # xx check ctan dir for new files if (@compared == 0) { warn "\n$tpm: no files to compare in $tpm{CTANdir}, fixme!\n"; warn "(tpm_files = @tpm_files)\n"; } elsif ($needed == 0) { print "ok, " . (@compared + 0) . " compared (@compared)\n" if $OPT{"verbose"}; } return $needed; } # Return useful information from a TPM. # sub read_tpm { my ($tpm) = @_; my %ret; local *TPM; open (TPM, $tpm) || die "open($tpm) failed: $!\n"; my @files = (); while () { if (m!/dev/null") != 0) { $different = 1; } } return $different; }