diff options
Diffstat (limited to 'Master/tlpkg/dev')
14 files changed, 5 insertions, 1531 deletions
diff --git a/Master/tlpkg/dev/README b/Master/tlpkg/dev/README index 34e56a51890..df815ce9872 100644 --- a/Master/tlpkg/dev/README +++ b/Master/tlpkg/dev/README @@ -4,18 +4,10 @@ $Id$ lib tlpkg libraries in other languages, none usable -dev.multi-source-support.patch -dev.multi-source-support.README - see dev.multi-source-support.README - dev.tempfile-for-tlpdb.patch trial to make symlink attacks harder by using tmpfiles instead of the always same filename when downloading the tlpdb.xz -dev.usermode-tlmgr.patch -dev.usermode-tlmgr.README - see dev.usermode-tlmgr.README - makeself-runscript.sh a run.sh for a makeself (tlmgr-update-latest.sh) that even allows installation of texlive by installing the bare bone @@ -32,16 +24,17 @@ mktextex.pl mktexupd.texlua rewrite of mktexupd in texlua +srclist.txt + List of duplicated files to keep in sync. Read by cron.tl. + tlmgr1.pl-with-recreate-tlpdb version of tlmgr.pl as shipped with TL2008 DVD, but with the recreate-tlpdb action added, so that people can go back to some working state after the tlpdb has been hosed. tlnet-disabled-packages.txt - this file collects packages that should NOT be updated in - tlnet, read by tl-update-containers. - - This is probably the wrong place for this file, but where else? + this file specifies packages that should NOT be updated in + tlnet. It is read by tl-update-containers. tlrepo-from-minimals.pl Semi-working (WIP) script that automatically creates a diff --git a/Master/tlpkg/dev/dev.split-desktop-integration.README b/Master/tlpkg/dev/archive/dev.split-desktop-integration.README index ee3c6005306..ee3c6005306 100644 --- a/Master/tlpkg/dev/dev.split-desktop-integration.README +++ b/Master/tlpkg/dev/archive/dev.split-desktop-integration.README diff --git a/Master/tlpkg/dev/dev.split-desktop-integration.patch b/Master/tlpkg/dev/archive/dev.split-desktop-integration.patch index 3020684ffea..3020684ffea 100644 --- a/Master/tlpkg/dev/dev.split-desktop-integration.patch +++ b/Master/tlpkg/dev/archive/dev.split-desktop-integration.patch diff --git a/Master/tlpkg/dev/dev.usermode-tlmgr.README b/Master/tlpkg/dev/archive/dev.usermode-tlmgr.README index 9f1ae445d77..9f1ae445d77 100644 --- a/Master/tlpkg/dev/dev.usermode-tlmgr.README +++ b/Master/tlpkg/dev/archive/dev.usermode-tlmgr.README diff --git a/Master/tlpkg/dev/dev.usermode-tlmgr.patch b/Master/tlpkg/dev/archive/dev.usermode-tlmgr.patch index 1ae6bbe98ed..1ae6bbe98ed 100644 --- a/Master/tlpkg/dev/dev.usermode-tlmgr.patch +++ b/Master/tlpkg/dev/archive/dev.usermode-tlmgr.patch diff --git a/Master/tlpkg/dev/dev.multi-source-support.README b/Master/tlpkg/dev/dev.multi-source-support.README deleted file mode 100644 index e0b3af6f3aa..00000000000 --- a/Master/tlpkg/dev/dev.multi-source-support.README +++ /dev/null @@ -1,127 +0,0 @@ -Multi source support in TeX Live --------------------------------- -(Work in progress) - -(completely independent from generalized revisions) -[karl: good.] - -1) extension of the location part in 00texlive-installation.config ------------------------------------------------------------------- - -Every line can contain an aditional tag ([a-z0-9,]+) after the actual location, -examples: - depend location:http://mirror.ctan.org/systems/texlive/tlnet/2008 ctan - depend location:http://server.local.uni/texlive/packages department - -done -[karl: how do these lines get added? tool, manual editing of tlpdb?] -[norbert: tlmgr location url1 url2=tag1 url3 url4=tag2 ... - # sets url1, url2 with tag tag1, url3, and url4 with tag2 - # as the list of available locations - # backward compatibility with former usage - tlmgr location add ... - # adds locations to the list of available locs - tlmgr location remove ... - # removes locations ... -] -[k2: well, there is no "location" action now, so compatibility isn't an issue. -having this new action seems like a good idea. tlmgr option location foo -will just become a synonm for tlmgr location add foo. yes?] - -2) invocation of tlmgr/installation ------------------------------------ - -Normally tlmgr will install the candidate with the highest revision number. -[karl: ok, given pinning below. otherwise i don't like it.] -[norbert: Why, can you explain why you don't like that the highest revision - number wins?] -[k2: because it is random, except in the one case where you want to use - it. that is, i understand that you want to copy a tl package, make - some local fixes, and install it locally, keeping track of the rev - number. that's fine for you. but there's no way most people are - going to bother with that. if mojca sets up a context repo, say, - those revision numbers are (should be) completely independent of tl's - revision numbers. therefore, all the context packages should be - pinned to the context repo, so the context repo always wins. without - pinning, it would be an unmaintainable situation.] - -That will be achieved by - tlmgr install package - -If you want to install a package from a specific mirror you can do - tlmgr install package/TAG - (tlmgr install package/SOURCE) -where TAG is the tag given above, and SOURCE is the full source address. -So continuing the above example we could call - tlmgr install package/department -or - tlmgr install package/http://server.local.uni/texlive/packages -(maybe we don't allow the later form ...?) -[karl: well, if it's done, then I see no reason not to support it.] - -done - -3) pinning ----------- - -tlmgr will evaluate an additional config file - ROOT/tlpkg/pinning -or the one given via cmdline - tlmgr -pins /path/to/pinning/file -[karl: maybe it should be found in texmf-local/tlpkg? look there - before ROOT/tlpkg but allow both? maybe other places too. have to think - about it. Also, the filename should be something clearer, perhaps - tlpkgpins.txt.] -[norbert: agreed, that texmf-local might be a better place. should be - thought out] - -That file contains lines - package:tag:pin -where package is a package name or * (or regexp? or glob context* eg?) -[glob is better than regexp in this case I think] -and tag is [a-z0-9,]+ as for tags above, or *, -and pin is an integer between 0 and 1000. - -Now the evaluation *which* package will be installed will be done as follows: - -1) create the list of candidates, i.e., all tlpobj from different sources - where the name matches the one to be installed -[karl: if a package is pinned to a single source (99% case, seems to - me), the other sources (e.g., default ctan) won't even be considered, right?] - -[norbert: well, it depends. There will be a default pin value of say 500, - and you can give pin values lower than 500 to prefer packages from other - sources, or higher pin values to prefer these sources] - -[k2: I understand there is all this flexibility, but that's not my -point. I envision the single most common use of this (by far) to say -"get package foo from my special location bar", where foo is a local -font, or tlmgr from tlcritical. In these cases, the user will set a -single location. And then it would be a waste of time for tlmgr to even -consider looking at the default location (tlnet) for foo. It should not -even be a candidate.] - - -2) compute the pins of all the candidates - -3) if there are different pins cancel those candidates with a non-maximal pin - (i.e., let pin_max = max { pin(candidate) : candidate in candidates }, - and new candidates are those with pin(candidate) = pin_max) - -4) within all the remaining candidates choose the one with the highest - revision number - - -======================================== - -Consequences of the above: -- no source: part necessary in the revisions -- packages can be pinned to a specific source, and will not be updated - even if another source ships a higher version number -- no changes to the general server infrastructure are needed -- default installations continue as before -- normal installations with multiple sources but without pinning will - simply *do*the*right*thing*, namely install the highest revision number. -[karl: it's unclear to me that that is the right thing, in general, but - I can see how it is the right thing in some cases, e.g., yours, so fine.] -[norbert: see above ... I don't see the wrong point ;-) ] diff --git a/Master/tlpkg/dev/dev.multi-source-support.patch b/Master/tlpkg/dev/dev.multi-source-support.patch deleted file mode 100644 index 9e96668d938..00000000000 --- a/Master/tlpkg/dev/dev.multi-source-support.patch +++ /dev/null @@ -1,722 +0,0 @@ ---- /src/TeX/texlive-svn/Master/tlpkg/TeXLive/TLPDB.pm 2008-09-06 19:11:52.000000000 +0200 -+++ tlpkg/TeXLive/TLPDB.pm 2008-09-09 15:11:23.000000000 +0200 -@@ -819,26 +819,25 @@ - =cut - - sub _set_option_value { -- my ($self,$key,$value) = @_; -+ my ($self,$key,@values) = @_; - my $pkg = $self->{'tlps'}{'00texlive-installation.config'}; - my @newdeps; - if (!defined($pkg)) { - $pkg = new TeXLive::TLPOBJ; - $pkg->name("00texlive-installation.config"); - $pkg->category("TLCore"); -- push @newdeps, "$key:$value"; -+ for my $v (@values) { -+ push @newdeps, "$key:$v"; -+ } - } else { - my $found = 0; - foreach my $d ($pkg->depends) { -- if ($d =~ m!^$key:!) { -- $found = 1; -- push @newdeps, "$key:$value"; -- } else { -+ if ($d !~ m!^$key:!) { - push @newdeps, $d; - } - } -- if (!$found) { -- push @newdeps, "$key:$value"; -+ for my $v (@values) { -+ push @newdeps, "$key:$v"; - } - } - $pkg->depends(@newdeps); -@@ -847,13 +846,14 @@ - - sub _option_value { - my ($self,$key) = @_; -+ my @l = (); - if (defined($self->{'tlps'}{'00texlive-installation.config'})) { - foreach my $d ($self->{'tlps'}{'00texlive-installation.config'}->depends) { - if ($d =~ m!^$key:(.*)$!) { -- return "$1"; -+ push @l, "$1"; - } - } -- return ""; -+ return(wantarray ? @l : (@l ? $l[0] : "") ); - } - return; - } -@@ -889,15 +889,74 @@ - if (@_) { $self->_set_option_value("opt_paper", shift); } - return $self->_option_value("opt_paper"); - } --sub option_location { -- my $self = shift; -- if (@_) { $self->_set_option_value("location", shift); } -- my $loc = $self->_option_value("location"); -- if ($loc eq "__MASTER__") { -- return $self->root; -+# -+=pod -+ -+=item C<< $tlpdb->option_locations >> -+ -+Returns a list of tag and locations, so can be assigned to a hash. -+ -+=cut -+ -+sub option_locations { -+ my $self = shift; -+ if (@_) { -+ my %foo = @_; -+ my @l = (); -+ for my $k (keys %foo) { -+ if ($k eq $foo{$k}) { -+ # no specific tag -+ push @l, "$k"; -+ } else { -+ push @l, "$foo{$k} $k"; -+ } -+ } -+ $self->_set_option_value("location", @l); - } -- return $self->_option_value("location"); -+ my @locs = $self->_option_value("location"); -+ # the locations might contain a tag, the lines are of format -+ # location tag -+ my @ret = (); -+ for my $l (@locs) { -+ my $loc; -+ my $tag; -+ if ($l =~ m/^([^ ]+)[[:space:]]+(.*)[[:space:]]*$/) { -+ $loc = "$1"; -+ $tag = "$2"; -+ debug("reading locations, found loc=$loc, tag=$tag\n"); -+ } else { -+ $loc = $tag = $l; -+ } -+ # we return a hash as list ... -+ if ($loc eq "__MASTER__") { -+ push @ret, $self->root, $self->root; -+ } else { -+ push @ret, $tag, $loc; -+ } -+ } -+ return(@ret); -+} -+ -+sub add_locations { -+ my ($self, %locs) = @_; -+ my %foo = $self->option_locations; -+ for my $l (keys %locs) { -+ $foo{$l} = $locs{$l}; -+ } -+ $self->option_locations(%foo); -+ return(%foo); -+} -+ -+sub remove_locations { -+ my ($self, %locs) = @_; -+ my %foo = $self->option_locations; -+ for my $l (keys %locs) { -+ delete $foo{$l} -+ } -+ $self->option_locations(%foo); -+ return(%foo); - } -+ - sub option_sys_bin { - my $self = shift; - if (@_) { $self->_set_option_value("opt_sys_bin", shift); } ---- /src/TeX/texlive-svn/Master/texmf/scripts/texlive/tlmgr.pl 2008-09-08 17:19:03.000000000 +0200 -+++ texmf/scripts/texlive/tlmgr.pl 2008-09-10 15:54:25.000000000 +0200 -@@ -48,15 +48,19 @@ - - # used variables - # the TLMedia from which we install/update --my $tlmediasrc; -+my %tlmediasrc; - # the tlpdb of the install media --my $tlpdb; -+my %tlmediatlpdb; -+# flag indicating that the tlmedia has been loaded -+my $tlmedia_loaded = 0; -+# hash with *all* installable packages as keys and source as value -+my %media_packages; - # the local tlpdb - my $localtlpdb; - # a hash for saving the options saved into the local tlpdb - my %options; - # the location from where we install --my $location; -+my %locations; - - # option handling - my $opt_location; -@@ -133,6 +137,8 @@ - merge_into(\%ret, action_install()); - } elsif ($action =~ m/^update$/i) { - merge_into(\%ret, action_update()); -+} elsif ($action =~ m/^candidates$/i) { -+ action_candidates(); - } elsif ($action =~ m/^backup$/i) { - merge_into(\%ret, action_backup()); - } elsif ($action =~ m/^restore$/i) { -@@ -414,15 +420,13 @@ - } - init_local_db(); - foreach my $pkg (@ARGV) { -- my $tlmediatlpdb; - my $tlp = $localtlpdb->get_package($pkg); - my $installed = 0; - if (!$tlp) { -- if (!$tlmediatlpdb) { -- init_tlmedia(); -- $tlmediatlpdb = $tlmediasrc->tlpdb; -+ init_tlmedia(); -+ if (defined($media_packages{$pkg})) { -+ $tlp = $tlmediatlpdb{$media_packages{$pkg}}->get_package($pkg); - } -- $tlp = $tlmediatlpdb->get_package($pkg); - } else { - $installed = 1; - } -@@ -432,6 +436,7 @@ - print "ShortDesc: ", $tlp->shortdesc, "\n" if ($tlp->shortdesc); - print "LongDesc: ", $tlp->longdesc, "\n" if ($tlp->longdesc); - print "Installed: ", ($installed?"Yes\n":"No\n"); -+ print "Source: ", $media_packages{$pkg}, "\n" if (!$installed); - print "\n"; - } else { - printf STDERR "Cannot find $pkg\n"; -@@ -448,17 +453,22 @@ - "file" => \$opt_file) or pod2usage(2); - my $r = shift @ARGV; - my $ret = ""; -- my $tlpdb; -+ my @tlpdbs; -+ my %packs; - init_local_db(); - if ($opt_global) { - init_tlmedia(); -- $tlpdb = $tlmediasrc->tlpdb; -+ for my $p (keys %media_packages) { -+ $packs{$p} = $tlmediatlpdb{$media_packages{$p}}; -+ } - } else { -- $tlpdb = $localtlpdb; -+ for my $p ($localtlpdb->list_packages) { -+ $packs{$p} = $localtlpdb; -+ } - } -- foreach my $pkg ($tlpdb->list_packages) { -+ for my $pkg (keys %packs) { - if ($opt_file) { -- my @ret = grep(m;$r;, $tlpdb->get_package($pkg)->all_files); -+ my @ret = grep(m;$r;, $packs{$pkg}->get_package($pkg)->all_files); - if (@ret) { - print "$pkg:\n"; - foreach (@ret) { -@@ -467,9 +477,9 @@ - } - } else { - next if ($pkg =~ m/\./); -- my $t = $tlpdb->get_package($pkg)->shortdesc; -+ my $t = $packs{$pkg}->get_package($pkg)->shortdesc; - $t |= ""; -- my $lt = $tlpdb->get_package($pkg)->longdesc; -+ my $lt = $packs{$pkg}->get_package($pkg)->longdesc; - $lt |= ""; - if (($pkg =~ m/$r/) || ($t =~ m/$r/) || ($lt =~ m/$r/)) { - $ret .= " $pkg - $t\n"; -@@ -614,7 +624,6 @@ - "dry-run" => \$opt_dry) or pod2usage(2); - my %ret; - init_tlmedia(); -- my $mediatlpdb = $tlmediasrc->tlpdb; - my @todo; - if ($opt_all || $opt_list) { - @todo = $localtlpdb->list_packages; -@@ -625,19 +634,22 @@ - # we check for new packages - # loop over all installed collections - for my $c ($localtlpdb->collections) { -- my $tlc = $mediatlpdb->get_package($c); -- if (!defined($tlc)) { -+ my ($maxsrc, $maxrev) = install_candidate($c); -+ if (!defined($maxsrc)) { - debug("collection $c has disappeared from the network!\n"); -- } else { -- # take all the dependencies of the installed collection -- # *as*found* in the network tlpdb -- for my $d ($tlc->depends) { -- my $tlp = $localtlpdb->get_package($d); -- if (!defined($tlp)) { -- # there is a dep that is either new or has been forcibly removed -- # report it as new/forcibly removed -- info("package $d ($c) is new (or has been forcibly removed)\n"); -- } -+ next; -+ } -+ my $tlc = $tlmediatlpdb{$maxsrc}->get_package($c); -+ if (!defined($tlc)) { -+ debug("That should not happen!!!\n"); -+ next; -+ } -+ for my $d ($tlc->depends) { -+ my $tlp = $localtlpdb->get_package($d); -+ if (!defined($tlp)) { -+ # there is a dep that is either new or has been forcibly removed -+ # report it as new/forcibly removed -+ info("package $d ($c) is new (or has been forcibly removed)\n"); - } - } - } -@@ -655,18 +667,22 @@ - next; - } - my $rev = $tlp->revision; -- my $mediatlp = $mediatlpdb->get_package($pkg); -- if (!defined($mediatlp)) { -- debug("$pkg cannot be found in $location\n"); -+ my ($maxsrc, $maxrev) = install_candidate($pkg); -+ if (!defined($maxsrc)) { -+ debug("$pkg cannot be found in any of " . values(%locations). "\n"); - next; - } -- my $mediarev = $mediatlp->revision; -- if ($rev < $mediarev) { -+ # if $maxsrc is defined then there is an installation candidate with -+ # an higher revision number -+ if ($rev < $maxrev) { -+ my $tlmediasrc = $tlmediasrc{$maxsrc}; -+ my $tlmediatlpdb = $tlmediatlpdb{$maxsrc}; -+ my $mediarev = $maxrev; - $nrupdated++; - if ($opt_list) { -- print "$pkg: local: $rev, source: $mediarev\n"; -+ print "$pkg: local: $rev, source: $mediarev ($maxsrc)\n"; - } elsif ($opt_dry) { -- print "Installing $pkg\n"; -+ print "Installing $pkg ($maxsrc)\n"; - } else { - # first remove the package, then reinstall it - # this way we get rid of useless files -@@ -706,7 +722,7 @@ - # these packages cannot be upgrade on win32 - # so we have to create a update program - my $media = $tlmediasrc->media; -- my $remoteroot = $mediatlpdb->root; -+ my $remoteroot = $tlmediatlpdb->root; - my $root = $localtlpdb->root; - my $temp = "$root/temp"; - TeXLive::TLUtils::mkdirhier($temp); -@@ -740,8 +756,8 @@ - print "update: $pkg done\n"; - } - } -- } elsif ($rev > $mediarev) { -- print "$pkg: revision in $location is less then local revision, not updating!\n"; -+ } else { -+ debug("$pkg: no installation candidate with higher rev found!\n"); - next; - } - } -@@ -761,17 +777,50 @@ - ); - tlwarn("UPDATER has been created, please execute tlpkg\\installer\\updater.bat\n"); - } -- if (($nrupdated == 0) && ($tlmediasrc->media ne "NET") && $opt_all) { -- # for all but net updates we warn if nothing is updated -- tlwarn("\nYour installation is set up to look on the disk for updates.\n"); -- tlwarn("If you want to install from the Internet for this one time only, run\n"); -- tlwarn(" tlmgr -location $TeXLiveURL\n"); -- tlwarn("\nIf you want to change the default for all future updates, run\n"); -- tlwarn(" tlmgr option location $TeXLiveURL\n\n"); -+ if (($nrupdated == 0) && $opt_all) { -+ my $any_net = 0; -+ for my $tm (values(%tlmediasrc)) { -+ if ($tm->media eq "NET") { -+ $any_net = 1; -+ last; -+ } -+ } -+ if (!$any_net) { -+ # for all but net updates we warn if nothing is updated -+ tlwarn("\nTEXT OUTDATED NEEDS REMARK FOR MULTIPLE LOCATIONS!!!\n"); -+ tlwarn("\nYour installation is set up to look on the disk for updates.\n"); -+ tlwarn("If you want to install from the Internet for this one time only, run\n"); -+ tlwarn(" tlmgr -location $TeXLiveURL\n"); -+ tlwarn("\nIf you want to change the default for all future updates, run\n"); -+ tlwarn(" tlmgr option location $TeXLiveURL\n\n"); -+ } - } - return(\%ret); - } - -+sub action_candidates { -+ init_local_db(1); -+ init_tlmedia(); -+ foreach my $pkg (@ARGV) { -+ my @l = (); -+ for my $s (keys %tlmediasrc) { -+ my $tlp = $tlmediatlpdb{$s}->get_package($pkg); -+ if ($tlp) { -+ push @l, "$s (" . $tlp->revision . ")"; -+ } -+ } -+ if (@l) { -+ print "$pkg:\n"; -+ for my $f (@l) { -+ print "\t$f\n"; -+ } -+ } else { -+ print "No installation candidate for $pkg\ņ"; -+ } -+ } -+} -+ -+ - sub action_install { - if ($opt_gui) { - action_gui("install"); -@@ -786,11 +835,38 @@ - my %ret; - init_tlmedia(); - foreach my $pkg (@ARGV) { -+ my $package = $pkg; -+ my $tag; -+ my $maxsrc; -+ if ($pkg =~ m!^([^/]+)/(.*)$!) { -+ $package = "$1"; -+ $tag = "$2"; -+ if (defined($tlmediatlpdb{$tag})) { -+ if (defined($tlmediatlpdb{$tag}->get_package($package))) { -+ # we can actually install from there -+ $maxsrc = $tag; -+ } else { -+ tlwarn("Package $package not found in source $tag\n"); -+ tlwarn("Skipping installation of $pkg\n"); -+ next; -+ } -+ } else { -+ tlwarn("The tag $tag for installing $package is not defined!\n"); -+ tlwarn("Skipping installation of $pkg\n"); -+ next; -+ } -+ } else { -+ ($maxsrc) = install_candidate($pkg); -+ if (!defined($maxsrc)) { -+ tlwarn("No installation candidate for $pkg found!\n"); -+ } -+ } -+ - if ($opt_dry) { -- print "install: $pkg\n"; -+ print "install: $package (from $maxsrc)\n"; - } else { - # install the packages and run postinstall actions (that is the 0) -- merge_into(\%ret, $tlmediasrc->install_package($pkg, $localtlpdb, $opt_nodepends, 0)); -+ merge_into(\%ret, $tlmediasrc{$maxsrc}->install_package($package, $localtlpdb, $opt_nodepends, 0)); - } - } - if ($opt_dry) { -@@ -805,13 +881,17 @@ - my $what = shift @ARGV; - $what || ($what = ""); - init_tlmedia(); -- my @whattolist; -+ my @whattolist = (); - if ($what =~ m/^collection/i) { -- @whattolist = $tlmediasrc->tlpdb->collections; -+ for my $s (values %tlmediatlpdb) { -+ push @whattolist, $s->collections; -+ } - } elsif ($what =~ m/^scheme/i) { -- @whattolist = $tlmediasrc->tlpdb->schemes; -+ for my $s (values %tlmediatlpdb) { -+ push @whattolist, $s->schemes; -+ } - } else { -- @whattolist = $tlmediasrc->tlpdb->list_packages; -+ @whattolist = keys(%media_packages); - } - foreach (@whattolist) { - if (defined($localtlpdb->get_package($_))) { -@@ -819,7 +899,7 @@ - } else { - print " "; - } -- my $foo = $tlmediasrc->tlpdb->get_package($_)->shortdesc; -+ my $foo = $tlmediatlpdb{$media_packages{$_}}->get_package($_)->shortdesc; - print "$_: ", defined($foo) ? $foo : "(shortdesc missing)" , "\n"; - } - return; -@@ -833,17 +913,68 @@ - $what = "show" unless defined($what); - init_local_db(); - if ($what =~ m/^location$/i) { -- # changes the default location -- my $loc = shift @ARGV; -- if ($loc) { -- # normalize the path -- $loc = abs_path($loc); -- print "Setting default installation source to $loc!\n"; -- $localtlpdb->option_location($loc); -- $localtlpdb->save; -+ # the location argument is treated as follows -+ # location loc1 loc2 loc3 -+ # location loc1,loc2,loc3 -+ # sets the list of locations to these three -+ # location add loc1 [loc2 ...] -+ # add the location loc to the list -+ # location remove loc1 [loc2 ...] -+ # remove the location from the list -+ my $first = shift @ARGV; -+ $first || ($first = "show"); -+ my $mode = "replace"; -+ my @locargs = (); -+ if ($first =~ m/^add$/i) { $mode = "add"; } -+ elsif ($first =~ m/^remove$/i) { $mode = "remove"; } -+ else { push @locargs, $first unless ($first eq "show"); } -+ push @locargs, @ARGV; -+ my @locs; -+ for my $a (@locargs) { -+ push @locs, split(/,/,$a); -+ } -+ my %locs; -+ for my $l (@locs) { -+ if ($l =~ m;^(.+)=(.+)$;) { -+ $locs{$2} = "$1"; -+ } else { -+ $locs{$l} = $l; -+ } -+ } -+ if ($mode eq "add") { -+ if (@locs) { -+ print "Adding @locs to the list of installation sources!\n"; -+ $localtlpdb->add_locations(%locs); -+ } else { -+ tlwarn("Need some argument for location add!\n"); -+ exit(1); -+ } -+ } elsif ($mode eq "remove") { -+ if (@locs) { -+ print "Removing @locs from the list of installation sources!\n"; -+ $localtlpdb->remove_locations(%locs); -+ } else { -+ tlwarn("Need some argument for location remove!\n"); -+ exit(1); -+ } - } else { -- print "Default installation source: ", $localtlpdb->option_location, "\n"; -+ if (@locs) { -+ print "Settings @locs as list of installation sources!\n"; -+ $localtlpdb->option_locations(%locs); -+ } else { -+ my %lo = $localtlpdb->option_locations; -+ for my $t (keys %lo) { -+ print "Installation source: "; -+ if ($t eq $lo{$t}) { -+ # no tag specified -+ print "$t\n"; -+ } else { -+ print "$lo{$t} (tag $t)\n"; -+ } -+ } -+ } - } -+ $localtlpdb->save; - } elsif ($what =~ m/^docfiles$/i) { - # changes the default docfiles - my $loc = shift @ARGV; -@@ -903,10 +1034,16 @@ - # list the available architectures - # initialize the TLMedia from $location - init_tlmedia(); -- my $mediatlpdb = $tlmediasrc->tlpdb; -+ # collect all available architectures from all media sources -+ my %avail_archs; -+ for my $tlpdb (values %tlmediatlpdb) { -+ for my $a ($tlpdb->available_architectures) { -+ $avail_archs{$a} = 1; -+ } -+ } - my @already_installed_arch = $localtlpdb->available_architectures; - print "Available architectures:\n"; -- foreach my $a ($mediatlpdb->available_architectures) { -+ foreach my $a (keys %avail_archs) { - if (member($a,@already_installed_arch)) { - print "(i) $a\n"; - } else { -@@ -918,9 +1055,15 @@ - exit(0); - } elsif ($what =~ m/^add$/i) { - init_tlmedia(); -- my $mediatlpdb = $tlmediasrc->tlpdb; -+ # collect all available architectures from all media sources -+ my %avail_archs; -+ for my $tlpdb (values %tlmediatlpdb) { -+ for my $a ($tlpdb->available_architectures) { -+ $avail_archs{$a} = 1; -+ } -+ } - my @already_installed_arch = $localtlpdb->available_architectures; -- my @available_arch = $mediatlpdb->available_architectures; -+ my @available_arch = keys %avail_archs; - my @todoarchs; - foreach my $a (@ARGV) { - if (TeXLive::TLUtils::member($a, @already_installed_arch)) { -@@ -943,7 +1086,13 @@ - if ($opt_dry) { - print "Installing $pkg.$a\n"; - } else { -- merge_into(\%ret, $tlmediasrc->install_package("$pkg.$a", $localtlpdb, 0, 0)); -+ my ($maxsrc) = install_candidate("$pkg.$a"); -+ if (defined($maxsrc)) { -+ debug("pkg = $pkg, maxsrc = $maxsrc\n"); -+ merge_into(\%ret, $tlmediasrc{$maxsrc}->install_package("$pkg.$a", $localtlpdb, 0, 0)); -+ } else { -+ tlwarn("No installation candidate for $pkg on $a found!\n"); -+ } - } - } - } -@@ -951,9 +1100,14 @@ - } - if (TeXLive::TLUtils::member('win32', @todoarchs)) { - # install the necessary win32 stuff -- merge_into (\%ret, $tlmediasrc->install_package("bin-tlperl.win32", $localtlpdb, 1, 0)); -- merge_into (\%ret, $tlmediasrc->install_package("bin-tlgs.win32", $localtlpdb, 1, 0)); -- merge_into (\%ret, $tlmediasrc->install_package("bin-tlpsv.win32", $localtlpdb, 1, 0)); -+ for my $p (qw/bin-tlperl bin-tlgs bin-tlpsv/) { -+ my ($maxsrc) = install_candidate("bin-tlperl.win32"); -+ if (defined($maxsrc)) { -+ merge_into (\%ret, $tlmediasrc{$maxsrc}->install_package("$p.win32", $localtlpdb, 1, 0)); -+ } else { -+ tlwarn("No installation candidate for $p on win32 found!\n"); -+ } -+ } - } - # update the option_archs list of installed archs - my @larchs = $localtlpdb->option_available_architectures; -@@ -1026,18 +1180,30 @@ - } - } - # let cmd line options override the settings in localtlpdb -- my $loc = $localtlpdb->option_location; -- if (defined($loc)) { -- $location = $loc; -- } -+ %locations = $localtlpdb->option_locations; - if (defined($opt_location)) { -- $location = $opt_location; -+ %locations = (); -+ for my $c (split /,/, $opt_location) { -+ $locations{$c} = $c; -+ } - } -- if (!defined($location)) { -+ if (! keys(%locations)) { - die("No installation source found, nor in the texlive.tlpdb nor on the cmd line.\nPlease specify one!"); - } -- # normalize the location -- $location = abs_path($location); -+ # normalize all paths -+ for my $c (keys %locations) { -+ if ($c eq $locations{$c}) { -+ my $newc = abs_path($c); -+ if ($c ne $newc) { -+ delete $locations{$c}; -+ $locations{$newc} = $newc; -+ } -+ } else { -+ my $foo = $locations{$c}; -+ $foo = abs_path($foo); -+ $locations{$c} = $foo; -+ } -+ } - } - - sub action_gui { -@@ -1209,18 +1375,66 @@ - # initialize a tlmedia object and returns it, or dies - # - sub init_tlmedia { -- if (($location =~ m/$TeXLiveServerURL/) || -- ($location =~ m/^ctan$/i)) { -- $location = give_ctan_mirror(); -- info("Using mirror $location\n"); -- } -- # $tlmediasrc is a global function -- $tlmediasrc = TeXLive::TLMedia->new($location); -- die($loadmediasrcerror . $location) unless defined($tlmediasrc); -+ return if $tlmedia_loaded; -+ my $found = 0; -+ for my $t (keys %locations) { -+ my $l = $locations{$t}; -+ my $location = $l; -+ if (($location =~ m/$TeXLiveServerURL/) || -+ ($location =~ m/^ctan$/i)) { -+ $location = give_ctan_mirror(); -+ info("Using mirror $location\n"); -+ } -+ # $tlmediasrc is a global function -+ $tlmediasrc{$t} = TeXLive::TLMedia->new($location); -+ if (defined($tlmediasrc{$t})) { -+ $found++; -+ $tlmediatlpdb{$t} = $tlmediasrc{$t}->tlpdb; -+ } else { -+ info($loadmediasrcerror . $location); -+ } -+ } -+ if (!$found) { -+ # we didn't find any useable installation media, die here! -+ die("Cannot find any useable installation source in one of the following locations:\n", values(%locations), "\nStopping here!"); -+ } -+ # now we initialize the %media_packages -+ my @allpkgs; -+ for my $s (keys %tlmediasrc) { -+ # will create duplicate entries, but who cares, we are doing hashing then -+ push @allpkgs, $tlmediatlpdb{$s}->list_packages; -+ } -+ for my $p (@allpkgs) { -+ next if defined($media_packages{$p}); -+ next if ($p =~ m/00texlive/); -+ ($media_packages{$p}) = install_candidate($p); -+ } -+ $tlmedia_loaded = 1; - } - - -- -+# -+# -+sub install_candidate { -+ my $pkg = shift; -+ my $maxrev = -1; -+ my $maxsrc; -+ for my $s (keys %tlmediasrc) { -+ my $tlp = $tlmediatlpdb{$s}->get_package($pkg); -+ if ($tlp) { -+ my $r = $tlp->revision; -+ if ($maxrev < $r) { -+ $maxrev = $r; -+ $maxsrc = $s; -+ } -+ } -+ } -+ if ($maxsrc) { -+ # something was found ($maxsrc, $maxrev, $maxtlp, $maxtlmedia) -+ return ($maxsrc, $maxrev, $tlmediatlpdb{$maxsrc}->get_package($pkg), $tlmediasrc{$maxsrc}); -+ } -+ return; -+} - - # - # return all the directories from which all content will be removed diff --git a/Master/tlpkg/dev/dev.multi-source-support.patches/001-extend-tlpdb-option-location-field-add-action b/Master/tlpkg/dev/dev.multi-source-support.patches/001-extend-tlpdb-option-location-field-add-action deleted file mode 100644 index aa280988c7d..00000000000 --- a/Master/tlpkg/dev/dev.multi-source-support.patches/001-extend-tlpdb-option-location-field-add-action +++ /dev/null @@ -1,128 +0,0 @@ -Allow more than one repository in the tlpdb/option-location field -The format is: - repo1[#tag] repo2[#tag] ... -the tags are optional. -This patch only adds support for a new action "repository" that lists, -adds, removes, sets repositories according to this format. -It does not change tlmgr to allow actually working with it. ---- - texmf/scripts/texlive/tlmgr.pl | 99 +++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 99 insertions(+) - -Index: Master/texmf/scripts/texlive/tlmgr.pl -=================================================================== ---- Master.orig/texmf/scripts/texlive/tlmgr.pl 2010-05-02 01:31:56.000000000 +0900 -+++ Master/texmf/scripts/texlive/tlmgr.pl 2010-05-02 01:32:12.000000000 +0900 -@@ -455,6 +455,9 @@ - } elsif ($action =~ m/^option$/i) { - action_option(); - finish(0); -+ } elsif ($action =~ m/^repository$/i) { -+ action_repository(); -+ finish(0); - } elsif ($action =~ m/^list$/i) { - action_list(); - finish(0); -@@ -2839,6 +2842,102 @@ - return; - } - -+# REPOSITORY -+# -+# this action manages the list of repositories -+# tlmgr repository list -> lists repositories -+# tlmgr repository add path [tag] -> add repository with optional tag -+# tlmgr repository remove [path|tag] -> removes repository or tag -+# tlmgr repository set path[#tag] [path[#tag] ...] -> sets the list -+# -+ -+sub array_to_repository { -+ my %r = @_; -+ my @ret; -+ for my $k (keys %r) { -+ my $v = $r{$k}; -+ if ($k eq $v) { -+ push @ret, $k; -+ } else { -+ push @ret, "$v#$k"; -+ } -+ } -+ return "@ret"; -+} -+sub repository_to_array { -+ my $r = shift; -+ my %r; -+ for my $rr (split ' ', $r) { -+ if ($rr =~ m/^([^#]+)#(.*)$/) { -+ $r{$2} = $1; -+ } else { -+ $r{$rr} = $rr; -+ } -+ } -+ return %r; -+} -+sub action_repository { -+ init_local_db(); -+ my $what = shift @ARGV; -+ my %repos = repository_to_array($localtlpdb->option("location")); -+ if ($what =~ m/^list$/i) { -+ print "List of repositories (with tags if set):\n"; -+ for my $k (keys %repos) { -+ my $v = $repos{$k}; -+ print "\t$v"; -+ if ($k ne $v) { -+ print " ($k)"; -+ } -+ print "\n"; -+ } -+ return; -+ } -+ if ($what eq "add") { -+ my $p = shift @ARGV; -+ if (!defined($p)) { -+ tlwarn("You need to give a new repository aas argument to add\n"); -+ return; -+ } -+ my $t = shift @ARGV; -+ $t = $p if (!defined($t)); -+ if (defined($repos{$t})) { -+ tlwarn("This repository or its tag is already defined, no action\n"); -+ return; -+ } -+ # TODO more checks needed? -+ $repos{$t} = $p; -+ $localtlpdb->option("location", array_to_repository(%repos)); -+ $localtlpdb->save; -+ return; -+ } -+ if ($what eq "remove") { -+ my $p = shift @ARGV; -+ if (!defined($p)) { -+ tlwarn("Which repository should be removed?\n"); -+ return; -+ } -+ my $found = 0; -+ for my $k (keys %repos) { -+ if ($k eq $p || $repos{$k} eq $p) { -+ $found = 1; -+ delete $repos{$k}; -+ } -+ } -+ if (!$found) { -+ tlwarn("Cannot find the repository $p\n"); -+ } else { -+ $localtlpdb->option("location", array_to_repository(%repos)); -+ $localtlpdb->save; -+ } -+ return; -+ } -+ if ($what eq "set") { -+ %repos = repository_to_array("@ARGV"); -+ $localtlpdb->option("location", array_to_repository(%repos)); -+ $localtlpdb->save; -+ } -+} -+ - - # OPTION - # diff --git a/Master/tlpkg/dev/dev.multi-source-support.patches/010-add-action-candidates-mediahash b/Master/tlpkg/dev/dev.multi-source-support.patches/010-add-action-candidates-mediahash deleted file mode 100644 index bbfee51b84e..00000000000 --- a/Master/tlpkg/dev/dev.multi-source-support.patches/010-add-action-candidates-mediahash +++ /dev/null @@ -1,243 +0,0 @@ -Add tlmediasrcs etc hashes that collect all the available hashes, and -add init_tlmedias that initializes all these hashs. -Adapt init_tlmedia to work in both cases (old style/new style) -add action "candidates" for checking which packages are available ---- - texmf/scripts/texlive/tlmgr.pl | 123 ++++++++++++++++++++++++++++++++++------- - 1 file changed, 102 insertions(+), 21 deletions(-) - -Index: Master/texmf/scripts/texlive/tlmgr.pl -=================================================================== ---- Master.orig/texmf/scripts/texlive/tlmgr.pl 2010-05-02 02:02:39.000000000 +0900 -+++ Master/texmf/scripts/texlive/tlmgr.pl 2010-05-02 02:02:43.000000000 +0900 -@@ -91,8 +91,13 @@ - - our %config; # hash of config settings from config file - our $tlmediasrc; # media from which we install/update -+our %tlmediasrcs; - our $tlmediatlpdb; -+our %tlmediatlpdbs; - our $location; # location from which the new packages come -+our %locations; -+# hash with *all* installable packages as keys and source as value -+our %media_packages; - our $localtlmedia; # local installation which we are munging - our $localtlpdb; # local installation which we are munging - -@@ -458,6 +463,9 @@ - } elsif ($action =~ m/^repository$/i) { - action_repository(); - finish(0); -+ } elsif ($action =~ m/^candidates$/i) { -+ action_candidates(); -+ finish(0); - } elsif ($action =~ m/^list$/i) { - action_list(); - finish(0); -@@ -3120,6 +3128,32 @@ - } - - -+# CANDIDATES -+# -+sub action_candidates { -+ init_local_db(1); -+ init_tlmedias(); -+ foreach my $pkg (@ARGV) { -+ my @l = (); -+ for my $s (keys %tlmediasrcs) { -+ info("trying $s ...\n"); -+ my $tlp = $tlmediatlpdbs{$s}->get_package($pkg); -+ if ($tlp) { -+ push @l, "$s (" . $tlp->revision . ")"; -+ } -+ } -+ if (@l) { -+ info("$pkg:\n"); -+ for my $f (@l) { -+ info("\t$f\n"); -+ } -+ } else { -+ info("No installation candidate for $pkg\n"); -+ } -+ } -+} -+ -+ - # ARCH - # - sub action_arch { -@@ -4228,28 +4262,53 @@ - } - - -+sub init_tlmedias -+{ -+ %locations = repository_to_array($localtlpdb->option("location")); -+ for my $l (keys %locations) { -+ printf "Init $l\n"; -+ init_tlmedia($l); -+ } -+} -+ - # initialize the global $tlmediasrc object, or die. - # uses the global $location. - # - sub init_tlmedia - { -- if (defined($tlmediatlpdb) && ($tlmediatlpdb->root eq $location)) { -+ my $tag = shift; -+ # defaults for normal operation with one location setting -+ my $loc = $location; -+ my $tlmdb = $tlmediatlpdb; -+ # if a tag is given, so called via init_tlmedias, redefine the settings -+ if (defined($tag)) { -+ $loc = $locations{$tag}; -+ $tlmdb = $tlmediatlpdbs{$tag}; -+ } -+ -+ -+ if (defined($tlmdb) && ($tlmdb->root eq $loc)) { - # nothing to be done - return; - } - - # choose a mirror if we are asked. -- if ($location =~ m/^ctan$/i) { -- $location = give_ctan_mirror(); -- } elsif ($location =~ m,^$TeXLiveServerURL,) { -+ if ($loc =~ m/^ctan$/i) { -+ $loc = give_ctan_mirror(); -+ } elsif ($loc =~ m,^$TeXLiveServerURL,) { - my $mirrorbase = TeXLive::TLUtils::give_ctan_mirror_base(); -- $location =~ s,^$TeXLiveServerURL,$mirrorbase,; -+ $loc =~ s,^$TeXLiveServerURL,$mirrorbase,; -+ } -+ # -+ # if we are in the normal case do not forget to update the locations -+ if (!defined($tag)) { -+ $location = $loc; - } - - # this "location-url" line should not be changed since GUI programs - # depend on it: -- print "location-url\t$location\n" if $::machinereadable; -- info("tlmgr: package repository $location\n"); -+ print "location-url\t$loc\n" if $::machinereadable; -+ info("tlmgr: package repository $loc\n"); - - # if we talk about a net location try to download the hash of the tlpdb - # - if that is possible, check for the locally saved file and if the hash -@@ -4260,9 +4319,9 @@ - # not work - - my $local_copy_tlpdb_used = 0; -- if ($location =~ m;^(http|ftp)://;) { -+ if ($loc =~ m;^(http|ftp)://;) { - # first check that the saved tlpdb is present at all -- my $loc_digest = Digest::MD5::md5_hex($location); -+ my $loc_digest = Digest::MD5::md5_hex($loc); - my $loc_copy_of_remote_tlpdb = - "$Master/$InfraLocation/texlive.tlpdb.$loc_digest"; - ddebug("loc_digest = $loc_digest\n"); -@@ -4271,7 +4330,7 @@ - ddebug("loc copy found!\n"); - # we found the tlpdb matching the current location - # check for the remote hash -- my $path = "$location/$InfraLocation/$DatabaseName.md5"; -+ my $path = "$loc/$InfraLocation/$DatabaseName.md5"; - ddebug("remote path of digest = $path\n"); - my $fh = TeXLive::TLUtils::download_file($path, "|"); - my $rem_digest; -@@ -4288,8 +4347,14 @@ - END_NO_INTERNET - # above text duplicated in TLPDB.pm, sorry. - -- $tlmediasrc = TeXLive::TLMedia->new(-location => $location, -- -tlpdbfile => $loc_copy_of_remote_tlpdb); -+ if (defined($tag)) { -+ $tlmediasrcs{$tag} = TeXLive::TLMedia->new(-location => $loc, -+ -tlpdbfile => $loc_copy_of_remote_tlpdb); -+ } else { -+ $tlmediasrc = TeXLive::TLMedia->new(-location => $loc, -+ -tlpdbfile => $loc_copy_of_remote_tlpdb); -+ } -+ - $local_copy_tlpdb_used = 1; - } else { - ddebug("found remote digest: $rem_digest\n"); -@@ -4297,8 +4362,13 @@ - ddebug("rem_copy_digest = $rem_copy_digest\n"); - if ($rem_copy_digest eq $rem_digest) { - debug("md5 of local copy identical with remote hash\n"); -- $tlmediasrc = TeXLive::TLMedia->new(-location => $location, -+ if (defined($tag)) { -+ $tlmediasrcs{$tag} = TeXLive::TLMedia->new(-location => $loc, - -tlpdbfile => $loc_copy_of_remote_tlpdb); -+ } else { -+ $tlmediasrc = TeXLive::TLMedia->new(-location => $loc, -+ -tlpdbfile => $loc_copy_of_remote_tlpdb); -+ } - $local_copy_tlpdb_used = 1; - } - } -@@ -4306,23 +4376,34 @@ - } - if (!$local_copy_tlpdb_used) { - # $tlmediasrc is a global variable -- $tlmediasrc = TeXLive::TLMedia->new(-location => $location); -+ if (defined($tag)) { -+ $tlmediasrcs{$tag} = TeXLive::TLMedia->new(-location => $loc); -+ } else { -+ $tlmediasrc = TeXLive::TLMedia->new(-location => $loc); -+ } -+ } -+ if (defined($tag)) { -+ die($loadmediasrcerror . $location) unless defined($tlmediasrcs{$tag}); -+ $tlmediatlpdbs{$tag} = $tlmediasrcs{$tag}->tlpdb; -+ $tlmdb = $tlmediatlpdbs{$tag}; -+ } else { -+ die($loadmediasrcerror . $location) unless defined($tlmediasrc); -+ $tlmediatlpdb = $tlmediasrc->tlpdb; -+ $tlmdb = $tlmediatlpdb; - } -- die($loadmediasrcerror . $location) unless defined($tlmediasrc); -- $tlmediatlpdb = $tlmediasrc->tlpdb; - # if the release from the remote TLPDB does not agree with the - # TLConfig::ReleaseYear in the first 4 places break out here. - # Why only the first four places: some optional network distributions - # might use - # release/2009-foobar -- my $texlive_release = $tlmediatlpdb->config_release; -+ my $texlive_release = $tlmdb->config_release; - if (!defined($texlive_release) || - $texlive_release !~ m/^$TeXLive::TLConfig::ReleaseYear/) { - die "The release version of the installation source and the installation media\ndo not agree: source: $texlive_release, media: $TeXLive::TLConfig::ReleaseYear\nPlease fix your location $location"; - } - - # check for being frozen -- if ($tlmediatlpdb->option("frozen")) { -+ if ($tlmdb->option("frozen")) { - my $frozen_msg = <<FROZEN; - TeX Live $TeXLive::TLConfig::ReleaseYear is frozen and will not be - updated anymore. This happens in preparation for a new release. -@@ -4337,8 +4418,8 @@ - # save remote database if it is a net location - # make sure that the writeout of the tlpdb is done in UNIX mode - # since otherwise the sha256 will change. -- if (!$local_copy_tlpdb_used && $location =~ m;^(http|ftp)://;) { -- my $loc_digest = Digest::MD5::md5_hex($location); -+ if (!$local_copy_tlpdb_used && $loc =~ m;^(http|ftp)://;) { -+ my $loc_digest = Digest::MD5::md5_hex($loc); - my $loc_copy_of_remote_tlpdb = - "$Master/$InfraLocation/texlive.tlpdb.$loc_digest"; - my $tlfh; -@@ -4349,7 +4430,7 @@ - &debug("Cannot save remote TeX Live database to $loc_copy_of_remote_tlpdb: $!\n"); - } else { - &debug("writing out tlpdb to $loc_copy_of_remote_tlpdb\n"); -- $tlmediatlpdb->writeout($tlfh); -+ $tlmdb->writeout($tlfh); - close($tlfh); - } - } diff --git a/Master/tlpkg/dev/dev.multi-source-support.patches/020-add-pinning-file-support b/Master/tlpkg/dev/dev.multi-source-support.patches/020-add-pinning-file-support deleted file mode 100644 index fabbfc6ad49..00000000000 --- a/Master/tlpkg/dev/dev.multi-source-support.patches/020-add-pinning-file-support +++ /dev/null @@ -1,156 +0,0 @@ -add support for TEXMFSYSCONFIG/tlmgr/pinning -show the available pins in tlmgr candidate and mark the winning one with * ---- - texmf/scripts/texlive/tlmgr.pl | 102 +++++++++++++++++++++++++++++++++++++++-- - 1 file changed, 99 insertions(+), 3 deletions(-) - -Index: Master/texmf/scripts/texlive/tlmgr.pl -=================================================================== ---- Master.orig/texmf/scripts/texlive/tlmgr.pl 2010-05-05 03:22:16.000000000 +0900 -+++ Master/texmf/scripts/texlive/tlmgr.pl 2010-05-05 03:22:24.000000000 +0900 -@@ -71,6 +71,7 @@ - - use Cwd qw/abs_path/; - use Digest::MD5; -+use Text::Glob qw( match_glob); - use Pod::Usage; - use Getopt::Long qw(:config no_autoabbrev permute); - use strict; -@@ -90,6 +91,7 @@ - binmode(STDERR, ":utf8"); - - our %config; # hash of config settings from config file -+our %Pin; # $pin{$tag}{$package} - our $tlmediasrc; # media from which we install/update - our %tlmediasrcs; - our $tlmediatlpdb; -@@ -333,6 +335,9 @@ - # load the config file and set the config options - # load it BEFORE starting downloads as we seet persistent-downloads there! - load_config_file(); -+ # -+ # load pinning file -+ load_pinning_file(); - - # - # if we are asked to use persistent connections try to start it here -@@ -3134,18 +3139,28 @@ - init_local_db(1); - init_tlmedias(); - foreach my $pkg (@ARGV) { -- my @l = (); -+ my %pkgpin = (); -+ my %revs = (); -+ my $maxsrc = ""; -+ my $maxpin = "-1"; - for my $s (keys %tlmediasrcs) { - info("trying $s ...\n"); - my $tlp = $tlmediatlpdbs{$s}->get_package($pkg); - if ($tlp) { -- push @l, "$s (" . $tlp->revision . ")"; -+ $revs{$s} = $tlp->revision; -+ $pkgpin{$s} = get_pin($s,$pkg); -+ if ($maxpin < $pkgpin{$s}) { -+ $maxsrc = $s; -+ $maxpin = $pkgpin{$s}; -+ } - } - } -+ my @l = sort keys %pkgpin; - if (@l) { - info("$pkg:\n"); - for my $f (@l) { -- info("\t$f\n"); -+ info(($f eq $maxsrc ? "\t*" : "\t ")); -+ info("$f ($revs{$f}) [$pkgpin{$f}]\n"); - } - } else { - info("No installation candidate for $pkg\n"); -@@ -4541,6 +4556,87 @@ - close(TLC); - } - -+# -+# pinning file handling -+# location -+# TEXMFSYSCONFIG/tlmgr/pinning -+# (it is only globally useful!) -+# format -+# # are comments -+# empty lines are ignored -+# package:tag:pin -+# where package is a glob, tag a tag (no * allowed, what for!), -+# pin between 0 and 1000 -+# tags identify repositories, so they can also be the urls -+# -+# -+# Format in memory: -+# $Pin{$tag}{$package} but $tag can NOT be "*" -+# -+sub load_pinning_file -+{ -+ # -+ chomp (my $TEXMFSYSCONFIG = `kpsewhich -var-value=TEXMFSYSCONFIG`); -+ my $fn = "$TEXMFSYSCONFIG/tlmgr/pinning"; -+ if (-r $fn) { -+ if (!open(TLC, "<$fn")) { -+ tlwarn("Cannot open $fn: $!"); -+ return; -+ } -+ while (<TLC>) { -+ if (m/^\s*$/) { next; } -+ if (m/^\s*#/) { next; } -+ # TODO -+ # check that we can enter all URL chars in [\w-]+ ?! -+ if (m/^\s*([*\w-]+)\s*:\s*([\w-]+)\s*:\s*([*\w-]+)\s*$/) { -+ my $package = $1; -+ my $tag = $2; -+ my $pin = $3; -+ if ($pin !~ m/^[0-9]+/) { -+ tlwarn("Pin $pin is not numeric, ignoring it.\n"); -+ next; -+ } -+ if ($pin < 0 || $pin > 1000) { -+ tlwarn ("Pin $pin out of range (0-1000), ignoring.\n"); -+ next; -+ } -+ $Pin{$tag}{$package} = $pin; -+ next; -+ } -+ tlwarn("I cannot understand the following line in $fn:\n$_\n"); -+ next; -+ } -+ close(TLC); -+ } -+} -+ -+sub match_package -+{ -+ my ($package, $p) = @_; -+ return 1 if match_glob( $p, $package); -+} -+ -+# -+# compute the pin of $package/$tag -+sub get_pin -+{ -+ my ($tag, $package) = @_; -+ # the following three pins collect that pins set by: -+ my $pin; -+ if (defined($Pin{$tag})) { -+ # for this tag some pin specifications are provided, go through -+ # all of them and check them -+ my %foo = %{$Pin{$tag}}; -+ for my $p (keys %foo) { -+ $pin = $foo{$p} if match_package($package, $p); -+ } -+ return $pin if defined($pin); -+ } -+ # default pin -+ return 500; -+} -+ -+ - # if the packagelog variable is set then write to PACKAGELOG filehandle - # - sub logpackage diff --git a/Master/tlpkg/dev/dev.multi-source-support.patches/series b/Master/tlpkg/dev/dev.multi-source-support.patches/series deleted file mode 100644 index 401444ab933..00000000000 --- a/Master/tlpkg/dev/dev.multi-source-support.patches/series +++ /dev/null @@ -1,3 +0,0 @@ -001-extend-tlpdb-option-location-field-add-action -010-add-action-candidates-mediahash -020-add-pinning-file-support diff --git a/Master/tlpkg/dev/tlwingoonew/README b/Master/tlpkg/dev/tlwingoonew/README deleted file mode 100644 index 5ea6bc33add..00000000000 --- a/Master/tlpkg/dev/tlwingoonew/README +++ /dev/null @@ -1,3 +0,0 @@ -Testing: - -- put testw32[.bat] in root of installation or svn/rsync checkout diff --git a/Master/tlpkg/dev/tlwingoonew/testw32 b/Master/tlpkg/dev/tlwingoonew/testw32 deleted file mode 100644 index 63ed256a11c..00000000000 --- a/Master/tlpkg/dev/tlwingoonew/testw32 +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env perl -BEGIN { - $^W = 1; - my $Master; - my $me = $0; - $me =~ s!\\!/!g if $^O =~ /^MSWin(32|64)$/i; - if ($me =~ m!/!) { - ($Master = $me) =~ s!(.*)/[^/]*$!$1!; - } else { - $Master = "."; - } - $::installerdir = $Master; - unshift (@INC, "$::installerdir/tlpkg"); -} - -$::opt_verbosity=2; - -use TeXLive::TLWinGoo; -Win32::TieRegistry->import( qw( $Registry -)); -# REG_SZ REG_EXPAND_SZ KEY_READ KEY_WRITE KEY_ALL_ACCESS -# KEY_ENUMERATE_SUB_KEYS -$Registry->Delimiter('/'); -$Registry->ArrayValues(0); - -sub print_reg { - my $k = shift; - $kb = $k; - $kb =~ s!/!\\!g; - if (defined($Registry->{"LMachine/$k/"})) { - print "\nHKLM/$k/:\n"; - print `reg query HKLM\\$kb /s`; - } else { - print "\nHKLM/$k/: no such entry\n"; - } - #print $out; - if (defined($Registry->{"CUser/$k/"})) { - print "\nHKCU/$k/:\n"; - print `reg query HKCU\\$kb /s`; - } else { - print "\nHKCU/$k/: no such entry\n"; - } - #print $out; -} - -$regpath = "Software/Classes/test"; -$testkey = { - '/' => "default_value", - '/a' => "another value" -}; - -TeXLive::TLWinGoo::do_write_regkey(2, $regpath, $testkey); -print_reg($regpath); - -# extensions - -$regpath = 'Software/Classes/'; -$ext = '.tex'; - -register_extension(0, $ext, 'texfile'); -print_reg("$regpath$ext"); - -register_extension(1, $ext, 'texfile'); -print_reg("$regpath$ext"); - -register_extension(2, $ext, 'TL.TeXworks.edit'); -print_reg("$regpath$ext"); - -register_extension(1, $ext, 'texfile'); -print_reg("$regpath$ext"); - -unregister_extension(0, $ext, 'texfile'); -print_reg("$regpath$ext"); - -unregister_extension(1, $ext, 'TL.TeXworks.edit'); -print_reg("$regpath$ext"); - -unregister_extension(1, $ext, 'texfile'); -print_reg("$regpath$ext"); - -register_extension(1, $ext, 'texfile'); -print_reg("$regpath$ext"); - -unregister_extension(2, $ext, 'TL.TeXworks.edit'); -print_reg("$regpath$ext"); - -# file types - -$filetype = 'TL.TeXworks.edit'; - -register_file_type('TL.TeXworks.edit', "\"$::installerdir/bin/win32/texworks.exe\" \"%1\""); -print_reg("$regpath$filetype"); - -unregister_file_type('TL.TeXworks.edit'); -print_reg("$regpath$filetype"); - -# applications - -$regpath = "Software/Classes/Applications/"; -$prog = "texworks.exe"; -$path = "$::installerdir/bin/win32/texworks.exe"; -$exts = ['.tex','.sty','.cls','.ltx']; - -register_application($prog, $path, $exts); -print_reg("$regpath$prog"); - -unregister_application($prog); -print_reg("$regpath$prog"); - -$prog = "bitmap2eps.exe"; -$path = "$::installerdir/bin/win32/bitmap2eps.exe"; -$exts = ['.png','.jpg','.gif','.bmp']; - -register_application($prog, $path, $exts); -print_reg("$regpath$prog"); - -unregister_application($prog); -print_reg("$regpath$prog"); - -# openwithlist - -$regpath = "Software/Classes/"; -$ext = ".gif"; -$prog = "bitmap2eps.exe"; - -add_to_openwithlist($ext, $prog); -print_reg("$regpath$ext"); - -remove_from_openwithlist($ext, $prog); -print_reg("$regpath$ext"); - -update_assocs(); diff --git a/Master/tlpkg/dev/tlwingoonew/testw32.bat b/Master/tlpkg/dev/tlwingoonew/testw32.bat deleted file mode 100755 index c8388718456..00000000000 --- a/Master/tlpkg/dev/tlwingoonew/testw32.bat +++ /dev/null @@ -1,5 +0,0 @@ -@echo off -setlocal enableextensions -set path=%~dp0bin\win32;%path% -set PERL5LIB=%~dp0tlpkg\tlperl\lib -%~dp0tlpkg\tlperl\bin\perl.exe %~dpn0 |