summaryrefslogtreecommitdiff
path: root/Master/tlpkg/bin/place
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/bin/place')
-rwxr-xr-xMaster/tlpkg/bin/place273
1 files changed, 273 insertions, 0 deletions
diff --git a/Master/tlpkg/bin/place b/Master/tlpkg/bin/place
new file mode 100755
index 00000000000..86ae3d0dc76
--- /dev/null
+++ b/Master/tlpkg/bin/place
@@ -0,0 +1,273 @@
+#!/usr/bin/env perl
+# $Id$
+# License: public domain. Originally written by Sebastian Rahtz.
+#
+# Process a tree in the Build/cdbuild/cooked directory (probably created
+# by ctan2tds.pl) and integrate into the main texmf trees.
+#
+# Basic usage: place PKG
+# to process Build/cdbuild/cooked/PKG.
+
+BEGIN {
+ chomp ($mydir = `dirname $0`);
+ unshift (@INC, "$mydir/../../Master/tlpkg");
+}
+
+use File::Basename;
+use File::Find;
+use Cwd;
+use TeXLive::TLPSRC;
+use TeXLive::TLPOBJ;
+use TeXLive::TLPDB;
+use TeXLive::TLTREE;
+
+if ($ARGV[0] eq "-n") {
+ $chicken = 1;
+ shift;
+} else {
+ $chicken = 0;
+}
+print "place: chicken mode = $chicken\n";
+
+die "usage: $0 PKGNAME\n" unless @ARGV == 1;
+$package = $ARGV[0];
+
+$newpackage = 0;
+%dirs = (); # dirs we make changes in
+$TMP = $ENV{"TMPDIR"} || "/tmp";
+
+xchdir (dirname($0) . "/cooked");
+$mydir = getcwd();
+-d "$mydir/$package" || die "$0: No such package in $mydir: $package\n";
+
+xchdir ("../../../Master");
+$M = getcwd();
+
+xchdir ("$mydir/$package");
+if (-d "texmf-dist") {$Root="texmf-dist"; }
+elsif (-d "texmf-doc") {$Root="texmf-doc"; }
+elsif (-d "texmf") {$Root="texmf"; }
+else { die ("no top level texmf in " . `pwd`); }
+
+if ($Root eq 'texmf-doc') {
+ $Type = 'Documentation';
+} elsif ($Root eq 'texmf-dist') {
+ $Type = 'Package';
+} elsif ($Root eq 'texmf') {
+ # can't handle binary stuff yet, but can do some hyphenations.
+ $Type = 'TLCore';
+} else {
+ die "cannot handle Root=$Root";
+}
+
+# initialize TLPDB
+my $tlpdb = new TeXLive::TLPDB ( location => "$M/texlive.tlpdb" );
+# create TLTREE from stuff in cooked/$pkg
+my $tltree = TeXLive::TLTREE->new( 'svnroot' => "$mydir/$package" );
+$tltree->init_from_files;
+
+# get package from TLPDB;
+my $tlpold = $tlpdb->get_package("$package");
+if (defined($tlpold)) {
+ # what to do with binfiles, but they are not place-ed!!!
+ foreach ($tlpold->srcfiles, $tlpold->runfiles, $tlpold->docfiles) {
+ $Old{$_} = 1;
+ }
+} else {
+ $newpackage = 1;
+}
+
+# create new tlpsrc and tlpobj
+my $tlpsrc = TeXLive::TLPSRC;
+if (! -r "$M/tlpkg/tlpsrc/$package.tlpsrc") {
+ $tlpsrc->name("$package");
+ $tlpsrc->category($Type);
+ if (!$chicken) {
+ open TMP, ">$M/tlpkg/tlpsrc/$package.tlpsrc" or die "Cannot open tlpsrc file!";
+ $tlpsrc->writeout(\*TMP);
+ close TMP
+ }
+} else {
+ $tlpsrc->from_file("$M/tlpkg/tlpsrc/$package.tlpsrc");
+}
+
+my $tlpnew = $tlpsrc->make_tlpobj($tltree);
+
+# we took over the comparison of files from the ctan2tl script since
+# we are here in perl world, which makes it easier ...
+print "\n\f ";
+if (!defined($tlpold)) {
+ print "place: $package not present in $M/texlive.tlpdb\n\n";
+} else {
+ print "new vs. present $package\n";
+ my @oldfiles;
+ push @oldfiles, $tlpold->srcfiles;
+ push @oldfiles, $tlpold->runfiles;
+ push @oldfiles, $tlpold->docfiles;
+ `rm -f $TMP/tlplace.old`;
+ foreach (sort @oldfiles) {
+ `echo $_ >> $TMP/tlplace.old`;
+ }
+ my @newfiles;
+ push @newfiles, $tlpnew->srcfiles;
+ push @newfiles, $tlpnew->runfiles;
+ push @newfiles, $tlpnew->docfiles;
+ `rm -f $TMP/tlplace.new`;
+ foreach (sort @newfiles) {
+ `echo $_ >> $TMP/tlplace.new`;
+ }
+ print `comm -3 $TMP/tlplace.new $TMP/tlplace.old`;
+ my @difffiles = `comm -12 $TMP/tlplace.new $TMP/tlplace.old`;
+ chomp (@difffiles);
+ my $sum = 0;
+ my $diff_file = "$TMP/tlplace.diff";
+ unlink ($diff_file);
+ my $diff_cmd = "diff --text --ignore-all-space -U 0 -s";
+ foreach (@difffiles) {
+ my @foo = `$diff_cmd $M/$_ $mydir/$package/$_ | tee -a $diff_file`;
+ $sum += $#foo; # zero-based, so first line doesn't count.
+ }
+ my $nrcommfiles = @difffiles;
+ chomp (my $identical = `grep 'are identical' $diff_file | wc -l`);
+ print "$nrcommfiles common files, $identical unchanged, ~$sum lines different ($diff_file)\n\n\f\n";
+ #`rm -f $TMP/tlplace.new $TMP/tlplace.old $TMP/tlplace.diff`;
+}
+
+
+&xchdir ("$mydir/$package");
+find (\&files,".");
+foreach $file (sort keys %Old) {
+ print "* $file: [retained=$New{$file}]\n";
+
+ # if the old file does not exist, don't try to remove it -- we
+ # probably did so by hand and didn't bother to update.
+ next unless -e "$M/$file";
+
+ my $dname = dirname ("$M/$file");
+ $dirs{$dname}++;
+}
+
+# copy files
+my $job = "tar cf - . | (cd $M && tar xf - )";
+&my_system ($job);
+
+# sort so dirs will be added before subdirs.
+foreach $file (sort keys %New) {
+ if (! $Old{$file}) {
+ &add_file ("$M/$file");
+ }
+}
+
+xchdir ($mydir);
+&my_system ("mv $package $package.done");
+
+
+chomp (my $tools = `cd $mydir/../../tools && pwd`);
+
+if ($newpackage) {
+ &add_file ("$M/tlpkg/tlpsrc/$package.tlpsrc");
+}
+
+# this file will often change, so be sure and include it.
+$dirs{"$M/tlpkg/tlpsrc/$package.tlpsrc"}++;
+
+# print dirs with changed files, for svn commit purposes.
+# if other files have been modified in those same dirs, though, this
+# won't detect it. It would be better to list exactly the *files* which
+# should be committed, but ... lazy.
+#
+# also write dir list to a separate file, for easy passing to a commit.
+#
+$DIRLIST = ">$TMP/tlplace.dirs";
+open (DIRLIST) || die "open($DIRLIST) failed: $!";
+#
+for my $dir (sort keys %dirs) {
+ print "$dir\n";
+ print DIRLIST "$dir\n";
+}
+#
+close (DIRLIST) || warn "close($DIRLIST) failed: $!";
+
+#xx warn "WARNING WARNING Things we SHOULD/COULD do here:\n - Update the texlive.tlpdb\n - Compare the files ACTUALLY present in cooked/package with those included via tlpsrc/tltree generation!!!\n - Create list file\n - Update the list of available packages for web update\n - Create zip file(s)\n\n\n";
+
+exit (0);
+
+
+
+#--------------------------------------
+sub dirs
+{
+ local @filenames;
+ if (-d) {
+ @filenames=&buildfilelist($File::Find::name);
+ if (!@filenames) { rmdir $File::Find::name;}
+ }}
+
+sub buildfilelist
+{
+ my($me) = @_;
+ my @files;
+ opendir(DIR,$me) || cleanup ("cannot open directory $me");
+ @files =grep(!/^\.\.?/,readdir(DIR));
+ closedir(DIR);
+ return @files;
+}
+
+
+sub files
+{
+ if (-f || -l) { # consider files or symlinks
+ $This = $File::Find::name;
+ $This =~ s/^\.\///;
+ $New{$This} = 1;
+ }
+}
+
+
+# add a file to the repository. for svn, we also have to add the
+# containing dir, and the parent of that dir, if they are new.
+# (Should really just traverse )
+#
+sub add_file
+{
+ my ($newfile) = @_;
+
+ my $newdir = dirname ($newfile);
+
+ # when it's needed, parent must come first, else have svn "not working copy".
+ my $parentdir = dirname ($newdir);
+ unless (-d "$parentdir/.svn") {
+ &my_system ("svn add -N $parentdir");
+ $dirs{$parentdir}++;
+ }
+
+ unless (-d "$newdir/.svn") {
+ &my_system ("svn add -N $newdir");
+ }
+
+ &my_system ("svn add $newfile");
+
+ # remember that we changed this directory.
+ $dirs{$newdir}++;
+}
+
+
+sub xchdir
+{
+ my ($dir) = @_;
+ chdir ($dir) || die "chdir($dir) failed: $!";
+ print "place: chdir($dir)\n";
+}
+
+
+sub my_system
+{
+ my ($cmd) = @_;
+
+ print "place: SYSTEM $cmd\n";
+
+ unless ($chicken) {
+ my $ret = system ($cmd);
+ die "`$cmd' failed, status=$ret, goodbye\n" if $ret != 0;
+ }
+}