summaryrefslogtreecommitdiff
path: root/Master/tlpkg
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg')
-rw-r--r--Master/tlpkg/dev/dev.multi-source-support-v2.patch290
-rw-r--r--Master/tlpkg/dev/dev.mupdmap-integration (renamed from Master/tlpkg/dev/quilt-patches/dev.mupdmap-integration)66
-rw-r--r--Master/tlpkg/dev/quilt-patches/dev.multi-source-support-v2.patch2177
-rw-r--r--Master/tlpkg/dev/quilt-patches/series2
4 files changed, 185 insertions, 2350 deletions
diff --git a/Master/tlpkg/dev/dev.multi-source-support-v2.patch b/Master/tlpkg/dev/dev.multi-source-support-v2.patch
index fc482b9ffe1..ee0d0f2d386 100644
--- a/Master/tlpkg/dev/dev.multi-source-support-v2.patch
+++ b/Master/tlpkg/dev/dev.multi-source-support-v2.patch
@@ -1,7 +1,12 @@
+---
+ texmf/scripts/texlive/tlmgr.pl | 907 ++++++++++++++++++++++++++++++++++-------
+ tlpkg/TeXLive/TLPDB.pm | 669 +++++++++++++++++++++++++++---
+ 2 files changed, 1379 insertions(+), 197 deletions(-)
+
Index: tlpkg/TeXLive/TLPDB.pm
===================================================================
---- tlpkg/TeXLive/TLPDB.pm (revision 25070)
-+++ tlpkg/TeXLive/TLPDB.pm (working copy)
+--- tlpkg/TeXLive/TLPDB.pm.orig 2012-01-18 10:10:14.054521486 +0900
++++ tlpkg/TeXLive/TLPDB.pm 2012-01-18 11:05:39.223509405 +0900
@@ -70,20 +70,31 @@
$tlpdb->settings;
$tlpdb->setting($key, [$value]);
@@ -959,8 +964,8 @@ Index: tlpkg/TeXLive/TLPDB.pm
=head1 OPTIONS
Index: texmf/scripts/texlive/tlmgr.pl
===================================================================
---- texmf/scripts/texlive/tlmgr.pl (revision 25070)
-+++ texmf/scripts/texlive/tlmgr.pl (working copy)
+--- texmf/scripts/texlive/tlmgr.pl.orig 2012-01-18 10:10:14.046521530 +0900
++++ texmf/scripts/texlive/tlmgr.pl 2012-01-18 11:06:18.972002414 +0900
@@ -124,6 +124,7 @@
"package-logfile" => "=s",
"persistent-downloads" => "!",
@@ -1015,6 +1020,18 @@ Index: texmf/scripts/texlive/tlmgr.pl
init_tlmedia();
}
- $tlp = $remotetlpdb->get_package($pkg);
+- $tlpdb = $remotetlpdb;
+- } else {
+- $installed = 1;
+- }
+- if ($tlp) {
+- my @colls;
+- if ($tlp->category ne "Collection" && $tlp->category ne "Scheme") {
+- @colls = $localtlpdb->needed_by($pkg);
+- if (!@colls) {
+- # not referenced in the local tlpdb, so try the remote here, too
+- if (!$remotetlpdb) {
+- init_tlmedia();
+ if (defined($tag)) {
+ if (!$remotetlpdb->is_virtual) {
+ tlwarn("tlmgr: specifying implicite tags is not allowed for non-virtual databases!\n");
@@ -1023,9 +1040,33 @@ Index: texmf/scripts/texlive/tlmgr.pl
+ if (!$remotetlpdb->is_repository($tag)) {
+ tlwarn("tlmgr: no such repository tag defined: $tag\n");
+ next;
-+ }
-+ }
-+ }
+ }
+- @colls = $remotetlpdb->needed_by($pkg);
+ }
+ }
+- # some packages might depend on other packages, so do not
+- # include arbitrary package in the list of collections, but
+- # only collectons:
+- @colls = grep {m;^collection-;} @colls;
+- print "package: ", $tlp->name, "\n";
+- print "category: ", $tlp->category, "\n";
+- print "shortdesc: ", $tlp->shortdesc, "\n" if ($tlp->shortdesc);
+- print "longdesc: ", $tlp->longdesc, "\n" if ($tlp->longdesc);
+- print "installed: ", ($installed ? "Yes" : "No"), "\n";
+- print "revision: ", $tlp->revision, "\n" if ($installed);
+- print "cat-version: ", $tlp->cataloguedata->{'version'}, "\n"
+- if $tlp->cataloguedata->{'version'};
+- print "cat-date: ", $tlp->cataloguedata->{'date'}, "\n"
+- if $tlp->cataloguedata->{'date'};
+- print "cat-license: ", $tlp->cataloguedata->{'license'}, "\n"
+- if $tlp->cataloguedata->{'license'};
+- print "collection: ", @colls, "\n" if (@colls);
+- if ($opts{"keyword"} || $opts{"taxonomy"}) {
+- print "keywords: ";
+- if (defined($taxonomy->{'by-package'}{'keyword'}{$pkg})) {
+- print join(', ',@{$taxonomy->{'by-package'}{'keyword'}{$pkg}}), "\n";
+- } else {
+- print "(none found)\n";
+ $tlp = $remotetlpdb->get_package($pkg, $tag);
+ if (!$tlp) {
+ if (defined($tag)) {
@@ -1033,7 +1074,14 @@ Index: texmf/scripts/texlive/tlmgr.pl
+ # all candidates!
+ tlwarn("tlmgr: Cannot find package $pkg in repository $tag\n");
+ next;
-+ }
+ }
+- }
+- if ($opts{"functionality"} || $opts{"taxonomy"}) {
+- print "function: ";
+- if (defined($taxonomy->{'by-package'}{'functionality'}{$pkg})) {
+- print join(', ',@{$taxonomy->{'by-package'}{'functionality'}{$pkg}}), "\n";
+- } else {
+- print "(none found)\n";
+ if ($remotetlpdb->is_virtual) {
+ # we might have a package that is available in a
+ # subsidiary repository, but not installable
@@ -1068,24 +1116,27 @@ Index: texmf/scripts/texlive/tlmgr.pl
+ tlwarn("strange, package listed but no candidates: $pkg\n");
+ next;
+ }
-+ }
+ }
+ tlwarn("tlmgr: cannot find package $pkg\n");
+ next;
-+ }
- $tlpdb = $remotetlpdb;
- } else {
- $installed = 1;
- }
-- if ($tlp) {
-- my @colls;
-- if ($tlp->category ne "Collection" && $tlp->category ne "Scheme") {
-- @colls = $localtlpdb->needed_by($pkg);
-- if (!@colls) {
-- # not referenced in the local tlpdb, so try the remote here, too
-- if (!$remotetlpdb) {
-- init_tlmedia();
-- }
-- @colls = $remotetlpdb->needed_by($pkg);
+ }
+- if ($opts{"characterization"} || $opts{"taxonomy"}) {
+- print "primary characterization: ";
+- if (defined($taxonomy->{'by-package'}{'primary'}{$pkg})) {
+- print $taxonomy->{'by-package'}{'primary'}{$pkg}, "\n";
+- } else {
+- print "(none found)\n";
+- }
+- print "secondary characterization: ";
+- if (defined($taxonomy->{'by-package'}{'secondary'}{$pkg})) {
+- print $taxonomy->{'by-package'}{'secondary'}{$pkg}, "\n";
+- } else {
+- print "(none found)\n";
+- }
++ $tlpdb = $remotetlpdb;
++ } else {
++ $installed = 1;
++ }
+ my @colls;
+ if ($tlp->category ne "Collection" && $tlp->category ne "Scheme") {
+ @colls = $localtlpdb->needed_by($pkg);
@@ -1093,33 +1144,9 @@ Index: texmf/scripts/texlive/tlmgr.pl
+ # not referenced in the local tlpdb, so try the remote here, too
+ if (!$remotetlpdb) {
+ init_tlmedia();
- }
++ }
+ @colls = $remotetlpdb->needed_by($pkg);
- }
-- # some packages might depend on other packages, so do not
-- # include arbitrary package in the list of collections, but
-- # only collectons:
-- @colls = grep {m;^collection-;} @colls;
-- print "package: ", $tlp->name, "\n";
-- print "category: ", $tlp->category, "\n";
-- print "shortdesc: ", $tlp->shortdesc, "\n" if ($tlp->shortdesc);
-- print "longdesc: ", $tlp->longdesc, "\n" if ($tlp->longdesc);
-- print "installed: ", ($installed ? "Yes" : "No"), "\n";
-- print "revision: ", $tlp->revision, "\n" if ($installed);
-- print "cat-version: ", $tlp->cataloguedata->{'version'}, "\n"
-- if $tlp->cataloguedata->{'version'};
-- print "cat-date: ", $tlp->cataloguedata->{'date'}, "\n"
-- if $tlp->cataloguedata->{'date'};
-- print "cat-license: ", $tlp->cataloguedata->{'license'}, "\n"
-- if $tlp->cataloguedata->{'license'};
-- print "collection: ", @colls, "\n" if (@colls);
-- if ($opts{"keyword"} || $opts{"taxonomy"}) {
-- print "keywords: ";
-- if (defined($taxonomy->{'by-package'}{'keyword'}{$pkg})) {
-- print join(', ',@{$taxonomy->{'by-package'}{'keyword'}{$pkg}}), "\n";
-- } else {
-- print "(none found)\n";
-- }
++ }
+ }
+ # some packages might depend on other packages, so do not
+ # include arbitrary package in the list of collections, but
@@ -1145,13 +1172,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
+ print join(', ',@{$taxonomy->{'by-package'}{'keyword'}{$pkg}}), "\n";
+ } else {
+ print "(none found)\n";
- }
-- if ($opts{"functionality"} || $opts{"taxonomy"}) {
-- print "function: ";
-- if (defined($taxonomy->{'by-package'}{'functionality'}{$pkg})) {
-- print join(', ',@{$taxonomy->{'by-package'}{'functionality'}{$pkg}}), "\n";
-- } else {
-- print "(none found)\n";
++ }
+ }
+ if ($opts{"functionality"} || $opts{"taxonomy"}) {
+ print "function: ";
@@ -1173,44 +1194,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
+ print $taxonomy->{'by-package'}{'secondary'}{$pkg}, "\n";
+ } else {
+ print "(none found)\n";
-+ }
-+ }
-+ if ($opts{"list"}) {
-+ if ($tlp->category eq "Collection" || $tlp->category eq "Scheme") {
-+ # in the case of collections of schemes we list the deps
-+ my @deps = $tlp->depends;
-+ if (@deps) {
-+ print "depends:\n";
-+ for my $d (@deps) {
-+ print "\t$d\n";
-+ }
- }
}
-- if ($opts{"characterization"} || $opts{"taxonomy"}) {
-- print "primary characterization: ";
-- if (defined($taxonomy->{'by-package'}{'primary'}{$pkg})) {
-- print $taxonomy->{'by-package'}{'primary'}{$pkg}, "\n";
-- } else {
-- print "(none found)\n";
-+ print "Included files, by type:\n";
-+ # if the package has a .ARCH dependency we also list the files for
-+ # those packages
-+ my @todo = $tlpdb->expand_dependencies("-only-arch", $tlpdb, ($pkg));
-+ for my $d (sort @todo) {
-+ my $foo = $tlpdb->get_package($d);
-+ if (!$foo) {
-+ tlwarn ("\nShould not happen, no dependent package $d\n");
-+ next;
- }
-- print "secondary characterization: ";
-- if (defined($taxonomy->{'by-package'}{'secondary'}{$pkg})) {
-- print $taxonomy->{'by-package'}{'secondary'}{$pkg}, "\n";
-- } else {
-- print "(none found)\n";
-+ if ($d ne $pkg) {
-+ print "depending package $d:\n";
- }
-- }
- if ($opts{"list"}) {
- if ($tlp->category eq "Collection" || $tlp->category eq "Scheme") {
- # in the case of collections of schemes we list the deps
@@ -1220,10 +1204,16 @@ Index: texmf/scripts/texlive/tlmgr.pl
- for my $d (@deps) {
- print "\t$d\n";
- }
-- }
-+ if ($foo->runfiles) {
-+ print "run files:\n";
-+ for my $f (sort $foo->runfiles) { print " $f\n"; }
++ }
++ if ($opts{"list"}) {
++ if ($tlp->category eq "Collection" || $tlp->category eq "Scheme") {
++ # in the case of collections of schemes we list the deps
++ my @deps = $tlp->depends;
++ if (@deps) {
++ print "depends:\n";
++ for my $d (@deps) {
++ print "\t$d\n";
+ }
}
- print "Included files, by type:\n";
- # if the package has a .ARCH dependency we also list the files for
@@ -1255,6 +1245,24 @@ Index: texmf/scripts/texlive/tlmgr.pl
- for my $k (keys %{$dfd->{$f}}) {
- print " $k=\"", $dfd->{$f}->{$k}, '"';
- }
++ }
++ print "Included files, by type:\n";
++ # if the package has a .ARCH dependency we also list the files for
++ # those packages
++ my @todo = $tlpdb->expand_dependencies("-only-arch", $tlpdb, ($pkg));
++ for my $d (sort @todo) {
++ my $foo = $tlpdb->get_package($d);
++ if (!$foo) {
++ tlwarn ("\nShould not happen, no dependent package $d\n");
++ next;
++ }
++ if ($d ne $pkg) {
++ print "depending package $d:\n";
++ }
++ if ($foo->runfiles) {
++ print "run files:\n";
++ for my $f (sort $foo->runfiles) { print " $f\n"; }
++ }
+ if ($foo->srcfiles) {
+ print "source files:\n";
+ for my $f (sort $foo->srcfiles) { print " $f\n"; }
@@ -1277,12 +1285,12 @@ Index: texmf/scripts/texlive/tlmgr.pl
- print "bin files (all platforms):\n";
- for my $f (sort $foo->allbinfiles) { print " $f\n"; }
- }
- }
++ }
+ # in case we have them
+ if ($foo->allbinfiles) {
+ print "bin files (all platforms):\n";
+ for my $f (sort $foo->allbinfiles) { print " $f\n"; }
-+ }
+ }
}
- print "\n";
- } else {
@@ -1333,7 +1341,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
+ my $kbstr = ($kb >= 0 ? " [${kb}k]" : "");
+ my $kbstrlen = length($kbstr);
+ my $pkglen = length($pkg);
-+ my $is = sprintf("%-10s ", "$txt:");
++ my $is = sprintf("%-9s ", "$txt:");
+ if ($pkglen + $kbstrlen > $flen) {
+ $is .= "$pkg$kbstr: ";
+ } else {
@@ -1402,7 +1410,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
machine_line($p, $FLAG_REMOVE, $rev, "-", "-", "-");
} else {
- info("$p: local: $rev, source: <absent> (auto-remove)\n");
-+ upd_info($p, -1, $rev, "<absent>", "a-remove");
++ upd_info($p, -1, $rev, "<absent>", "autorm");
}
$currnr++;
} else {
@@ -1424,7 +1432,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
$currnr++;
}
}
-@@ -2678,19 +2787,39 @@
+@@ -2678,19 +2787,44 @@
my $unwind_package;
my $remove_unwind_container = 0;
my $rev = $tlp->revision;
@@ -1461,13 +1469,18 @@ Index: texmf/scripts/texlive/tlmgr.pl
+ my @cand = $remotetlpdb->candidates($pkg);
+ shift @cand; # remove the top element
+ if (@cand) {
-+ print "\tother candidates: @cand\n";
++ print "\tother candidates: ";
++ for my $a (@cand) {
++ my ($t,$r) = split(/\//, $a, 2);
++ print $r . '@' . $t . " ";
++ }
++ print "\n";
+ }
+ }
}
$updated{$pkg} = 1;
next;
-@@ -2731,10 +2860,11 @@
+@@ -2731,10 +2865,11 @@
}
if ($::machinereadable) {
@@ -1481,7 +1494,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
}
$donesize += $sizes{$pkg};
$currnr++;
-@@ -2777,7 +2907,7 @@
+@@ -2777,7 +2912,7 @@
}
if ($remotetlpdb->install_package($pkg, $localtlpdb)) {
# installation succeeded because we got a reference
@@ -1490,7 +1503,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
unlink($unwind_package) if $remove_unwind_container;
# remember successful update
$updated{$pkg} = 1;
-@@ -2805,7 +2935,7 @@
+@@ -2805,7 +2940,7 @@
# now in fact we should do some cleanup, removing files and
# dirs from the new package before re-installing the old one.
# TODO
@@ -1499,7 +1512,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
tlwarn("\n\nInstallation of new version of $pkg did fail, trying to unwind.\n");
if (win32()) {
# w32 is notorious for not releasing a file immediately
-@@ -2846,12 +2976,25 @@
+@@ -2846,12 +2981,25 @@
unless $::machinereadable;
} else {
# install new packages
@@ -1526,7 +1539,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
my ($estrem, $esttot);
if (!$opts{"list"}) {
($estrem, $esttot) = TeXLive::TLUtils::time_estimate($totalsize,
-@@ -2861,14 +3004,16 @@
+@@ -2861,14 +3009,16 @@
my @maargs = ($pkg, $FLAG_AUTOINSTALL, "-", $mediatlp->revision, $sizes{$pkg});
if (!$opts{"list"}) {
push @maargs, $estrem, $esttot;
@@ -1539,14 +1552,14 @@ Index: texmf/scripts/texlive/tlmgr.pl
my $kb = int($sizes{$pkg} / 1024) + 1;
if ($opts{"list"}) {
- info("$pkg [${kb}k]: local: <absent>, source: " . $mediatlp->revision . " (auto-install)\n");
-+ upd_info($pkg, $kb, "<absent>", $mediarevstr, "a-install");
++ upd_info($pkg, $kb, "<absent>", $mediarevstr, "autoinst");
} else {
- info("[$currnr/$totalnr, $estrem/$esttot] auto-install: $pkg [${kb}k]\n");
+ info("[$currnr/$totalnr, $estrem/$esttot] auto-install: $pkg ($mediarevstr) [${kb}k]\n");
}
}
$currnr++;
-@@ -2876,7 +3021,7 @@
+@@ -2876,7 +3026,7 @@
next if ($opts{"dry-run"} || $opts{"list"});
if ($remotetlpdb->install_package($pkg, $localtlpdb)) {
# installation succeeded because we got a reference
@@ -1555,7 +1568,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
$nrupdated++;
} else {
tlwarn("$0: couldn't install new package $pkg\n");
-@@ -3023,6 +3168,7 @@
+@@ -3023,6 +3173,7 @@
if (!(@new || @updated)) {
info("tlmgr: no updates available\n");
if ($remotetlpdb->media ne "NET"
@@ -1563,7 +1576,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
&& !$opts{"dry-run"}
&& !$opts{"repository"}
) {
-@@ -3101,6 +3247,14 @@
+@@ -3101,6 +3252,14 @@
@packs = $remotetlpdb->expand_dependencies($localtlpdb, @packs) unless $opts{"no-depends"};
}
#
@@ -1578,7 +1591,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
# installation order of packages:
# first all normal packages, then collections, then schemes
# isn't already installed, but the collection already updated, it will
-@@ -3108,7 +3262,7 @@
+@@ -3108,7 +3267,7 @@
my @inst_packs;
my @inst_colls;
my @inst_schemes;
@@ -1587,7 +1600,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
# we do name checking here, not to load all tlpobj again and again
if ($pkg =~ m/^scheme-/) {
push @inst_schemes, $pkg;
-@@ -3127,7 +3281,11 @@
+@@ -3127,7 +3286,11 @@
my @todo;
for my $pkg (@inst_packs, @inst_colls, @inst_schemes) {
my $pkgrev = 0;
@@ -1600,7 +1613,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
if (!defined($mediatlp)) {
tlwarn("package $pkg not present in package repository.\n");
next;
-@@ -3175,13 +3333,26 @@
+@@ -3175,13 +3338,26 @@
my ($estrem, $esttot) = TeXLive::TLUtils::time_estimate($totalsize,
$donesize, $starttime);
my $kb = int($sizes{$pkg} / 1024) + 1;
@@ -1630,7 +1643,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
logpackage("${re}install: $pkg");
}
$donesize += $sizes{$pkg};
-@@ -3204,7 +3375,7 @@
+@@ -3204,7 +3380,7 @@
# we list them, otherwise we go direct into tlmgr show $pkg mode
if ($what !~ m/^(collection|scheme)/i) {
tlwarn("(switching to show mode)\n");
@@ -1639,7 +1652,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
return;
}
} else {
-@@ -3223,7 +3394,11 @@
+@@ -3223,7 +3399,11 @@
} elsif ($what =~ m/^scheme/i) {
@whattolist = $tlm->schemes;
} else {
@@ -1652,7 +1665,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
}
foreach (@whattolist) {
next if ($_ =~ m/^00texlive/);
-@@ -3232,13 +3407,199 @@
+@@ -3232,12 +3412,198 @@
} else {
print " ";
}
@@ -1712,7 +1725,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
+# 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;
@@ -1849,11 +1862,10 @@ Index: texmf/scripts/texlive/tlmgr.pl
+ }
+ return;
+}
-+
+
# OPTION
#
- sub action_option {
-@@ -4601,6 +4962,82 @@
+@@ -4601,6 +4967,87 @@
#
sub init_tlmedia
{
@@ -1924,8 +1936,13 @@ Index: texmf/scripts/texlive/tlmgr.pl
+ # this "location-url" line should not be changed since GUI programs
+ # depend on it:
+ print "location-url\t$locstr\n" if $::machinereadable;
-+ info("tlmgr: package repository $locstr\n");
-+
++ info("tlmgr: package repository:\n");
++ info("\tmain = " . $repos{'main'} . "\n");
++ for my $t (@tags) {
++ if ($t ne 'main') {
++ info("\t$t = " . $repos{$t} . "\n");
++ }
++ }
+}
+
+
@@ -1936,7 +1953,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
if (defined($remotetlpdb) && ($remotetlpdb->root eq $location)) {
# nothing to be done
return;
-@@ -4614,11 +5051,29 @@
+@@ -4614,10 +5061,28 @@
$location =~ s,^$TeXLiveServerURL,$mirrorbase,;
}
@@ -1946,7 +1963,7 @@ Index: texmf/scripts/texlive/tlmgr.pl
print "location-url\t$location\n" if $::machinereadable;
info("tlmgr: package repository $location\n");
+}
-
++
+sub setup_one_remotetlpdb
+{
+ my $location = shift;
@@ -1962,11 +1979,10 @@ Index: texmf/scripts/texlive/tlmgr.pl
+ my $mirrorbase = TeXLive::TLUtils::give_ctan_mirror_base();
+ $location =~ s,^$TeXLiveServerURL,$mirrorbase,;
+ }
-+
+
# 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
- # agrees load the local copy if present instead of the remote one,
-@@ -4763,8 +5218,30 @@
+@@ -4763,8 +5228,30 @@
close($tlfh);
}
}
@@ -1997,12 +2013,12 @@ Index: texmf/scripts/texlive/tlmgr.pl
# finish handles the -pause option (wait for input from stdin),
-@@ -5561,7 +6038,43 @@
+@@ -5561,6 +6048,42 @@
=back
+=head2 repositoy
-
++
+=over 4
+
+=item B<repository list>
@@ -2037,16 +2053,15 @@ Index: texmf/scripts/texlive/tlmgr.pl
+
+
+=back
-+
+
=head2 option
- =over 4
-@@ -6198,7 +6711,119 @@
+@@ -6198,6 +6721,118 @@
GUI and a simplified GUI with only the important and mostly used
settings.
+=head1 MULTIPLE REPOSITORIES
-
++
+Most packages are distributed via the main TeX Live repository, but
+sometimes local repositories are used to provide local packages
+(like commercial fonts, internal styles), as well as alternative
@@ -2157,7 +2172,6 @@ Index: texmf/scripts/texlive/tlmgr.pl
+
+In the last part you see that the cowfont is installed from
+the tlcontrib part (@tlcontrib).
-+
+
=head1 TAXONOMIES
- tlmgr allows searching and listing of various categorizations, which we
diff --git a/Master/tlpkg/dev/quilt-patches/dev.mupdmap-integration b/Master/tlpkg/dev/dev.mupdmap-integration
index c7da49280c8..78b96937151 100644
--- a/Master/tlpkg/dev/quilt-patches/dev.mupdmap-integration
+++ b/Master/tlpkg/dev/dev.mupdmap-integration
@@ -1,16 +1,16 @@
---
- install-tl | 7
- texmf-dist/web2c/updmap.cfg | 230 +++
- texmf/scripts/texlive/tlmgr.pl | 131 -
- texmf/web2c/updmap-hdr.cfg | 107 -
- texmf/web2c/updmap.cfg | 256 ---
- tlpkg/TeXLive/TLUtils.pm | 67
- 7 files changed, 2071 insertions(+), 1744 deletions(-)
+ install-tl | 7 -
+ texmf-dist/web2c/updmap.cfg | 230 ++++++++++++++++++++++++++++++++++++
+ texmf/scripts/texlive/tlmgr.pl | 131 +++++---------------
+ texmf/web2c/updmap-hdr.cfg | 107 +----------------
+ texmf/web2c/updmap.cfg | 256 -----------------------------------------
+ tlpkg/TeXLive/TLUtils.pm | 67 ----------
+ 6 files changed, 285 insertions(+), 513 deletions(-)
-Index: Master/texmf/web2c/updmap.cfg
+Index: 2011/texmf/web2c/updmap.cfg
===================================================================
---- Master.orig/texmf/web2c/updmap.cfg 2012-01-12 12:54:40.000000000 +0900
-+++ Master/texmf/web2c/updmap.cfg 2012-01-12 12:55:09.000000000 +0900
+--- 2011.orig/texmf/web2c/updmap.cfg 2012-01-19 18:07:14.946332524 +0900
++++ 2011/texmf/web2c/updmap.cfg 2012-01-19 18:07:16.166332166 +0900
@@ -1,31 +1,7 @@
-# Generated by /home/texlive/karl/Master/bin/i386-linux/tlmgr on Mon Jan 9 04:29:26 2012
-# $Id: updmap-hdr.cfg 24398 2011-10-26 01:07:22Z preining $
@@ -275,10 +275,10 @@ Index: Master/texmf/web2c/updmap.cfg
-MixedMap wasy.map
-MixedMap xypic.map
-MixedMap yhmath.map
-Index: Master/texmf-dist/web2c/updmap.cfg
+Index: 2011/texmf-dist/web2c/updmap.cfg
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ Master/texmf-dist/web2c/updmap.cfg 2012-01-12 12:56:10.000000000 +0900
++++ 2011/texmf-dist/web2c/updmap.cfg 2012-01-19 18:07:16.166332166 +0900
@@ -0,0 +1,230 @@
+#
+# updmap.cfg
@@ -510,10 +510,10 @@ Index: Master/texmf-dist/web2c/updmap.cfg
+MixedMap wasy.map
+MixedMap xypic.map
+MixedMap yhmath.map
-Index: Master/texmf/scripts/texlive/tlmgr.pl
+Index: 2011/texmf/scripts/texlive/tlmgr.pl
===================================================================
---- Master.orig/texmf/scripts/texlive/tlmgr.pl 2012-01-12 12:54:40.000000000 +0900
-+++ Master/texmf/scripts/texlive/tlmgr.pl 2012-01-12 13:42:40.000000000 +0900
+--- 2011.orig/texmf/scripts/texlive/tlmgr.pl 2012-01-19 18:06:04.894341300 +0900
++++ 2011/texmf/scripts/texlive/tlmgr.pl 2012-01-19 18:07:16.166332166 +0900
@@ -624,47 +624,21 @@
chomp(my $TEXMFSYSVAR = `kpsewhich -var-value=TEXMFSYSVAR`);
chomp(my $TEXMFSYSCONFIG = `kpsewhich -var-value=TEXMFSYSCONFIG`);
@@ -567,7 +567,7 @@ Index: Master/texmf/scripts/texlive/tlmgr.pl
}
$errors += do_cmd_and_check("updmap-sys") if $updmap_run_needed;
}
-@@ -3918,17 +3892,15 @@
+@@ -3923,17 +3897,15 @@
init_local_db();
# we create fmtutil.cnf, language.dat, language.def in TEXMFSYSVAR and
@@ -590,7 +590,7 @@ Index: Master/texmf/scripts/texlive/tlmgr.pl
# we do generate all config files, treat $opts{"dest"} as pattern
# and make it append the respective extensions
-@@ -4006,10 +3978,9 @@
+@@ -4011,10 +3983,9 @@
}
} elsif ($what =~ m/^updmap$/i) {
@@ -603,7 +603,7 @@ Index: Master/texmf/scripts/texlive/tlmgr.pl
if ($opts{"rebuild-sys"}) {
do_cmd_and_check("updmap-sys");
-@@ -6110,7 +6081,6 @@
+@@ -6120,7 +6091,6 @@
sys_bin (directory to which executables are linked by the path action)
sys_man (directory to which man pages are linked by the path action)
sys_info (directory to which Info files are linked by the path action)
@@ -611,7 +611,7 @@ Index: Master/texmf/scripts/texlive/tlmgr.pl
desktop_integration (Windows-only: create Start menu shortcuts)
fileassocs (Windows-only: change file associations)
multiuser (Windows-only: install for all users)
-@@ -6166,9 +6136,6 @@
+@@ -6176,9 +6146,6 @@
Unix-like systems to control the generation of links for executables,
info files and man pages. See the C<path> action for details.
@@ -621,7 +621,7 @@ Index: Master/texmf/scripts/texlive/tlmgr.pl
The last three options control behaviour on Windows installations. If
C<desktop_integration> is set, then some packages will install items in
a sub-folder of the Start menu for C<tlmgr gui>, documentation, etc. If
-@@ -6558,31 +6525,20 @@
+@@ -6568,31 +6535,20 @@
=back
The C<generate> action overwrites any manual changes made in the
@@ -665,7 +665,7 @@ Index: Master/texmf/scripts/texlive/tlmgr.pl
In more detail: C<generate> remakes any of the five config files
C<language.dat>, C<language.def>, C<language.dat.lua>, C<fmtutil.cnf>,
-@@ -6590,26 +6546,27 @@
+@@ -6600,26 +6556,27 @@
locally-maintained files.
The locally-maintained files are C<language-local.dat>,
@@ -701,7 +701,7 @@ Index: Master/texmf/scripts/texlive/tlmgr.pl
%!german
--!usenglishmax
-@@ -6622,20 +6579,9 @@
+@@ -6632,20 +6589,9 @@
syntax as the master files.
The form C<generate language> recreates both the C<language.dat>, the
@@ -723,7 +723,7 @@ Index: Master/texmf/scripts/texlive/tlmgr.pl
Options:
=over 4
-@@ -6643,7 +6589,7 @@
+@@ -6653,7 +6599,7 @@
=item B<--dest> I<output_file>
specifies the output file (defaults to the respective location in
@@ -732,7 +732,7 @@ Index: Master/texmf/scripts/texlive/tlmgr.pl
for C<updmap>). If C<--dest> is given to C<generate language>, it serves
as a basename onto which C<.dat> will be appended for the name of the
C<language.dat> output file, C<.def> will be
-@@ -6681,13 +6627,6 @@
+@@ -6691,13 +6637,6 @@
web2c/fmtutil.cnf (and fmtutil-local.cnf);
web2c/updmap.cfg (and updmap-local.cfg).
@@ -746,10 +746,10 @@ Index: Master/texmf/scripts/texlive/tlmgr.pl
=head1 CONFIGURATION FILE
-Index: Master/texmf/web2c/updmap-hdr.cfg
+Index: 2011/texmf/web2c/updmap-hdr.cfg
===================================================================
---- Master.orig/texmf/web2c/updmap-hdr.cfg 2011-10-26 10:07:22.000000000 +0900
-+++ Master/texmf/web2c/updmap-hdr.cfg 2012-01-12 13:42:09.000000000 +0900
+--- 2011.orig/texmf/web2c/updmap-hdr.cfg 2012-01-19 18:06:50.000000000 +0900
++++ 2011/texmf/web2c/updmap-hdr.cfg 2012-01-19 18:07:16.166332166 +0900
@@ -1,8 +1,8 @@
# $Id: updmap-hdr.cfg 24398 2011-10-26 01:07:22Z preining $
#
@@ -870,10 +870,10 @@ Index: Master/texmf/web2c/updmap-hdr.cfg
-# Map files should be marked by "#! " (without the quotes), not just #.
-#
-
-Index: Master/tlpkg/TeXLive/TLUtils.pm
+Index: 2011/tlpkg/TeXLive/TLUtils.pm
===================================================================
---- Master.orig/tlpkg/TeXLive/TLUtils.pm 2012-01-05 11:07:33.000000000 +0900
-+++ Master/tlpkg/TeXLive/TLUtils.pm 2012-01-12 13:04:16.000000000 +0900
+--- 2011.orig/tlpkg/TeXLive/TLUtils.pm 2012-01-19 18:03:59.000000000 +0900
++++ 2011/tlpkg/TeXLive/TLUtils.pm 2012-01-19 18:07:16.166332166 +0900
@@ -2575,67 +2575,10 @@
}
@@ -955,10 +955,10 @@ Index: Master/tlpkg/TeXLive/TLUtils.pm
#
# this should be done more intelligently, but for now only add those
# lines without any duplication check ...
-Index: Master/install-tl
+Index: 2011/install-tl
===================================================================
---- Master.orig/install-tl 2011-10-07 07:50:55.000000000 +0900
-+++ Master/install-tl 2012-01-12 13:27:39.000000000 +0900
+--- 2011.orig/install-tl 2011-10-07 07:50:55.000000000 +0900
++++ 2011/install-tl 2012-01-19 18:07:16.170332166 +0900
@@ -861,11 +861,10 @@
"$TEXMFSYSVAR/web2c/fmtutil.cnf",
"$TEXMFLOCAL/web2c/fmtutil-local.cnf");
diff --git a/Master/tlpkg/dev/quilt-patches/dev.multi-source-support-v2.patch b/Master/tlpkg/dev/quilt-patches/dev.multi-source-support-v2.patch
deleted file mode 100644
index 7cff5fb8875..00000000000
--- a/Master/tlpkg/dev/quilt-patches/dev.multi-source-support-v2.patch
+++ /dev/null
@@ -1,2177 +0,0 @@
----
- texmf/scripts/texlive/tlmgr.pl | 907 ++++++++++++++++++++++++++++++++++-------
- tlpkg/TeXLive/TLPDB.pm | 669 +++++++++++++++++++++++++++---
- 2 files changed, 1379 insertions(+), 197 deletions(-)
-
-Index: tlpkg/TeXLive/TLPDB.pm
-===================================================================
---- tlpkg/TeXLive/TLPDB.pm.orig 2012-01-12 14:25:20.000000000 +0900
-+++ tlpkg/TeXLive/TLPDB.pm 2012-01-18 09:54:41.587756406 +0900
-@@ -70,20 +70,31 @@
- $tlpdb->settings;
- $tlpdb->setting($key, [$value]);
- $tlpdb->sizes_of_packages($opt_src, $opt_doc [, @packs ]);
-- $tlpdb->install_package($pkg, $dest_tlpdb, $nopostinstall, $fallbacktlpdb);
-+ $tlpdb->install_package($pkg, $dest_tlpdb);
- $tlpdb->remove_package($pkg, %options);
-
--
- TeXLive::TLPDB->listdir([$dir]);
- $tlpdb->generate_listfiles([$destdir]);
-
-+ $tlpdb->make_virtual;
-+ $tlpdb->is_virtual;
-+ $tlpdb->virtual_add_tlpdb($tlpdb, $tag);
-+ $tlpdb->virtual_remove_tlpdb($tag);
-+ $tlpdb->virtual_get_package($pkg, $tag);
-+ $tlpdb->candidates($pkg);
-+ $tlpdb->virtual_candidate($pkg);
-+ $tlpdb->virtual_pinning( [@tlpkpins ] );
-+
- =head1 DESCRIPTION
-
- =cut
-
--use TeXLive::TLConfig;
-+use TeXLive::TLConfig qw($CategoriesRegexp $DefaultCategory $InfraLocation
-+ $DatabaseName $MetaCategoriesRegexp $Archive
-+ %TLPDBOptions %TLPDBSettings
-+ $RelocPrefix $RelocTree);
- use TeXLive::TLUtils qw(dirname mkdirhier member win32 info log debug ddebug
-- tlwarn basename download_file merge_into);
-+ tlwarn basename download_file merge_into tldie);
- use TeXLive::TLPOBJ;
- use TeXLive::TLWinGoo;
-
-@@ -161,6 +172,10 @@
-
- sub add_tlpobj {
- my ($self,$tlp) = @_;
-+ if ($self->is_virtual) {
-+ tlwarn("cannot add tlpobj to a virtual tlpdb\n");
-+ return 0;
-+ }
- $self->{'tlps'}{$tlp->name} = $tlp;
- }
-
-@@ -209,6 +224,10 @@
-
- sub remove_tlpobj {
- my ($self,$pkg) = @_;
-+ if ($self->is_virtual) {
-+ tlwarn("cannot remove tlpobj from a virtual tlpdb\n");
-+ return 0;
-+ }
- if (defined($self->{'tlps'}{$pkg})) {
- delete $self->{'tlps'}{$pkg};
- } else {
-@@ -229,6 +248,10 @@
-
- sub from_file {
- my ($self, $path) = @_;
-+ if ($self->is_virtual) {
-+ tlwarn("cannot initialize from file a virtual tlpdb\n");
-+ return 0;
-+ }
- if (@_ != 2) {
- die "$0: from_file needs filename for initialization";
- }
-@@ -362,6 +385,10 @@
-
- sub writeout {
- my $self = shift;
-+ if ($self->is_virtual) {
-+ tlwarn("cannot write out a virtual tlpdb\n");
-+ return 0;
-+ }
- my $fd = (@_ ? $_[0] : STDOUT);
- foreach (sort keys %{$self->{'tlps'}}) {
- ddebug("writeout: tlpname=$_ ", $self->{'tlps'}{$_}->name, "\n");
-@@ -381,6 +408,10 @@
-
- sub save {
- my $self = shift;
-+ if ($self->is_virtual) {
-+ tlwarn("cannot save a virtual tlpdb\n");
-+ return 0;
-+ }
- my $path = $self->location;
- mkdirhier(dirname($path));
- my $tmppath = "$path.tmp";
-@@ -402,6 +433,9 @@
-
- sub media {
- my $self = shift ;
-+ if ($self->is_virtual) {
-+ return "virtual";
-+ }
- return $self->{'media'};
- }
-
-@@ -417,6 +451,18 @@
-
- sub available_architectures {
- my $self = shift;
-+ my @archs;
-+ if ($self->is_virtual) {
-+ for my $k (keys %{$self->{'tlpdbs'}}) {
-+ push @archs, $self->{'tlpdbs'}{$k}->available_architectures;
-+ }
-+ } else {
-+ return $self->_available_architectures;
-+ }
-+}
-+
-+sub _available_architectures {
-+ my $self = shift;
- my @archs = $self->setting("available_architectures");
- if (! @archs) {
- # fall back to the old method checking tex\.*
-@@ -444,6 +490,10 @@
-
- sub add_tlpcontainer {
- my ($self, $package, $ziplocation, $archrefs, $dest) = @_;
-+ if ($self->is_virtual) {
-+ tlwarn("cannot add tlp container to a virtual tlpdb\n");
-+ return 0;
-+ }
- my @archs;
- if (defined($archrefs)) {
- @archs = @$archrefs;
-@@ -508,6 +558,29 @@
- =cut
-
- sub get_package {
-+ my ($self,$pkg,$tag) = @_;
-+ if ($self->is_virtual) {
-+ if (defined($tag)) {
-+ if (defined($self->{'packages'}{$pkg}{'tags'}{$tag})) {
-+ return $self->{'packages'}{$pkg}{'tags'}{$tag}{'tlp'};
-+ } else {
-+ debug("TLPDB::get_package: package $pkg not found in repository $tag\n");
-+ return;
-+ }
-+ } else {
-+ $tag = $self->{'packages'}{$pkg}{'target'};
-+ if (defined($tag)) {
-+ return $self->{'packages'}{$pkg}{'tags'}{$tag}{'tlp'};
-+ } else {
-+ return;
-+ }
-+ }
-+ } else {
-+ return $self->_get_package($pkg);
-+ }
-+}
-+
-+sub _get_package {
- my ($self,$pkg) = @_;
- if (defined($self->{'tlps'}{$pkg})) {
- my $ret = $self->{'tlps'}{$pkg};
-@@ -519,6 +592,35 @@
-
- =pod
-
-+=item C<< $tlpdb->media_of_package($pkg [, $tag]);
-+
-+returns the media type of the package. In the virtual case a tag can
-+be given and the media of that repository is used, otherwise the
-+media of the virtual candidate is given.
-+
-+=cut
-+
-+sub media_of_package {
-+ my ($self, $pkg, $tag) = @_;
-+ if ($self->is_virtual) {
-+ if (defined($tag)) {
-+ if (defined($self->{'tlpdbs'}{$tag})) {
-+ return $self->{'tlpdbs'}{$tag}->media;
-+ } else {
-+ tlwarn ("tag $tag is not known.\n");
-+ return;
-+ }
-+ } else {
-+ my (undef,undef,undef,$maxtlpdb) = $self->virtual_candidate($pkg);
-+ return $maxtlpdb->media;
-+ }
-+ } else {
-+ return $self->media;
-+ }
-+}
-+
-+=pod
-+
- =item C<< $tlpdb->list_packages >>
-
- The C<list_packages> function returns the list of all included packages.
-@@ -527,6 +629,34 @@
-
- sub list_packages {
- my $self = shift;
-+ my $arg = shift;
-+ my $showall = 0;
-+ if (defined($arg) && ($arg eq "-all")) {
-+ $showall = 1;
-+ }
-+ if ($self->is_virtual) {
-+ if ($showall) {
-+ return (sort keys %{$self->{'packages'}});
-+ }
-+ # we have to be careful here: If a package
-+ # is only present in a subsidiary repository
-+ # and the package is *not* explicitely
-+ # pinned to it, it will not be installable.
-+ # This is what we want. But in this case
-+ # we don't want it to be listed by default.
-+ #
-+ my @pps;
-+ for my $p (keys %{$self->{'packages'}}) {
-+ push @pps, $p if (defined($self->{'packages'}{$p}{'target'}));
-+ }
-+ return (sort @pps);
-+ } else {
-+ return $self->_list_packages;
-+ }
-+}
-+
-+sub _list_packages {
-+ my $self = shift;
- return (sort keys %{$self->{'tlps'}});
- }
-
-@@ -544,6 +674,11 @@
- The next (or first) argument is the target TLPDB, then a list of
- packages.
-
-+In the virtual case,
-+if a package name is tagged with C<@repository-tag> then all the
-+dependencies will still be expanded between all included databases.
-+Only in case of .ARCH dependencies the repository-tag is sticky.
-+
- We return the closure of the package list with respect to the depends
- operator. (Sorry, that was for mathematicians.)
-
-@@ -567,7 +702,8 @@
- my %install = ();
- my @archs = $totlpdb->available_architectures;
- for my $p (@_) {
-- $install{$p} = 1;
-+ my ($pp, $aa) = split('@', $p);
-+ $install{$pp} = (defined($aa) ? $aa : 0);;
- }
- my $changed = 1;
- while ($changed) {
-@@ -576,7 +712,7 @@
- ddebug("pre_select = @pre_select\n");
- for my $p (@pre_select) {
- next if ($p =~ m/^00texlive/);
-- my $pkg = $self->get_package($p);
-+ my $pkg = $self->get_package($p, ($install{$p}?$install{$p}:undef));
- if (!defined($pkg)) {
- debug("W: $p is mentioned somewhere but not available, disabling\n");
- $install{$p} = 0;
-@@ -602,16 +738,19 @@
- if ($p_dep =~ m/^(.*)\.ARCH$/) {
- my $foo = "$1";
- foreach $a (@archs) {
-- $install{"$foo.$a"} = 1 if defined($self->get_package("$foo.$a"));
-+ # install .ARCH packages from the same sub repository as the
-+ # main packages
-+ $install{"$foo.$a"} = $install{$foo}
-+ if defined($self->get_package("$foo.$a"));
- }
- } elsif ($p_dep =~ m/^(.*)\.win32$/) {
- # a win32 package should *only* be installed if we are installing
- # the win32 arch
- if (grep(/^win32$/,@archs)) {
-- $install{$p_dep} = 1;
-+ $install{$p_dep} = 0;
- }
- } else {
-- $install{$p_dep} = 1 unless $only_arch;
-+ $install{$p_dep} = 0 unless $only_arch;
- }
- }
- }
-@@ -623,7 +762,9 @@
- $changed = 1;
- }
- }
-- return(keys %install);
-+ # create return list
-+ return map { $install{$_} eq "0"?$_:"$_\@" . $install{$_} } keys %install;
-+ #return(keys %install);
- }
-
- =pod
-@@ -635,6 +776,7 @@
-
- =cut
-
-+# TODO adapt for searching in *all* tags ???
- sub find_file {
- my ($self,$fn) = @_;
- my @ret;
-@@ -868,6 +1010,10 @@
-
- sub root {
- my $self = shift;
-+ if ($self->is_virtual) {
-+ tlwarn("cannot set/edit root of a virtual tlpdb\n");
-+ return 0;
-+ }
- if (@_) { $self->{'root'} = shift }
- return $self->{'root'};
- }
-@@ -886,7 +1032,11 @@
- =cut
-
- sub location {
-- my $self = shift;
-+ my $self = shift;
-+ if ($self->is_virtual) {
-+ tlwarn("cannot get location of a virtual tlpdb\n");
-+ return 0;
-+ }
- return "$self->{'root'}/$InfraLocation/$DatabaseName";
- }
-
-@@ -937,8 +1087,14 @@
-
- sub config_src_container {
- my $self = shift;
-- if (defined($self->{'tlps'}{'00texlive.config'})) {
-- foreach my $d ($self->{'tlps'}{'00texlive.config'}->depends) {
-+ my $tlp;
-+ if ($self->is_virtual) {
-+ $tlp = $self->{'tlpdbs'}{'main'}->get_package('00texlive.config');
-+ } else {
-+ $tlp = $self->{'tlps'}{'00texlive.config'};
-+ }
-+ if (defined($tlp)) {
-+ foreach my $d ($tlp->depends) {
- if ($d =~ m!^container_split_src_files/(.*)$!) {
- return "$1";
- }
-@@ -958,8 +1114,14 @@
-
- sub config_doc_container {
- my $self = shift;
-- if (defined($self->{'tlps'}{'00texlive.config'})) {
-- foreach my $d ($self->{'tlps'}{'00texlive.config'}->depends) {
-+ my $tlp;
-+ if ($self->is_virtual) {
-+ $tlp = $self->{'tlpdbs'}{'main'}->get_package('00texlive.config');
-+ } else {
-+ $tlp = $self->{'tlps'}{'00texlive.config'};
-+ }
-+ if (defined($tlp)) {
-+ foreach my $d ($tlp->depends) {
- if ($d =~ m!^container_split_doc_files/(.*)$!) {
- return "$1";
- }
-@@ -978,8 +1140,14 @@
-
- sub config_container_format {
- my $self = shift;
-- if (defined($self->{'tlps'}{'00texlive.config'})) {
-- foreach my $d ($self->{'tlps'}{'00texlive.config'}->depends) {
-+ my $tlp;
-+ if ($self->is_virtual) {
-+ $tlp = $self->{'tlpdbs'}{'main'}->get_package('00texlive.config');
-+ } else {
-+ $tlp = $self->{'tlps'}{'00texlive.config'};
-+ }
-+ if (defined($tlp)) {
-+ foreach my $d ($tlp->depends) {
- if ($d =~ m!^container_format/(.*)$!) {
- return "$1";
- }
-@@ -998,8 +1166,14 @@
-
- sub config_release {
- my $self = shift;
-- if (defined($self->{'tlps'}{'00texlive.config'})) {
-- foreach my $d ($self->{'tlps'}{'00texlive.config'}->depends) {
-+ my $tlp;
-+ if ($self->is_virtual) {
-+ $tlp = $self->{'tlpdbs'}{'main'}->get_package('00texlive.config');
-+ } else {
-+ $tlp = $self->{'tlps'}{'00texlive.config'};
-+ }
-+ if (defined($tlp)) {
-+ foreach my $d ($tlp->depends) {
- if ($d =~ m!^release/(.*)$!) {
- return "$1";
- }
-@@ -1018,8 +1192,14 @@
-
- sub config_minrelease {
- my $self = shift;
-- if (defined($self->{'tlps'}{'00texlive.config'})) {
-- foreach my $d ($self->{'tlps'}{'00texlive.config'}->depends) {
-+ my $tlp;
-+ if ($self->is_virtual) {
-+ $tlp = $self->{'tlpdbs'}{'main'}->get_package('00texlive.config');
-+ } else {
-+ $tlp = $self->{'tlps'}{'00texlive.config'};
-+ }
-+ if (defined($tlp)) {
-+ foreach my $d ($tlp->depends) {
- if ($d =~ m!^minrelease/(.*)$!) {
- return "$1";
- }
-@@ -1039,8 +1219,14 @@
-
- sub config_revision {
- my $self = shift;
-- if (defined($self->{'tlps'}{'00texlive.config'})) {
-- foreach my $d ($self->{'tlps'}{'00texlive.config'}->depends) {
-+ my $tlp;
-+ if ($self->is_virtual) {
-+ $tlp = $self->{'tlpdbs'}{'main'}->get_package('00texlive.config');
-+ } else {
-+ $tlp = $self->{'tlps'}{'00texlive.config'};
-+ }
-+ if (defined($tlp)) {
-+ foreach my $d ($tlp->depends) {
- if ($d =~ m!^revision/(.*)$!) {
- return "$1";
- }
-@@ -1066,12 +1252,12 @@
- sub sizes_of_packages {
- my ($self, $opt_src, $opt_doc, @packs) = @_;
- @packs || ( @packs = $self->list_packages() );
-- my $media = $self->media;
- my %tlpsizes;
- my %tlpobjs;
- my $totalsize;
- foreach my $p (@packs) {
- $tlpobjs{$p} = $self->get_package($p);
-+ my $media = $self->media_of_package($p);
- if (!defined($tlpobjs{$p})) {
- warn "STRANGE: $p not to be found in ", $self->root;
- next;
-@@ -1095,7 +1281,7 @@
- $size += $tlpobj->srccontainersize if $opt_src;
- $size += $tlpobj->doccontainersize if $opt_doc;
- } else {
-- # we have to add the respective sizes, that is checking for
-+ # we have to add the respective sizes, that is checking for
- # installation of src and doc file
- $size = $tlpobj->runsize;
- $size += $tlpobj->srcsize if $opt_src;
-@@ -1110,31 +1296,46 @@
-
- =pod
-
--=item C<< $tlpdb->install_package($pkg, $dest_tlpdb, $nopostinstall, $fallbacktlpdb) >>
-+=item C<< $tlpdb->install_package($pkg, $dest_tlpdb [, $tag]) >>
-
- Installs the package $pkg into $dest_tlpdb.
-+If C<$tag> is present and the tlpdb is virtual, tries to install $pkg
-+from the repository tagged with $tag.
-
- =cut
-
- sub install_package {
-- my ($self, $pkg, $totlpdb, $nopostinstall, $fallbackmedia) = @_;
-+ my ($self, $pkg, $totlpdb, $tag) = @_;
-+ if ($self->is_virtual) {
-+ if (defined($tag)) {
-+ if (defined($self->{'packages'}{$pkg}{'tags'}{$tag})) {
-+ return $self->{'tlpdbs'}{$tag}->install_package($pkg, $totlpdb);
-+ } else {
-+ tlwarn("package $pkg not found in repository $tag\n");
-+ return;
-+ }
-+ } else {
-+ my ($maxtag, $maxrev, $maxtlp, $maxtlpdb) = $self->virtual_candidate($pkg);
-+ return $maxtlpdb->install_package($pkg, $totlpdb);
-+ }
-+ } else {
-+ if (defined($tag)) {
-+ tlwarn("not a virtual database, ignoring tag $tag on installation of $pkg\n");
-+ }
-+ return $self->not_virtual_install_package($pkg, $totlpdb);
-+ }
-+ return;
-+}
-+
-+sub not_virtual_install_package {
-+ my ($self, $pkg, $totlpdb) = @_;
- my $fromtlpdb = $self;
- my $ret;
- die("TLPDB not initialized, cannot find tlpdb!") unless (defined($fromtlpdb));
- my $tlpobj = $fromtlpdb->get_package($pkg);
- if (!defined($tlpobj)) {
-- if (defined($fallbackmedia)) {
-- if ($ret = $fallbackmedia->install_package($pkg,$totlpdb, $nopostinstall)) {
-- debug("installed $pkg from fallback\n");
-- return $ret;
-- } else {
-- tlwarn("$0: Cannot find package $pkg (in fallback, either)\n");
-- return 0;
-- }
-- } else {
-- tlwarn("$0: Cannot find package $pkg\n");
-- return 0;
-- }
-+ tlwarn("$0: Cannot find package $pkg\n");
-+ return 0;
- } else {
- my $container_src_split = $fromtlpdb->config_src_container;
- my $container_doc_split = $fromtlpdb->config_doc_container;
-@@ -1182,7 +1383,7 @@
- next;
- }
- } elsif (&media eq 'NET') {
-- $container = "$root/$Archive/$pkg.$DefaultContainerExtension";
-+ $container = "$root/$Archive/$pkg.$TeXLive::TLConfig::DefaultContainerExtension";
- }
- $self->_install_package ($container, $reloc, \@installfiles, $totlpdb)
- || return(0);
-@@ -1256,23 +1457,21 @@
- $totlpdb->save;
- # compute the return value
- TeXLive::TLUtils::announce_execute_actions("enable", $tlpobj);
-- if (!$nopostinstall) {
-- # do the postinstallation actions
-- #
-- # Run the post installation code in the postaction tlpsrc entries
-- # in case we are on w32 and the admin did install for himself only
-- # we switch off admin mode
-- if (win32() && admin() && !$totlpdb->option("w32_multi_user")) {
-- non_admin();
-- }
-- # for now desktop_integration maps to both installation
-- # of desktop shortcuts and menu items, but we can split them later
-- &TeXLive::TLUtils::do_postaction("install", $tlpobj,
-- $totlpdb->option("file_assocs"),
-- $totlpdb->option("desktop_integration"),
-- $totlpdb->option("desktop_integration"),
-- $totlpdb->option("post_code"));
-+ # do the postinstallation actions
-+ #
-+ # Run the post installation code in the postaction tlpsrc entries
-+ # in case we are on w32 and the admin did install for himself only
-+ # we switch off admin mode
-+ if (win32() && admin() && !$totlpdb->option("w32_multi_user")) {
-+ non_admin();
- }
-+ # for now desktop_integration maps to both installation
-+ # of desktop shortcuts and menu items, but we can split them later
-+ &TeXLive::TLUtils::do_postaction("install", $tlpobj,
-+ $totlpdb->option("file_assocs"),
-+ $totlpdb->option("desktop_integration"),
-+ $totlpdb->option("desktop_integration"),
-+ $totlpdb->option("post_code"));
- }
- return 1;
- }
-@@ -1525,7 +1724,7 @@
- # the postaction code part cannot be evaluated now since the
- # files are already removed.
- # Again, desktop integration maps to desktop and menu links
-- if (!$nopostinstall) {
-+ if (!$opts{'nopostinstall'}) {
- &TeXLive::TLUtils::do_postaction("remove", $tlp,
- $localtlpdb->option("file_assocs"),
- $localtlpdb->option("desktop_integration"),
-@@ -1557,7 +1756,12 @@
- sub _set_value_pkg {
- my ($self,$pkgname,$pre,$key,$value) = @_;
- my $k = "$pre$key";
-- my $pkg = $self->{'tlps'}{$pkgname};
-+ my $pkg;
-+ if ($self->is_virtual) {
-+ $pkg = $self->{'tlpdbs'}{'main'}->get_package($pkgname);
-+ } else {
-+ $pkg = $self->{'tlps'}{$pkgname};
-+ }
- my @newdeps;
- if (!defined($pkg)) {
- $pkg = new TeXLive::TLPOBJ;
-@@ -1595,8 +1799,14 @@
- sub _value_pkg {
- my ($self,$pkg,$pre,$key) = @_;
- my $k = "$pre$key";
-- if (defined($self->{'tlps'}{$pkg})) {
-- foreach my $d ($self->{'tlps'}{$pkg}->depends) {
-+ my $tlp;
-+ if ($self->is_virtual) {
-+ $tlp = $self->{'tlpdbs'}{'main'}->get_package($pkg);
-+ } else {
-+ $tlp = $self->{'tlps'}{$pkg};
-+ }
-+ if (defined($tlp)) {
-+ foreach my $d ($tlp->depends) {
- if ($d =~ m!^$k:(.*)$!) {
- return "$1";
- }
-@@ -1709,7 +1919,12 @@
- my ($self, $pre, $hr) = @_;
- my @allowed = keys %$hr;
- my %ret;
-- my $pkg = $self->{'tlps'}{'00texlive.installation'};
-+ my $pkg;
-+ if ($self->is_virtual) {
-+ $pkg = $self->{'tlpdbs'}{'main'}->get_package('00texlive.installation');
-+ } else {
-+ $pkg = $self->{'tlps'}{'00texlive.installation'};
-+ }
- if (defined($pkg)) {
- foreach my $d ($pkg->depends) {
- if ($d =~ m!^$pre([^:]*):(.*)!) {
-@@ -1858,6 +2073,338 @@
-
- =back
-
-+=head1 VIRTUAL DATABASES
-+
-+The purpose of virtual databases is to collect several data sources
-+and present them in one way. The normal functions will always return
-+the best candidate for the set of functions.
-+
-+More docs to be written
-+
-+=cut
-+
-+#
-+# packages are saved:
-+# $self->{'packages'}{$pkgname}{'tags'}{$tag}{'revision'} = $rev
-+# $self->{'packages'}{$pkgname}{'tags'}{$tag}{'tlp'} = $tlp
-+# $self->{'packages'}{$pkgname}{'target'} = $target_tag
-+#
-+
-+sub is_virtual {
-+ my $self = shift;
-+ if (defined($self->{'virtual'}) && $self->{'virtual'}) {
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+sub make_virtual {
-+ my $self = shift;
-+ if (!$self->is_virtual) {
-+ if ($self->list_packages) {
-+ tlerror("Cannot convert a initialized tlpdb to virtual for now!\n");
-+ return 0;
-+ }
-+ $self->{'virtual'} = 1;
-+ }
-+ return 1;
-+}
-+
-+sub virtual_add_tlpdb {
-+ my ($self, $tlpdb, $tag) = @_;
-+ if (!$self->is_virtual) {
-+ tlerror("Cannot add tlpdb to a non-virtual tlpdb!\n");
-+ return 0;
-+ }
-+ $self->{'tlpdbs'}{$tag} = $tlpdb;
-+ for my $p ($tlpdb->list_packages) {
-+ my $tlp = $tlpdb->get_package($p);
-+ $self->{'packages'}{$p}{'tags'}{$tag}{'revision'} = $tlp->revision;
-+ $self->{'packages'}{$p}{'tags'}{$tag}{'tlp'} = $tlp;
-+ }
-+ $self->check_evaluate_pinning();
-+ return 1;
-+}
-+
-+sub virtual_remove_tlpdb {
-+ my ($self, $tag) = @_;
-+ if (!$self->is_virtual) {
-+ tlerror("Cannot remove tlpdb from a non-virtual tlpdb!\n");
-+ return 0;
-+ }
-+ if (!defined($self->{'tlpdbs'}{$tag})) {
-+ tlwarn("TLPDB virtual_remove_tlpdb: unknown tag $tag\n");
-+ return 0;
-+ }
-+ for my $p ($self->{'tlpdbs'}{$tag}->list_packages) {
-+ delete $self->{'packages'}{$p}{'tags'}{$tag};
-+ }
-+ delete $self->{'tlpdbs'}{$tag};
-+ $self->check_evaluate_pinning();
-+ return 1;
-+}
-+
-+sub virtual_get_package {
-+ my ($self, $pkg, $tag) = @_;
-+ if (defined($self->{'packages'}{$pkg}{'tags'}{$tag})) {
-+ return $self->{'packages'}{$pkg}{'tags'}{$tag}{'tlp'};
-+ } else {
-+ tlwarn("pkg $pkg not found in tag $tag\n");
-+ return;
-+ }
-+}
-+
-+=item C<< $tlpdb->candidates ( $pkg ) >>
-+
-+Returns the list of candidates for the given package in the
-+format
-+
-+ tag/revision
-+
-+If the returned list is empty, then the database was not virtual and
-+no install candidate was found.
-+
-+If the returned list contains undef as first element, the database
-+is virtual, and no install candidate was found.
-+
-+The remaining elements in the list are all repositories that provide
-+that package.
-+
-+Note that there might not be an install candidate, but still the
-+package is provided by a sub-repository. This can happen if a package
-+is present only in the sub-repository and there is no explicit pin
-+for that package in the pinning file.
-+
-+=cut
-+
-+sub is_repository {
-+ my $self = shift;
-+ my $tag = shift;
-+ if (!$self->is_virtual) {
-+ return ( ($tag eq $self->{'root'}) ? 1 : 0 );
-+ }
-+ return ( defined($self->{'tlpdbs'}{$tag}) ? 1 : 0 );
-+}
-+
-+
-+# returns a list of tag/rev
-+sub candidates {
-+ my $self = shift;
-+ my $pkg = shift;
-+ my @ret = ();
-+ if ($self->is_virtual) {
-+ if (defined($self->{'packages'}{$pkg})) {
-+ my $t = $self->{'packages'}{$pkg}{'target'};
-+ if (defined($t)) {
-+ push @ret, "$t/" . $self->{'packages'}{$pkg}{'tags'}{$t}{'revision'};
-+ } else {
-+ $t = "";
-+ # no target found, but maybe available somewhere else,
-+ # we return undef as first one
-+ push @ret, undef;
-+ }
-+ # make sure that we always check for main as repo
-+ my @repos = keys %{$self->{'packages'}{$pkg}};
-+ for my $r (sort keys %{$self->{'packages'}{$pkg}{'tags'}}) {
-+ push @ret, "$r/" . $self->{'packages'}{$pkg}{'tags'}{$r}{'revision'}
-+ if ($t ne $r);
-+ }
-+ }
-+ } else {
-+ my $tlp = $self->get_package($pkg);
-+ if (defined($tlp)) {
-+ push @ret, "main/" . $tlp->revision;
-+ }
-+ }
-+ return @ret;
-+}
-+
-+=item C<< $tlpdb->candidate ( ) >>
-+
-+Returns either a list of four undef, if no install candidate is found,
-+or the following information on the install candidate as list: the tag
-+name of the repository, the revision number of the package in the
-+candidate repository, the tlpobj of the package in the candidate
-+repository, and the candidate repository's TLPDB itself.
-+
-+=cut
-+
-+#
-+sub virtual_candidate {
-+ my ($self, $pkg) = @_;
-+ my $t = $self->{'packages'}{$pkg}{'target'};
-+ if (defined($t)) {
-+ return ($t, $self->{'packages'}{$pkg}{'tags'}{$t}{'revision'},
-+ $self->{'packages'}{$pkg}{'tags'}{$t}{'tlp'}, $self->{'tlpdbs'}{$t});
-+ }
-+ return(undef,undef,undef,undef);
-+}
-+
-+=item C<< $tlpdb->virtual_pinning ( [@pinning_data] ) >>
-+
-+Without any argument returns the pinning data, or undef. Be reminded that an
-+empty pinning data will behave differently to no pinning data.
-+
-+With an argument it must be a list of pins, where each pin
-+must be one hash ref with the following keys:
-+C<repo> the tag of the repository,
-+C<glob> the glob for matching a package
-+C<re> the regexp which corresponds to the glob
-+C<line> the line where the glob was found (for warning purpose).
-+
-+=cut
-+
-+sub virtual_pinning {
-+ my $self = shift;
-+ my (@pins) = @_;
-+ if (!$self->is_virtual) {
-+ tlerror("Not-virtual databases cannot have pinning data.\n");
-+ return 0;
-+ }
-+ if (!@pins) {
-+ if (!defined($self->{'pindata'})) {
-+ my @foo = ();
-+ $self->{'pindata'} = \@foo;
-+ }
-+ return (@{$self->{'pindata'}});
-+ } else {
-+ $self->{'pindata'} = \@pins;
-+ $self->check_evaluate_pinning();
-+ return ($self->{'pindata'});
-+ }
-+}
-+
-+# $pin{'repo'} = $repo;
-+# $pin{'glob'} = $glob;
-+# $pin{'re'} = $re;
-+# $pin{'line'} = $line; # for debug/warning purpose
-+sub make_pin_data_from_line {
-+ my $self = shift;
-+ my $l = shift;
-+ my ($a, $b) = split(/:/, $l);
-+ my @ret;
-+ my %m;
-+ $m{'repo'} = $a;
-+ $m{'line'} = $l;
-+ # split the package globs
-+ for (split(/,/, $b)) {
-+ my %mm = %m;
-+ $mm{'glob'} = $_;
-+ $mm{'re'} = glob_to_regex($_);
-+ push @ret, \%mm;
-+ }
-+ return @ret;
-+}
-+
-+sub check_evaluate_pinning {
-+ my $self = shift;
-+ my @pins = (defined($self->{'pindata'}) ? @{$self->{'pindata'}} : ());
-+ #
-+ # run through the pin lines and make sure that all the conditions
-+ # and requirements are obeyed
-+ my %pkgs = %{$self->{'packages'}};
-+ # main:*
-+ my ($mainpin) = $self->make_pin_data_from_line("main:*");
-+ # the default main:* is always considered to be matched
-+ $mainpin->{'hit'} = 1;
-+ push @pins, $mainpin;
-+ for my $pkg (keys %pkgs) {
-+ PINS: for my $pp (@pins) {
-+ my $pre = $pp->{'re'};
-+ if (($pkg =~ m/$pre/) &&
-+ (defined($self->{'packages'}{$pkg}{'tags'}{$pp->{'repo'}}))) {
-+ $self->{'packages'}{$pkg}{'target'} = $pp->{'repo'};
-+ # register that this pin was hit
-+ $pp->{'hit'} = 1;
-+ last PINS;
-+ }
-+ }
-+ }
-+ # check that all pinning lines where hit
-+ for my $p (@pins) {
-+ next if defined($p->{'hit'});
-+ tlwarn("pinning warning: the entry in line\n ", $p->{'line'},
-+ "\nconcerning the package pattern ", $p->{'glob'},
-+ "\nis not matched by any package!\n");
-+ }
-+}
-+
-+
-+# implementation copied from Text/Glob.pm (copyright Richard Clamp).
-+# changes made:
-+# remove $strict_leading_dot and $strict_wildcard_slash if calls
-+# and execute the code unconditionally, as we do not change the
-+# default settings of 1 of these two variables.
-+sub glob_to_regex {
-+ my $glob = shift;
-+ my $regex = glob_to_regex_string($glob);
-+ return qr/^$regex$/;
-+}
-+
-+sub glob_to_regex_string
-+{
-+ my $glob = shift;
-+ my ($regex, $in_curlies, $escaping);
-+ local $_;
-+ my $first_byte = 1;
-+ for ($glob =~ m/(.)/gs) {
-+ if ($first_byte) {
-+ $regex .= '(?=[^\.])' unless $_ eq '.';
-+ $first_byte = 0;
-+ }
-+ if ($_ eq '/') {
-+ $first_byte = 1;
-+ }
-+ if ($_ eq '.' || $_ eq '(' || $_ eq ')' || $_ eq '|' ||
-+ $_ eq '+' || $_ eq '^' || $_ eq '$' || $_ eq '@' || $_ eq '%' ) {
-+ $regex .= "\\$_";
-+ }
-+ elsif ($_ eq '*') {
-+ $regex .= $escaping ? "\\*" : "[^/]*";
-+ }
-+ elsif ($_ eq '?') {
-+ $regex .= $escaping ? "\\?" : "[^/]";
-+ }
-+ elsif ($_ eq '{') {
-+ $regex .= $escaping ? "\\{" : "(";
-+ ++$in_curlies unless $escaping;
-+ }
-+ elsif ($_ eq '}' && $in_curlies) {
-+ $regex .= $escaping ? "}" : ")";
-+ --$in_curlies unless $escaping;
-+ }
-+ elsif ($_ eq ',' && $in_curlies) {
-+ $regex .= $escaping ? "," : "|";
-+ }
-+ elsif ($_ eq "\\") {
-+ if ($escaping) {
-+ $regex .= "\\\\";
-+ $escaping = 0;
-+ }
-+ else {
-+ $escaping = 1;
-+ }
-+ next;
-+ }
-+ else {
-+ $regex .= $_;
-+ $escaping = 0;
-+ }
-+ $escaping = 0;
-+ }
-+ print "# $glob $regex\n" if debug;
-+
-+ return $regex;
-+}
-+
-+sub match_glob {
-+ print "# ", join(', ', map { "'$_'" } @_), "\n" if debug;
-+ my $glob = shift;
-+ my $regex = glob_to_regex $glob;
-+ local $_;
-+ grep { $_ =~ $regex } @_;
-+}
-+
- =pod
-
- =head1 OPTIONS
-Index: texmf/scripts/texlive/tlmgr.pl
-===================================================================
---- texmf/scripts/texlive/tlmgr.pl.orig 2012-01-12 14:25:20.000000000 +0900
-+++ texmf/scripts/texlive/tlmgr.pl 2012-01-18 10:08:48.582889699 +0900
-@@ -124,6 +124,7 @@
- "package-logfile" => "=s",
- "persistent-downloads" => "!",
- "no-execute-actions" => 1,
-+ "pin-file" => "=s",
- "pause" => 1,
- "print-platform|print-arch" => 1,
- "version" => 1,
-@@ -135,6 +136,8 @@
- "option" => { },
- "conf" => { },
- "version" => { },
-+ "repository" => { },
-+ "candidate" => { },
- "backup" => { "backupdir" => "=s",
- "clean" => ":-99",
- "all" => 1,
-@@ -504,6 +507,12 @@
- } elsif ($action =~ m/^option$/i) {
- action_option();
- finish(0);
-+ } 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);
-@@ -533,7 +542,7 @@
- action_dumptlpdb();
- finish(0);
- } elsif ($action =~ m/^show$/i) {
-- action_show();
-+ action_show(@ARGV);
- finish(0);
- } elsif ($action =~ m/^remove$/i) {
- action_remove();
-@@ -1145,7 +1154,8 @@
- tlwarn("tlmgr: Cannot load taxonomy file, showing taxonomies not supported.\n");
- }
- }
-- foreach my $pkg (@ARGV) {
-+ foreach my $ppp (@_) {
-+ my ($pkg, $tag) = split '@', $ppp, 2;
- my $tlpdb = $localtlpdb;
- my $tlp = $localtlpdb->get_package($pkg);
- my $installed = 0;
-@@ -1153,126 +1163,179 @@
- if (!$remotetlpdb) {
- init_tlmedia();
- }
-- $tlp = $remotetlpdb->get_package($pkg);
-- $tlpdb = $remotetlpdb;
-- } else {
-- $installed = 1;
-- }
-- if ($tlp) {
-- my @colls;
-- if ($tlp->category ne "Collection" && $tlp->category ne "Scheme") {
-- @colls = $localtlpdb->needed_by($pkg);
-- if (!@colls) {
-- # not referenced in the local tlpdb, so try the remote here, too
-- if (!$remotetlpdb) {
-- init_tlmedia();
-+ if (defined($tag)) {
-+ if (!$remotetlpdb->is_virtual) {
-+ tlwarn("tlmgr: specifying implicite tags is not allowed for non-virtual databases!\n");
-+ next;
-+ } else {
-+ if (!$remotetlpdb->is_repository($tag)) {
-+ tlwarn("tlmgr: no such repository tag defined: $tag\n");
-+ next;
- }
-- @colls = $remotetlpdb->needed_by($pkg);
- }
- }
-- # some packages might depend on other packages, so do not
-- # include arbitrary package in the list of collections, but
-- # only collectons:
-- @colls = grep {m;^collection-;} @colls;
-- print "package: ", $tlp->name, "\n";
-- print "category: ", $tlp->category, "\n";
-- print "shortdesc: ", $tlp->shortdesc, "\n" if ($tlp->shortdesc);
-- print "longdesc: ", $tlp->longdesc, "\n" if ($tlp->longdesc);
-- print "installed: ", ($installed ? "Yes" : "No"), "\n";
-- print "revision: ", $tlp->revision, "\n" if ($installed);
-- print "cat-version: ", $tlp->cataloguedata->{'version'}, "\n"
-- if $tlp->cataloguedata->{'version'};
-- print "cat-date: ", $tlp->cataloguedata->{'date'}, "\n"
-- if $tlp->cataloguedata->{'date'};
-- print "cat-license: ", $tlp->cataloguedata->{'license'}, "\n"
-- if $tlp->cataloguedata->{'license'};
-- print "collection: ", @colls, "\n" if (@colls);
-- if ($opts{"keyword"} || $opts{"taxonomy"}) {
-- print "keywords: ";
-- if (defined($taxonomy->{'by-package'}{'keyword'}{$pkg})) {
-- print join(', ',@{$taxonomy->{'by-package'}{'keyword'}{$pkg}}), "\n";
-- } else {
-- print "(none found)\n";
-+ $tlp = $remotetlpdb->get_package($pkg, $tag);
-+ if (!$tlp) {
-+ if (defined($tag)) {
-+ # we already searched for the package in a specific tag, don't retry
-+ # all candidates!
-+ tlwarn("tlmgr: Cannot find package $pkg in repository $tag\n");
-+ next;
- }
-- }
-- if ($opts{"functionality"} || $opts{"taxonomy"}) {
-- print "function: ";
-- if (defined($taxonomy->{'by-package'}{'functionality'}{$pkg})) {
-- print join(', ',@{$taxonomy->{'by-package'}{'functionality'}{$pkg}}), "\n";
-- } else {
-- print "(none found)\n";
-+ if ($remotetlpdb->is_virtual) {
-+ # we might have a package that is available in a
-+ # subsidiary repository, but not installable
-+ # because it is not pinned
-+ # we will list it but warn about this fact
-+ my @cand = $remotetlpdb->candidates($pkg);
-+ if (@cand) {
-+ my $first = shift @cand;
-+ if (defined($first)) {
-+ tlwarn("strange, we have a first candidate but no tlp: $pkg\n");
-+ next;
-+ }
-+ # already shifted away the first element
-+ if ($#cand >= 0) {
-+ # recursively showing all tags, but warn
-+ print "package: ", $pkg, "\n";
-+ print "WARNING: This package is not pinned but present in subsidiary repositories\n";
-+ print "WARNING: As long as it is not pinned it is not installable.\n";
-+ print "WARNING: Listing all available copies of the package.\n";
-+ my @aaa;
-+ for my $a (@cand) {
-+ my ($t,$r) = split(/\//, $a, 2);
-+ push @aaa, "$pkg" . '@' . $t;
-+ }
-+ action_show(@aaa);
-+ next;
-+ } else {
-+ tlwarn("strange, package listed but no residual candidates: $pkg\n");
-+ next;
-+ }
-+ } else {
-+ tlwarn("strange, package listed but no candidates: $pkg\n");
-+ next;
-+ }
- }
-+ tlwarn("tlmgr: cannot find package $pkg\n");
-+ next;
- }
-- if ($opts{"characterization"} || $opts{"taxonomy"}) {
-- print "primary characterization: ";
-- if (defined($taxonomy->{'by-package'}{'primary'}{$pkg})) {
-- print $taxonomy->{'by-package'}{'primary'}{$pkg}, "\n";
-- } else {
-- print "(none found)\n";
-- }
-- print "secondary characterization: ";
-- if (defined($taxonomy->{'by-package'}{'secondary'}{$pkg})) {
-- print $taxonomy->{'by-package'}{'secondary'}{$pkg}, "\n";
-- } else {
-- print "(none found)\n";
-- }
-+ $tlpdb = $remotetlpdb;
-+ } else {
-+ $installed = 1;
-+ }
-+ my @colls;
-+ if ($tlp->category ne "Collection" && $tlp->category ne "Scheme") {
-+ @colls = $localtlpdb->needed_by($pkg);
-+ if (!@colls) {
-+ # not referenced in the local tlpdb, so try the remote here, too
-+ if (!$remotetlpdb) {
-+ init_tlmedia();
-+ }
-+ @colls = $remotetlpdb->needed_by($pkg);
-+ }
-+ }
-+ # some packages might depend on other packages, so do not
-+ # include arbitrary package in the list of collections, but
-+ # only collectons:
-+ @colls = grep {m;^collection-;} @colls;
-+ print "package: ", $tlp->name, "\n";
-+ print "repository: ", $tag, "\n" if (defined($tag));
-+ print "category: ", $tlp->category, "\n";
-+ print "shortdesc: ", $tlp->shortdesc, "\n" if ($tlp->shortdesc);
-+ print "longdesc: ", $tlp->longdesc, "\n" if ($tlp->longdesc);
-+ print "installed: ", ($installed ? "Yes" : "No"), "\n";
-+ print "revision: ", $tlp->revision, "\n" if ($installed);
-+ print "cat-version: ", $tlp->cataloguedata->{'version'}, "\n"
-+ if $tlp->cataloguedata->{'version'};
-+ print "cat-date: ", $tlp->cataloguedata->{'date'}, "\n"
-+ if $tlp->cataloguedata->{'date'};
-+ print "cat-license: ", $tlp->cataloguedata->{'license'}, "\n"
-+ if $tlp->cataloguedata->{'license'};
-+ print "collection: ", @colls, "\n" if (@colls);
-+ if ($opts{"keyword"} || $opts{"taxonomy"}) {
-+ print "keywords: ";
-+ if (defined($taxonomy->{'by-package'}{'keyword'}{$pkg})) {
-+ print join(', ',@{$taxonomy->{'by-package'}{'keyword'}{$pkg}}), "\n";
-+ } else {
-+ print "(none found)\n";
-+ }
-+ }
-+ if ($opts{"functionality"} || $opts{"taxonomy"}) {
-+ print "function: ";
-+ if (defined($taxonomy->{'by-package'}{'functionality'}{$pkg})) {
-+ print join(', ',@{$taxonomy->{'by-package'}{'functionality'}{$pkg}}), "\n";
-+ } else {
-+ print "(none found)\n";
-+ }
-+ }
-+ if ($opts{"characterization"} || $opts{"taxonomy"}) {
-+ print "primary characterization: ";
-+ if (defined($taxonomy->{'by-package'}{'primary'}{$pkg})) {
-+ print $taxonomy->{'by-package'}{'primary'}{$pkg}, "\n";
-+ } else {
-+ print "(none found)\n";
-+ }
-+ print "secondary characterization: ";
-+ if (defined($taxonomy->{'by-package'}{'secondary'}{$pkg})) {
-+ print $taxonomy->{'by-package'}{'secondary'}{$pkg}, "\n";
-+ } else {
-+ print "(none found)\n";
- }
-- if ($opts{"list"}) {
-- if ($tlp->category eq "Collection" || $tlp->category eq "Scheme") {
-- # in the case of collections of schemes we list the deps
-- my @deps = $tlp->depends;
-- if (@deps) {
-- print "depends:\n";
-- for my $d (@deps) {
-- print "\t$d\n";
-- }
-+ }
-+ if ($opts{"list"}) {
-+ if ($tlp->category eq "Collection" || $tlp->category eq "Scheme") {
-+ # in the case of collections of schemes we list the deps
-+ my @deps = $tlp->depends;
-+ if (@deps) {
-+ print "depends:\n";
-+ for my $d (@deps) {
-+ print "\t$d\n";
- }
- }
-- print "Included files, by type:\n";
-- # if the package has a .ARCH dependency we also list the files for
-- # those packages
-- my @todo = $tlpdb->expand_dependencies("-only-arch", $tlpdb, ($pkg));
-- for my $d (sort @todo) {
-- my $foo = $tlpdb->get_package($d);
-- if (!$foo) {
-- tlwarn ("\nShould not happen, no dependent package $d\n");
-- next;
-- }
-- if ($d ne $pkg) {
-- print "depending package $d:\n";
-- }
-- if ($foo->runfiles) {
-- print "run files:\n";
-- for my $f (sort $foo->runfiles) { print " $f\n"; }
-- }
-- if ($foo->srcfiles) {
-- print "source files:\n";
-- for my $f (sort $foo->srcfiles) { print " $f\n"; }
-- }
-- if ($foo->docfiles) {
-- print "doc files:\n";
-- for my $f (sort $foo->docfiles) {
-- print " $f";
-- my $dfd = $foo->docfiledata;
-- if (defined($dfd->{$f})) {
-- for my $k (keys %{$dfd->{$f}}) {
-- print " $k=\"", $dfd->{$f}->{$k}, '"';
-- }
-+ }
-+ print "Included files, by type:\n";
-+ # if the package has a .ARCH dependency we also list the files for
-+ # those packages
-+ my @todo = $tlpdb->expand_dependencies("-only-arch", $tlpdb, ($pkg));
-+ for my $d (sort @todo) {
-+ my $foo = $tlpdb->get_package($d);
-+ if (!$foo) {
-+ tlwarn ("\nShould not happen, no dependent package $d\n");
-+ next;
-+ }
-+ if ($d ne $pkg) {
-+ print "depending package $d:\n";
-+ }
-+ if ($foo->runfiles) {
-+ print "run files:\n";
-+ for my $f (sort $foo->runfiles) { print " $f\n"; }
-+ }
-+ if ($foo->srcfiles) {
-+ print "source files:\n";
-+ for my $f (sort $foo->srcfiles) { print " $f\n"; }
-+ }
-+ if ($foo->docfiles) {
-+ print "doc files:\n";
-+ for my $f (sort $foo->docfiles) {
-+ print " $f";
-+ my $dfd = $foo->docfiledata;
-+ if (defined($dfd->{$f})) {
-+ for my $k (keys %{$dfd->{$f}}) {
-+ print " $k=\"", $dfd->{$f}->{$k}, '"';
- }
-- print "\n";
- }
-+ print "\n";
- }
-- # in case we have them
-- if ($foo->allbinfiles) {
-- print "bin files (all platforms):\n";
-- for my $f (sort $foo->allbinfiles) { print " $f\n"; }
-- }
-+ }
-+ # in case we have them
-+ if ($foo->allbinfiles) {
-+ print "bin files (all platforms):\n";
-+ for my $f (sort $foo->allbinfiles) { print " $f\n"; }
- }
- }
-- print "\n";
-- } else {
-- printf STDERR "tlmgr: cannot find $pkg\n";
- }
-+ print "\n";
- }
- return;
- }
-@@ -2048,7 +2111,12 @@
- # intersection, don't check A\B and B\A
- next if $newpkgs_full{$p};
- next if $removals_full{$p};
-- next if ($remotetlpdb->get_package($p)->category ne "Collection");
-+ my $remotetlp = $remotetlpdb->get_package($p);
-+ if (!defined($remotetlp)) {
-+ tlwarn("Strange, $p mentioned but not found anywhere!\n");
-+ next;
-+ }
-+ next if ($remotetlp->category ne "Collection");
- my $tlp = $localtlpdb->get_package($p);
- if (!defined($tlp)) {
- if ($opts{"reinstall-forcibly-removed"}) {
-@@ -2149,17 +2217,38 @@
- $ret = 1;
- shift;
- }
-- my ($pkg, $flag, $lrev, $rrev, @args) = @_;
-+ my ($pkg, $flag, $lrev, $rrev, $size, $runtime, $esttot, $tag) = @_;
- $lrev ||= "-";
- $rrev ||= "-";
- $flag ||= "?";
-- my $str = "$pkg\t$flag\t$lrev\t$rrev\t";
-- $str .= join("\t", @args) if (@args);
-+ $size ||= "-";
-+ $runtime ||= "-";
-+ $esttot ||= "-";
-+ $tag ||= "-";
-+ my $str = join("\t", $pkg, $flag, $lrev, $rrev, $size, $runtime, $esttot, $tag);
- $str .= "\n";
- return($str) if $ret;
- print $str;
- }
-
-+sub upd_info {
-+ my ($pkg, $kb, $lrev, $mrev, $txt) = @_;
-+ my $flen = 25;
-+ my $kbstr = ($kb >= 0 ? " [${kb}k]" : "");
-+ my $kbstrlen = length($kbstr);
-+ my $pkglen = length($pkg);
-+ my $is = sprintf("%-9s ", "$txt:");
-+ if ($pkglen + $kbstrlen > $flen) {
-+ $is .= "$pkg$kbstr: ";
-+ } else {
-+ $is .= sprintf ('%*2$s', $pkg, -($flen-$kbstrlen));
-+ $is .= "$kbstr: ";
-+ }
-+ $is .= sprintf("local: %6s, source: %8s",
-+ $lrev, $mrev);
-+ info("$is\n");
-+}
-+
- sub action_update {
- init_local_db(1);
- $opts{"no-depends"} = 1 if $opts{"no-depends-at-all"};
-@@ -2414,20 +2503,36 @@
- next;
- }
- my $rev = $tlp->revision;
-- my $mediatlp = $remotetlpdb->get_package($pkg);
-+ my $mediatlp;
-+ my $maxtag;
-+ if ($remotetlpdb->is_virtual) {
-+ ($maxtag, undef, $mediatlp, undef) =
-+ $remotetlpdb->virtual_candidate($pkg);
-+ } else {
-+ $mediatlp = $remotetlpdb->get_package($pkg);
-+ }
- if (!defined($mediatlp)) {
- debug("$pkg cannot be found in $location\n");
- next;
- }
- my $mediarev = $mediatlp->revision;
-+ my $mediarevstr = $mediarev;
-+ my @addargs = ();
-+ if ($remotetlpdb->is_virtual) {
-+ push @addargs, $maxtag;
-+ $mediarevstr .= "\@$maxtag";
-+ }
- if ($rev < $mediarev) {
- $updated{$pkg} = 0; # will be changed to one on successful update
- } elsif ($rev > $mediarev) {
- if ($::machinereadable) {
- push @addlines,
-- machine_line("-ret", $pkg, $FLAG_REVERSED_UPDATE, $rev, $mediarev, "-");
-+ machine_line("-ret", $pkg, $FLAG_REVERSED_UPDATE, $rev, $mediarev, "-", @addargs);
- } else {
-- info("$pkg: local: $rev, source: $mediarev (reverse, keep)\n");
-+ if ($opts{"list"}) {
-+ # not issueing anything if we keep a package
-+ upd_info($pkg, -1, $rev, $mediarevstr, "keep");
-+ }
- }
- }
- }
-@@ -2525,6 +2630,8 @@
- }
- }
-
-+ # parameters for field width
-+ my $totalnrdigits = length("$totalnr");
-
- #
- # ORDER OF PACKAGE ACTIONS
-@@ -2557,7 +2664,7 @@
- if ($::machinereadable) {
- machine_line($p, $FLAG_REMOVE, $rev, "-", "-", "-");
- } else {
-- info("$p: local: $rev, source: <absent> (auto-remove)\n");
-+ upd_info($p, -1, $rev, "<absent>", "autorem");
- }
- $currnr++;
- } else {
-@@ -2569,7 +2676,8 @@
- if ($::machinereadable) {
- machine_line($p, $FLAG_REMOVE, $rev, "-", "-", "-");
- } else {
-- info("[$currnr/$totalnr] auto-remove: $p\n");
-+ info("[" . sprintf ('%*2$s', $currnr, $totalnrdigits) .
-+ "/$totalnr] auto-remove: $p ... ");
- }
- if (!$opts{"dry-run"}) {
- if ($opts{"backup"}) {
-@@ -2585,6 +2693,7 @@
- $localtlpdb->remove_package($p);
- logpackage("remove: $p");
- }
-+ info("done\n") unless $::machinereadable;
- $currnr++;
- }
- }
-@@ -2678,19 +2787,44 @@
- my $unwind_package;
- my $remove_unwind_container = 0;
- my $rev = $tlp->revision;
-- my $mediatlp = $remotetlpdb->get_package($pkg);
-+ my $mediatlp;
-+ my $maxtag;
-+ if ($remotetlpdb->is_virtual) {
-+ ($maxtag, undef, $mediatlp, undef) =
-+ $remotetlpdb->virtual_candidate($pkg);
-+ } else {
-+ $mediatlp = $remotetlpdb->get_package($pkg);
-+ }
- if (!defined($mediatlp)) {
- debug("$pkg cannot be found in $location\n");
- next;
- }
- my $mediarev = $mediatlp->revision;
-+ my $mediarevstr = $mediarev;
-+ my @addargs = ();
-+ if ($remotetlpdb->is_virtual) {
-+ push @addargs, $maxtag;
-+ $mediarevstr .= "\@$maxtag";
-+ }
- $nrupdated++;
- if ($opts{"list"}) {
- if ($::machinereadable) {
-- machine_line($pkg, $FLAG_UPDATE, $rev, $mediarev, $sizes{$pkg});
-+ machine_line($pkg, $FLAG_UPDATE, $rev, $mediarev, $sizes{$pkg}, "-", "-", @addargs);
- } else {
- my $kb = int($sizes{$pkg} / 1024) + 1;
-- info("$pkg [${kb}k]: local: $rev, source: $mediarev (update)\n");
-+ upd_info($pkg, $kb, $rev, $mediarevstr, "update");
-+ if ($remotetlpdb->is_virtual) {
-+ my @cand = $remotetlpdb->candidates($pkg);
-+ shift @cand; # remove the top element
-+ if (@cand) {
-+ print "\tother candidates: ";
-+ for my $a (@cand) {
-+ my ($t,$r) = split(/\//, $a, 2);
-+ print $r . '@' . $t . " ";
-+ }
-+ print "\n";
-+ }
-+ }
- }
- $updated{$pkg} = 1;
- next;
-@@ -2731,10 +2865,11 @@
- }
-
- if ($::machinereadable) {
-- machine_line($pkg, $FLAG_UPDATE, $rev, $mediarev, $sizes{$pkg}, $estrem, $esttot);
-+ machine_line($pkg, $FLAG_UPDATE, $rev, $mediarev, $sizes{$pkg}, $estrem, $esttot, @addargs);
- } else {
- my $kb = int ($sizes{$pkg} / 1024) + 1;
-- info("[$currnr/$totalnr, $estrem/$esttot] update: $pkg [${kb}k] ($rev -> $mediarev)");
-+ info("[" . sprintf ('%*2$s', $currnr, $totalnrdigits) .
-+ "/$totalnr, $estrem/$esttot] update: $pkg [${kb}k] ($rev -> $mediarevstr)");
- }
- $donesize += $sizes{$pkg};
- $currnr++;
-@@ -2777,7 +2912,7 @@
- }
- if ($remotetlpdb->install_package($pkg, $localtlpdb)) {
- # installation succeeded because we got a reference
-- logpackage("update: $pkg ($rev -> $mediarev)");
-+ logpackage("update: $pkg ($rev -> $mediarevstr)");
- unlink($unwind_package) if $remove_unwind_container;
- # remember successful update
- $updated{$pkg} = 1;
-@@ -2805,7 +2940,7 @@
- # now in fact we should do some cleanup, removing files and
- # dirs from the new package before re-installing the old one.
- # TODO
-- logpackage("failed update: $pkg ($rev -> $mediarev)");
-+ logpackage("failed update: $pkg ($rev -> $mediarevstr)");
- tlwarn("\n\nInstallation of new version of $pkg did fail, trying to unwind.\n");
- if (win32()) {
- # w32 is notorious for not releasing a file immediately
-@@ -2846,12 +2981,25 @@
- unless $::machinereadable;
- } else {
- # install new packages
-- my $mediatlp = $remotetlpdb->get_package($pkg);
-+ my $mediatlp;
-+ my $maxtag;
-+ if ($remotetlpdb->is_virtual) {
-+ ($maxtag, undef, $mediatlp, undef) =
-+ $remotetlpdb->virtual_candidate($pkg);
-+ } else {
-+ $mediatlp = $remotetlpdb->get_package($pkg);
-+ }
- if (!defined($mediatlp)) {
- tlwarn("\nShould not happen: $pkg not found in $location\n");
- next;
- }
- my $mediarev = $mediatlp->revision;
-+ my $mediarevstr = $mediarev;
-+ my @addargs;
-+ if ($remotetlpdb->is_virtual) {
-+ $mediarevstr .= "\@$maxtag";
-+ push @addargs, $maxtag;
-+ }
- my ($estrem, $esttot);
- if (!$opts{"list"}) {
- ($estrem, $esttot) = TeXLive::TLUtils::time_estimate($totalsize,
-@@ -2861,14 +3009,16 @@
- my @maargs = ($pkg, $FLAG_AUTOINSTALL, "-", $mediatlp->revision, $sizes{$pkg});
- if (!$opts{"list"}) {
- push @maargs, $estrem, $esttot;
-+ } else {
-+ push @maargs, undef, undef;
- }
-- machine_line(@maargs);
-+ machine_line(@maargs, @addargs);
- } else {
- my $kb = int($sizes{$pkg} / 1024) + 1;
- if ($opts{"list"}) {
-- info("$pkg [${kb}k]: local: <absent>, source: " . $mediatlp->revision . " (auto-install)\n");
-+ upd_info($pkg, $kb, "<absent>", $mediarevstr, "autoinst");
- } else {
-- info("[$currnr/$totalnr, $estrem/$esttot] auto-install: $pkg [${kb}k]\n");
-+ info("[$currnr/$totalnr, $estrem/$esttot] auto-install: $pkg ($mediarevstr) [${kb}k]\n");
- }
- }
- $currnr++;
-@@ -2876,7 +3026,7 @@
- next if ($opts{"dry-run"} || $opts{"list"});
- if ($remotetlpdb->install_package($pkg, $localtlpdb)) {
- # installation succeeded because we got a reference
-- logpackage("auto-install new: $pkg ($mediarev)");
-+ logpackage("auto-install new: $pkg ($mediarevstr)");
- $nrupdated++;
- } else {
- tlwarn("$0: couldn't install new package $pkg\n");
-@@ -3023,6 +3173,7 @@
- if (!(@new || @updated)) {
- info("tlmgr: no updates available\n");
- if ($remotetlpdb->media ne "NET"
-+ && $remotetlpdb->media ne "virtual"
- && !$opts{"dry-run"}
- && !$opts{"repository"}
- ) {
-@@ -3101,6 +3252,14 @@
- @packs = $remotetlpdb->expand_dependencies($localtlpdb, @packs) unless $opts{"no-depends"};
- }
- #
-+ # expand dependencies returns a list pkg@tag in case of a virtual
-+ # remote db.
-+ my %packs;
-+ for my $p (@packs) {
-+ my ($pp, $aa) = split('@', $p);
-+ $packs{$pp} = (defined($aa) ? $aa : 0);
-+ }
-+ #
- # installation order of packages:
- # first all normal packages, then collections, then schemes
- # isn't already installed, but the collection already updated, it will
-@@ -3108,7 +3267,7 @@
- my @inst_packs;
- my @inst_colls;
- my @inst_schemes;
-- for my $pkg (sort @packs) {
-+ for my $pkg (sort keys %packs) {
- # we do name checking here, not to load all tlpobj again and again
- if ($pkg =~ m/^scheme-/) {
- push @inst_schemes, $pkg;
-@@ -3127,7 +3286,11 @@
- my @todo;
- for my $pkg (@inst_packs, @inst_colls, @inst_schemes) {
- my $pkgrev = 0;
-- my $mediatlp = $remotetlpdb->get_package($pkg);
-+ # if the package name is asked from a specific repository, use
-+ # that one, otherwise leave the decision to $remotetlpdb by not
-+ # giving a final argument
-+ my $mediatlp = $remotetlpdb->get_package($pkg,
-+ ($packs{$pkg} ? $packs{$pkg} : undef));
- if (!defined($mediatlp)) {
- tlwarn("package $pkg not present in package repository.\n");
- next;
-@@ -3175,13 +3338,26 @@
- my ($estrem, $esttot) = TeXLive::TLUtils::time_estimate($totalsize,
- $donesize, $starttime);
- my $kb = int($sizes{$pkg} / 1024) + 1;
-+ my @addargs = ();
-+ my $tagstr = "";
-+ if ($remotetlpdb->is_virtual) {
-+ if ($packs{$pkg} ne "0") {
-+ push @addargs, $packs{$pkg};
-+ $tagstr = " \@" . $packs{$pkg};
-+ } else {
-+ my ($maxtag,undef,undef,undef) = $remotetlpdb->virtual_candidate($pkg);
-+ push @addargs, $maxtag;
-+ $tagstr = " \@" . $maxtag;
-+ }
-+ }
- if ($::machinereadable) {
-- machine_line($pkg, $flag, "-", $revs{$pkg}, $sizes{$pkg}, $estrem, $esttot);
-+ machine_line($pkg, $flag, "-", $revs{$pkg}, $sizes{$pkg}, $estrem, $esttot, @addargs);
- } else {
-- info("[$currnr/$totalnr, $estrem/$esttot] ${re}install: $pkg [${kb}k]\n");
-+ info("[$currnr/$totalnr, $estrem/$esttot] ${re}install: $pkg$tagstr [${kb}k]\n");
- }
- if (!$opts{"dry-run"}) {
-- $remotetlpdb->install_package($pkg, $localtlpdb);
-+ $remotetlpdb->install_package($pkg, $localtlpdb,
-+ ($packs{$pkg} ? $packs{$pkg} : undef) );
- logpackage("${re}install: $pkg");
- }
- $donesize += $sizes{$pkg};
-@@ -3204,7 +3380,7 @@
- # we list them, otherwise we go direct into tlmgr show $pkg mode
- if ($what !~ m/^(collection|scheme)/i) {
- tlwarn("(switching to show mode)\n");
-- action_show();
-+ action_show(@ARGV);
- return;
- }
- } else {
-@@ -3223,7 +3399,11 @@
- } elsif ($what =~ m/^scheme/i) {
- @whattolist = $tlm->schemes;
- } else {
-- @whattolist = $tlm->list_packages;
-+ if ($remotetlpdb->is_virtual) {
-+ @whattolist = $tlm->list_packages("-all");
-+ } else {
-+ @whattolist = $tlm->list_packages;
-+ }
- }
- foreach (@whattolist) {
- next if ($_ =~ m/^00texlive/);
-@@ -3232,12 +3412,198 @@
- } else {
- print " ";
- }
-- my $foo = $tlm->get_package($_)->shortdesc;
-+ my $tlp = $tlm->get_package($_);
-+ if (!$tlp) {
-+ if ($remotetlpdb->is_virtual) {
-+ # we might have the case that a package is present in a
-+ # subsidiary repository, but not pinned, so it will
-+ # not be found by ->get_package
-+ # In this case we list all repositories shipping it,
-+ # but warn that it is not pinned and thus not reachable.
-+ my @cand = $remotetlpdb->candidates($_);
-+ if (@cand) {
-+ my $first = shift @cand;
-+ if (defined($first)) {
-+ tlwarn("strange, we have a first candidate but no tlp: $_\n");
-+ next;
-+ }
-+ # already shifted away the first element
-+ if ($#cand >= 0) {
-+ print "$_: --- no installable candidate found, \n";
-+ print " but present in subsidiary repositories without a pin.\n";
-+ print " This package is not reachable without pinning.\n";
-+ print " Repositories containing this package:\n";
-+ for my $a (@cand) {
-+ my ($t,$r) = split(/\//, $a, 2);
-+ my $tlp = $remotetlpdb->get_package($_, $t);
-+ my $foo = $tlp->shortdesc;
-+ print " $t: ", defined($foo) ? $foo : "(shortdesc missing)" , "\n";
-+ }
-+ next;
-+ } else {
-+ tlwarn("strange, package listed but no residual candidates: $_\n");
-+ next;
-+ }
-+ } else {
-+ tlwarn("strange, package listed but no candidates: $_\n");
-+ next;
-+ }
-+ } else {
-+ tlwarn("strange, package cannot be found in remote tlpdb: $_\n");
-+ next;
-+ }
-+ }
-+ my $foo = $tlp->shortdesc;
- print "$_: ", defined($foo) ? $foo : "(shortdesc missing)" , "\n";
- }
- 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;
-+ $what = "list" if !defined($what);
-+ 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?
-+ # if there was till now only *one* repository and that without
-+ # a tag, we give that one the "main" tag which is necessary
-+ # for proper operation!
-+ my @tags = keys %repos;
-+ if ($#tags == 0) {
-+ # we have only one repository, check if it has the main tag
-+ my $maintag = $tags[0];
-+ if ($maintag ne 'main') {
-+ $repos{'main'} = $repos{$maintag};
-+ delete $repos{$maintag};
-+ }
-+ }
-+ $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") {
-+ # TODO TODO
-+ # we have to make sure that there is ONE main repository!!!
-+ %repos = repository_to_array("@ARGV");
-+ $localtlpdb->option("location", array_to_repository(%repos));
-+ $localtlpdb->save;
-+ return;
-+ }
-+ # we are still here, unknown command to repository
-+ tlwarn("tlmgr: unknown directive to tlmgr repository: $what\n");
-+ return;
-+}
-+
-+sub action_candidates {
-+ my $what = shift @ARGV;
-+ if (!defined($what)) {
-+ tlwarn("tlmgr: action candidates needs a package name as argument\n");
-+ return;
-+ }
-+ init_local_db();
-+ init_tlmedia();
-+ my @cand = $remotetlpdb->candidates($what);
-+ if (@cand) {
-+ my $first = shift @cand;
-+ if (defined($first)) {
-+ my ($t,$r) = split(/\//, $first, 2);
-+ print "Install candidate for $what from $t ($r)\n";
-+ } else {
-+ print "No install candidate for $what found.\n";
-+ }
-+ # already shifted away the first element
-+ if ($#cand >= 0) {
-+ print "Other repositories providing this package:\n";
-+ for my $a (@cand) {
-+ my ($t,$r) = split(/\//, $a, 2);
-+ print "$t ($r)\n";
-+ }
-+ }
-+ } else {
-+ print "Package $what not found.\n";
-+ }
-+ return;
-+}
-
- # OPTION
- #
-@@ -4601,6 +4967,87 @@
- #
- sub init_tlmedia
- {
-+ # first check if $location contains multiple locations
-+ # in this case we go to virtual mode
-+ #my %repos = repository_to_array($localtlpdb->option("location"));
-+ my %repos = repository_to_array($location);
-+ my @tags = keys %repos;
-+ # if we have only one repo, but this one contains a name tag #....
-+ # then we remove it and save the local tlpdb
-+ if ($#tags == 0 && ($location =~ m/#/)) {
-+ $location = $repos{$tags[0]};
-+ $localtlpdb->option("location", $location);
-+ $localtlpdb->save;
-+ %repos = repository_to_array($location);
-+ }
-+ # check if we are only one tag/repo
-+ if ($#tags == 0) {
-+ # go to normal mode
-+ _init_tlmedia();
-+ return;
-+ }
-+ # we are still here, so we have more tags
-+
-+ # check that there is a main repository
-+ if (!TeXLive::TLUtils::member('main', @tags)) {
-+ tldie("Cannot find main repository, you have to tag one as main!\n");
-+ }
-+
-+ # TODO TODO
-+ # - abstract the set up of a single media tlpdb
-+ # - make clear how to check for a already loaded remotetlpdb
-+ $remotetlpdb = TeXLive::TLPDB->new();
-+ $remotetlpdb->make_virtual;
-+
-+ my $locstr = $repos{'main'};
-+ my $tlmdb = setup_one_remotetlpdb($locstr);
-+ $remotetlpdb->virtual_add_tlpdb($tlmdb, "main");
-+ for my $t (@tags) {
-+ if ($t ne 'main') {
-+ my $tlmdb = setup_one_remotetlpdb($repos{$t});
-+ $remotetlpdb->virtual_add_tlpdb($tlmdb, $t);
-+ $locstr .= " $repos{$t}";
-+ }
-+ }
-+
-+ # now check/setup pinning
-+ # TODO for now no default pinning file!
-+ if ($opts{"pin-file"}) {
-+ my @pins = read_pinning_file($opts{"pin-file"});
-+ if (@pins) {
-+ $remotetlpdb->virtual_pinning(@pins);
-+ }
-+ } else {
-+ # check for pinning file in TEXMFLOCAL/tlpkg/pinning.txt
-+ chomp (my $TEXMFLOCAL = `kpsewhich -var-value=TEXMFLOCAL`);
-+ debug("trying to load pinning file $TEXMFLOCAL/tlpkg/pinning.txt\n");
-+ if (-r "$TEXMFLOCAL/tlpkg/pinning.txt") {
-+ my @pins = read_pinning_file("$TEXMFLOCAL/tlpkg/pinning.txt");
-+ if (@pins) {
-+ info("tlmgr: using pinning file $TEXMFLOCAL/tlpkg/pinning.txt\n");
-+ $remotetlpdb->virtual_pinning(@pins);
-+ }
-+ }
-+ }
-+
-+
-+ # this "location-url" line should not be changed since GUI programs
-+ # depend on it:
-+ print "location-url\t$locstr\n" if $::machinereadable;
-+ info("tlmgr: package repository:\n");
-+ info("\tmain = " . $repos{'main'} . "\n");
-+ for my $t (@tags) {
-+ if ($t ne 'main') {
-+ info("\t$t = " . $repos{$t} . "\n");
-+ }
-+ }
-+}
-+
-+
-+
-+
-+sub _init_tlmedia
-+{
- if (defined($remotetlpdb) && ($remotetlpdb->root eq $location)) {
- # nothing to be done
- return;
-@@ -4614,10 +5061,28 @@
- $location =~ s,^$TeXLiveServerURL,$mirrorbase,;
- }
-
-+ $remotetlpdb = setup_one_remotetlpdb($location);
- # 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");
-+}
-+
-+sub setup_one_remotetlpdb
-+{
-+ my $location = shift;
-+ my $remotetlpdb;
-+
-+ # TODO
-+ # check if that is already loaded!!!
-+
-+ # choose a mirror if we are asked.
-+ if ($location =~ m/^ctan$/i) {
-+ $location = give_ctan_mirror();
-+ } elsif ($location =~ m,^$TeXLiveServerURL,) {
-+ my $mirrorbase = TeXLive::TLUtils::give_ctan_mirror_base();
-+ $location =~ s,^$TeXLiveServerURL,$mirrorbase,;
-+ }
-
- # 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
-@@ -4763,8 +5228,30 @@
- close($tlfh);
- }
- }
-+
-+ return($remotetlpdb);
- }
-
-+sub read_pinning_file {
-+ my $pf = shift;
-+ my @pins;
-+ my $pfh;
-+ if (!open($pfh, "<$pf")) {
-+ tlwarn("Pinning file $pf cannot be read: $!\n");
-+ return;
-+ }
-+ debug("Reading pinning file $pf\n");
-+ while (my $l = TeXLive::TLUtils::get_full_line($pfh)) {
-+ chomp($l);
-+ # comments and empty lines are allowed
-+ next if ($l =~ m/^\s*#/);
-+ next if ($l =~ m/^\s*$/);
-+ my ($a, $b) = split(/:/, $l);
-+ push @pins, $remotetlpdb->make_pin_data_from_line($l);
-+ }
-+ close($pfh);
-+ return @pins;
-+}
-
-
- # finish handles the -pause option (wait for input from stdin),
-@@ -5561,6 +6048,42 @@
-
- =back
-
-+=head2 repositoy
-+
-+=over 4
-+
-+=item B<repository list>
-+
-+=item B<repository add I<path> [I<tag>]>
-+
-+=item B<repository remove I<path|tag>>
-+
-+=item B<repository set I<path>[#I<tag>] [I<path>[#I<tag>] ...]>
-+
-+This action manages the list of repositories. See L</"MULTIPLE REPOSITORIES">
-+below for detailed explanations.
-+
-+The first form list all configured repositories and the respective tags
-+if set. The second form adds a repository (and optionally attaching a
-+tag) to the list of repositories. The third from removes a repository,
-+either by full path/url, or by tag. The last form sets the list
-+of repositories to the items given on the command line, not keeping
-+previous settings. Be reminded that one of the repositories has to
-+be tagged as B<main>, otherwise all operations will fail.
-+
-+=back
-+
-+=head2 candidates
-+
-+=over 4
-+
-+=item B<candidates I<pkg>>
-+
-+Shows the list of available candidates for package I<pkg>. See
-+L</"MULTIPLE REPOSITORIES"> below for details.
-+
-+
-+=back
-
- =head2 option
-
-@@ -6198,6 +6721,118 @@
- GUI and a simplified GUI with only the important and mostly used
- settings.
-
-+=head1 MULTIPLE REPOSITORIES
-+
-+Most packages are distributed via the main TeX Live repository, but
-+sometimes local repositories are used to provide local packages
-+(like commercial fonts, internal styles), as well as alternative
-+package repositories for packages that cannot be included in
-+proper TeX Live due to license or other reasons.
-+
-+Without multiple repository support using these additional repositories
-+needed an extra invocation and temporarily setting the installation
-+source to this additional repository. By setting up all the
-+repositories as sources of packages one does not need to
-+use multiple invocations of tlmgr anymore.
-+
-+B<Warning:> Although support for multiple repositories has been
-+tested extensively, it does not guarantee proper operation. If you
-+want to be sure not to break anything, consider continuing
-+using multiple invocations of tlmgr.
-+
-+When using multiple repositories, one has to be the main repository,
-+which distributes most of the TeX Live packages. If you convert
-+from a single repository installation to a multiple repository
-+installation (by calling tlmgr repository add), the previously
-+set repository will be set as the main repository.
-+
-+By default, even if multiple repositories are configured, packages
-+are B<only> installed from the main repository, as long as
-+packages are not explicitely pinned to a different repository.
-+That also means by simply adding another repository you will
-+B<not> be able to install the packages from there, you first
-+have to specify which packages should be taken from a
-+different repository by specifying some pinning rules.
-+
-+=head2 Pinning
-+
-+Pinning a package is done by editing (adding) a file
-+
-+ TEXMFLOCAL/tlpkg/pinning.txt
-+
-+which contains lines
-+
-+ repo:pkg[,pkg]
-+
-+In this line the C<repo> is either the full URL saved in the
-+list or repositories, or one of the tags given. The C<pkg>
-+are shell style globs for packages.
-+
-+By default everything is pinned to the main repository, so
-+you can imagine that at the end of the file pinning.txt there
-+is a line
-+
-+ main:*
-+
-+If a package C<foo> is pinned to a repository, any package
-+C<foo> in any other repository, even if it has a higher
-+revision number, will not be considered as installable
-+candidate.
-+
-+=head2 Usage example with tlcontrib
-+
-+- check current repository:
-+
-+ $ tlmgr repository list
-+ List of repositories (with tags if set):
-+ /var/www/norbert/tlnet
-+
-+- add tlcontrib repository (and give it a short name)
-+
-+ $ tlmgr repository add http://tlcontrib.metatex.org/2011 tlcontrib
-+
-+- check repositories:
-+
-+ $ tlmgr repository list
-+ List of repositories (with tags if set):
-+ http://tlcontrib.metatex.org/2011 (tlcontrib)
-+ /var/www/norbert/tlnet (main)
-+
-+
-+- add a pinning to get cowfont from tlcontrib:
-+
-+ $ mkdir -p `kpsewhich -var-value TEXMFLOCAL`/tlpkg
-+ $ echo "tlcontrib:cowfont" > `kpsewhich -var-value TEXMFLOCAL`/tlpkg/pinning.txt
-+
-+- check that we can find cowfont:
-+
-+ $ tlmgr show cowfont
-+ tlmgr: using pinning file .../tlpkg/pinning.txt
-+ tlmgr: package repository /var/www/norbert/tlnet http://tlcontrib.metatex.org/2011
-+ package: cowfont
-+ category: Package
-+ ...
-+
-+- install cowfont and context (which is needed!)
-+
-+ $ tlmgr install context cowfont
-+ tlmgr: using pinning file .../tlpkg/pinning.txt
-+ tlmgr: package repository /var/www/norbert/tlnet http://tlcontrib.metatex.org/2011
-+ [1/11, ??:??/??:??] install: context.x86_64-linux @main [84k]
-+ [2/11, 00:00/00:00] install: context @main [4274k]
-+ [3/11, 00:01/00:02] install: cowfont @tlcontrib [655k]
-+ [4/11, 00:05/00:09] install: metapost.x86_64-linux @main [198k]
-+ [5/11, 00:05/00:09] install: metapost @main [72k]
-+ [6/11, 00:05/00:09] install: mptopdf.x86_64-linux @main [1k]
-+ [7/11, 00:06/00:11] install: mptopdf @main [37k]
-+ [8/11, 00:06/00:11] install: stmaryrd @main [163k]
-+ [9/11, 00:07/00:12] install: xetex.x86_64-linux @main [4442k]
-+ [10/11, 00:08/00:08] install: xetex @main [46k]
-+ [11/11, 00:08/00:08] install: xetexconfig @main [13k]
-+ ...
-+
-+In the last part you see that the cowfont is installed from
-+the tlcontrib part (@tlcontrib).
-
- =head1 TAXONOMIES
-
diff --git a/Master/tlpkg/dev/quilt-patches/series b/Master/tlpkg/dev/quilt-patches/series
deleted file mode 100644
index 003ca468a12..00000000000
--- a/Master/tlpkg/dev/quilt-patches/series
+++ /dev/null
@@ -1,2 +0,0 @@
-dev.multi-source-support-v2.patch -p0
-dev.mupdmap-integration