summaryrefslogtreecommitdiff
path: root/Master/tlpkg/dev/dev.multi-source-support.patch
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2009-09-15 09:40:04 +0000
committerNorbert Preining <preining@logic.at>2009-09-15 09:40:04 +0000
commit60d44731afa4954a7324f3bbe3e111598874afd2 (patch)
treeb44918fd5babb878b576cdf2a688af6542fcf7e8 /Master/tlpkg/dev/dev.multi-source-support.patch
parent568f2a84fedd5654cc87f3408d72bd32b4363df3 (diff)
move howto-translations to doc, and rename etc to dev in tlpkg
git-svn-id: svn://tug.org/texlive/trunk@15293 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/tlpkg/dev/dev.multi-source-support.patch')
-rw-r--r--Master/tlpkg/dev/dev.multi-source-support.patch722
1 files changed, 722 insertions, 0 deletions
diff --git a/Master/tlpkg/dev/dev.multi-source-support.patch b/Master/tlpkg/dev/dev.multi-source-support.patch
new file mode 100644
index 00000000000..9e96668d938
--- /dev/null
+++ b/Master/tlpkg/dev/dev.multi-source-support.patch
@@ -0,0 +1,722 @@
+--- /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