diff options
author | Norbert Preining <preining@logic.at> | 2008-10-01 12:53:30 +0000 |
---|---|---|
committer | Norbert Preining <preining@logic.at> | 2008-10-01 12:53:30 +0000 |
commit | 28f1b881f295670cc5c2bdd0c5c02811fef3e24b (patch) | |
tree | ac10fcc694d8cd5668c753cf3857bfae317981ee /Master/tlpkg/etc | |
parent | 08fbe19d08b2cb1150bce29028e02ae51d79b55b (diff) |
add a patch that implements the logic I have described in my email.
Just in case my hard disk crashes just now ...
git-svn-id: svn://tug.org/texlive/trunk@10810 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/tlpkg/etc')
-rw-r--r-- | Master/tlpkg/etc/rework-tlmgr-install-logic.patch | 519 |
1 files changed, 519 insertions, 0 deletions
diff --git a/Master/tlpkg/etc/rework-tlmgr-install-logic.patch b/Master/tlpkg/etc/rework-tlmgr-install-logic.patch new file mode 100644 index 00000000000..5702e304bd2 --- /dev/null +++ b/Master/tlpkg/etc/rework-tlmgr-install-logic.patch @@ -0,0 +1,519 @@ +Index: tlpkg/TeXLive/TLPDB.pm +=================================================================== +--- tlpkg/TeXLive/TLPDB.pm (revision 10798) ++++ tlpkg/TeXLive/TLPDB.pm (working copy) +@@ -33,6 +33,8 @@ + $tlpdb->remove_package($pkg); + $tlpdb->get_package("packagename"); + $tlpdb->list_packages; ++ $tlpdb->expand_dependencies(["-only-arch",] $totlpdb, @list); ++ $tlpdb->expand_dependencies(["-no-collections",] $totlpdb, @list); + $tlpdb->find_file("filename"); + $tlpdb->collections; + $tlpdb->schemes; +@@ -446,6 +448,93 @@ + + =pod + ++=item C<< $tlpdb->expand_dependencies >> ++ ++This function takes as first argument the target TLPDB and then a list of ++packages and returns the closure of this ++list with respect to the depends operator. (Sorry, that was for ++mathematicians) ++ ++If the very first argument is "-only-arch" then it expands only dependencies ++of the form .ARCH. ++ ++=cut ++ ++sub expand_dependencies { ++ my $self = shift; ++ my $only_arch = 0; ++ my $no_collections = 0; ++ my $first = shift; ++ my $totlpdb; ++ if ($first eq "-only-arch") { ++ $only_arch = 1; ++ $totlpdb = shift; ++ } elsif ($first eq "-no-collections") { ++ $no_collections = 1; ++ $totlpdb = shift; ++ } else { ++ $totlpdb = $first; ++ } ++ my %install = (); ++ my @archs = $totlpdb->available_architectures; ++ for my $p (@_) { ++ $install{$p} = 1; ++ } ++ my $changed = 1; ++ while ($changed) { ++ $changed = 0; ++ my @pre_select = keys %install; ++ ddebug("pre_select = @pre_select\n"); ++ for my $p (@pre_select) { ++ next if ($p =~ m/^00texlive/); ++ my $pkg = $self->get_package($p); ++ if (!defined($pkg)) { ++ tlwarn("W: $p is mentioned somewhere but not available, disabling it!\n"); ++ $install{$p} = 0; ++ next; ++ } ++ for my $p_dep ($pkg->depends) { ++ ddebug("checking $p_dep in $p\n"); ++ my $tlpdd = $self->get_package($p_dep); ++ if (defined($tlpdd)) { ++ if ($tlpdd->category =~ m/$MetaCategoriesRegexp/) { ++ # we are taking a look at a dependency which is a collection ++ # or scheme, and if the option "-no-collections" is given ++ # we skip that one ++ ddebug("expand_deps: skipping $p_dep in $p due to -no-collections\n"); ++ next if $no_collections; ++ } ++ } ++ if ($p_dep =~ m/^(.*)\.ARCH$/) { ++ my $foo = "$1"; ++ foreach $a (@archs) { ++ $install{"$foo.$a"} = 1 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; ++ } ++ } else { ++ $install{$p_dep} = 1 unless $only_arch; ++ } ++ } ++ } ++ ++ # check for newly selected packages ++ my @post_select = keys %install; ++ ddebug("post_select = @post_select\n"); ++ ddebug("nr pre select $#pre_select, nr post select $#post_select\n"); ++ if ($#pre_select != $#post_select) { ++ $changed = 1; ++ } ++ } ++ return(keys %install); ++} ++ ++=pod ++ + =item C<< $tlpdb->find_file("filename") >> + + The C<find_file> returns a list of packages:filename +Index: tlpkg/TeXLive/TLMedia.pm +=================================================================== +--- tlpkg/TeXLive/TLMedia.pm (revision 10798) ++++ tlpkg/TeXLive/TLMedia.pm (working copy) +@@ -89,14 +89,14 @@ + # returns a scalar (0) on error + # returns a reference to a hash with actions on success + sub install_package { +- my ($self, $pkg, $totlpdb, $nodepends, $nopostinstall, $fallbackmedia) = @_; ++ my ($self, $pkg, $totlpdb, $nopostinstall, $fallbackmedia) = @_; + my $fromtlpdb = $self->tlpdb; + my $ret; + die("TLMedia 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, $nodepends, $nopostinstall)) { ++ if ($ret = $fallbackmedia->install_package($pkg,$totlpdb, $nopostinstall)) { + debug("installed $pkg from fallback"); + return $ret; + } else { +@@ -204,37 +204,6 @@ + # compute the return value + my %ret; + merge_into(\%ret, $tlpobj->make_return_hash_from_executes("enable")); +- # now install all the depends if they are not already present +- # NOTE: installation of .ARCH dependencies is done in *ANY*CASE*, regardless +- # of the $nodepends setting +- foreach my $d ($tlpobj->depends) { +- if ($d =~ m/^(.*)\.ARCH$/) { +- # we only want to try to install a .ARCH package if it actually contains +- # files +- my $foo = $1; +- foreach my $a ($totlpdb->available_architectures) { +- if (defined($fromtlpdb->get_package("$foo.$a")) && +- !defined($totlpdb->get_package("$foo.$a"))) { +- merge_into(\%ret, +- $self->install_package("$foo.$a", $totlpdb, $nodepends, $fallbackmedia, 0)); +- } +- } +- } elsif ($d =~ m/^(.*).win32$/) { +- # install only of win32 is under the available archs +- if (TeXLive::TLUtils::member("win32",$totlpdb->available_architectures)) { +- merge_into(\%ret, +- $self->install_package($d, $totlpdb, $nodepends, $nopostinstall, $fallbackmedia)); +- } +- } else { +- if (!$nodepends) { +- if (!defined($totlpdb->get_package($d))) { +- # we have to install it! +- merge_into(\%ret, +- $self->install_package($d, $totlpdb, $nodepends, $nopostinstall, $fallbackmedia)); +- } +- } +- } +- } + if (!$nopostinstall) { + # do the postinstallation actions + if (defined($PostInstall{$pkg})) { +Index: texmf/scripts/texlive/tlmgr.pl +=================================================================== +--- texmf/scripts/texlive/tlmgr.pl (revision 10809) ++++ texmf/scripts/texlive/tlmgr.pl (working copy) +@@ -32,6 +32,74 @@ + # - move the remove_package function into TLPDB.pm, so that the remove_package + # from TLPDB actually removes the files, too. Maybe some better names + # are necessary. ++# ++# ++# Some documentation I need to remember myself: ++# TLMedia->install_package does ONLY INSTALL ONE PACKAGE, no deps whatsoever ++# anymore!!!! That has all to be done by hand. ++# ++# INSTALL ++# ++# tlmgr install foo bar baz ++# will create the closure under dependencies of {foo,bar,baz}, i.e. all ++# dependencies recursively down to the last package, and install all ++# the packages that are necessary ++# ++# tlmgr install --no-depends foo bar baz ++# will *only* install these three packages (if they are not already installed ++# but it will STILL INSTALL foo.ARCH if they are necessary!! ++# ++# tlmgr install --really-no-depends foo bar baz ++# will absolutely only install these three packages, and will not even ++# take .ARCH deps into account ++# ++# tlmgr install --reinstall ... ++# behaves exactely like without --reinstall BUT the following two ++# differences: ++# . dependencies are not expanded from collection to collection, so ++# if you reinstall a collection then all its dependencies of type ++# Package will be reinstalled, too, but not the dependencies on ++# other collection, because that would force the full reinstallation ++# of the whole installation ++# . it does not care for whether a package seems to be installed or ++# not (that is the --reinstall) ++# ++# REMOVE ++# ++# tlmgr remove foo bar baz ++# will remove the packages foo bar baz itself ++# and will remove all .ARCH dependencies, too ++# and if some of them are collections it will also remove the ++# depending packs which are NOT Collections|Schemes!!! ++# if some of them are referenced somewhere they will not be removed ++# unless --force given ++# ++# tlmgr remove --no-depends foo bar baz ++# will remove the packages foo bar baz itself without any dependencies ++# but it will still remove all .ARCH dependency ++# if some of them are referenced somewhere they will not be removed ++# unless --force given ++# ++# tlmgr remove --really-no-depends foo bar baz ++# willabsolutely only install foo bar baz not even taking .ARCH into ++# account ++# ++# UPDATE ++# ++# tlmgr update foo ++# if foo is of type Package|Documentation it will update only foo ++# and the respective .ARCH dependencies ++# if foo is of type Collection|Scheme it will update itself AND ++# will check all depending packs of type NOT(COllection|Scheme) ++# for necessary updates ++# ++# tlmgr update --no-depends foo ++# as above, but will not check for depends of Collections/Schemes ++# but it will still update .ARCH deps ++# ++# tlmgr update --really-no-depends foo ++# will absolutely only update foo not even taking .ARCH into account ++# + + my $svnrev = '$Revision$'; + my $tlmgrrevision; +@@ -293,18 +361,6 @@ + $localtlpdb->remove_package($pkg); + merge_into(\%ret, $tlp->make_return_hash_from_executes("disable")); + $ret{'mktexlsr'} = 1; +- # remove those bin dependencies .ARCH +- foreach my $d ($tlp->depends) { +- if ($d eq "$pkg.ARCH") { +- foreach my $a ($localtlpdb->available_architectures) { +- if (defined($localtlpdb->get_package("$pkg.$a"))) { +- debug ("remove $pkg.$a\n"); +- merge_into(\%ret, +- &remove_package("$pkg.$a", $localtlpdb, $force)); +- } +- } +- } +- } + # should we save at each removal??? + # advantage: the tlpdb actually reflects what is installed + # disadvantage: removing a collection calls the save routine several times +@@ -319,6 +375,26 @@ + return \%ret; + } + ++# REMOVE ++# ++# tlmgr remove foo bar baz ++# will remove the packages foo bar baz itself ++# and will remove all .ARCH dependencies, too ++# and if some of them are collections it will also remove the ++# depending packs which are NOT Collections|Schemes!!! ++# if some of them are referenced somewhere they will not be removed ++# unless --force given ++# ++# tlmgr remove --no-depends foo bar baz ++# will remove the packages foo bar baz itself without any dependencies ++# but it will still remove all .ARCH dependency ++# if some of them are referenced somewhere they will not be removed ++# unless --force given ++# ++# tlmgr remove --really-no-depends foo bar baz ++# willabsolutely only install foo bar baz not even taking .ARCH into ++# account ++# + sub action_remove { + if ($opt_gui) { + action_gui("remove"); +@@ -340,16 +416,24 @@ + # + my %ret; + my $opt_nodepends = 0; ++ my $opt_reallynodepends = 0; + my $opt_force = 0; + my $opt_dry = 0; + Getopt::Long::Configure(qw(no_pass_through)); + GetOptions("no-depends" => \$opt_nodepends, ++ "really-no-depends" => \$opt_reallynodepends, + "force" => \$opt_force, + "dry-run" => \$opt_dry) or pod2usage(2); ++ $opt_nodepends = 1 if $opt_reallynodepends; + my %already_removed; + my @more_removal; + init_local_db(); +- foreach my $pkg (@ARGV) { ++ my @packs = @ARGV; ++ # remove all .ARCH dependencies, too, unless $opt_reallynodepends ++ @packs = $localtlpdb->expand_dependencies("-only-arch", $localtlpdb, @packs) unless $opt_reallynodepends; ++ # remove deps unless $opt_nodepends ++ @packs = $localtlpdb->expand_dependencies("-no-collections", $localtlpdb, @packs) unless $opt_nodepends; ++ foreach my $pkg (sort @packs) { + my $tlp = $localtlpdb->get_package($pkg); + next if defined($already_removed{$pkg}); + if (!defined($tlp)) { +@@ -376,20 +460,6 @@ + # remove dependencies, too + merge_into(\%ret, \%foo); + $already_removed{$pkg} = 1; +- if (!$opt_nodepends) { +- foreach my $d ($tlp->depends) { +- my $tlpdd = $localtlpdb->get_package($d); +- if (defined($tlpdd)) { +- if ($tlpdd->category !~ m/$MetaCategoriesRegexp/) { +- info ("remove $d\n"); +- if (!$opt_dry) { +- merge_into(\%ret, &remove_package($d, $localtlpdb, $opt_force)); +- } +- $already_removed{$d} = 1; +- } +- } +- } +- } + } + } else { + # save all the other packages into the @more_removal list to +@@ -400,7 +470,7 @@ + } + } + } +- foreach my $pkg (@more_removal) { ++ foreach my $pkg (sort @more_removal) { + if (!defined($already_removed{$pkg})) { + info ("remove $pkg\n"); + if (!$opt_dry) { +@@ -625,6 +695,22 @@ + } + + ++# UPDATE ++# ++# tlmgr update foo ++# if foo is of type Package|Documentation it will update only foo ++# and the respective .ARCH dependencies ++# if foo is of type Collection|Scheme it will update itself AND ++# will check all depending packs of type NOT(COllection|Scheme) ++# for necessary updates ++# ++# tlmgr update --no-depends foo ++# as above, but will not check for depends of Collections/Schemes ++# but it will still update .ARCH deps ++# ++# tlmgr update --really-no-depends foo ++# will absolutely only update foo not even taking .ARCH into account ++# + sub action_update { + if ($opt_gui) { + action_gui("update"); +@@ -632,6 +718,7 @@ + init_local_db(1); + # initialize the TLMedia from $location + my $opt_nodepends = 0; ++ my $opt_reallynodepends = 0; + my $opt_dry = 0; + my $opt_all = 0; + my $opt_list = 0; +@@ -639,11 +726,13 @@ + my $opt_backupdir; + Getopt::Long::Configure(qw(no_pass_through)); + GetOptions("no-depends" => \$opt_nodepends, ++ "really-no-depends" => \$opt_reallynodepends, + "all" => \$opt_all, + "list" => \$opt_list, + "no-remove" => \$opt_noremove, + "backupdir=s" => \$opt_backupdir, + "dry-run" => \$opt_dry) or pod2usage(2); ++ $opt_nodepends = 1 if $opt_reallynodepends; + my %ret; + init_tlmedia(); + my $mediatlpdb = $tlmediasrc->tlpdb; +@@ -721,7 +810,11 @@ + } + my $updater_started = 0; + my $nrupdated = 0; +- foreach my $pkg (@todo) { ++ # update all .ARCH dependencies, too, unless $opt_reallynodepends ++ @todo = $mediatlpdb->expand_dependencies("-only-arch", $localtlpdb, @todo) unless $opt_reallynodepends; ++ # update deps unless $opt_nodepends ++ @todo = $mediatlpdb->expand_dependencies("-no-collections", $localtlpdb, @todo) unless $opt_nodepends; ++ foreach my $pkg (sort @todo) { + next if ($pkg =~ m/^00texlive/); + my $tlp = $localtlpdb->get_package($pkg); + if (!defined($tlp)) { +@@ -832,7 +925,7 @@ + # the remove_package should also remove empty dirs in case + # a dir is changed into a file + merge_into(\%ret, &remove_package($pkg, $localtlpdb, 1)); +- my $foo = $tlmediasrc->install_package($pkg, $localtlpdb, $opt_nodepends, 0); ++ my $foo = $tlmediasrc->install_package($pkg, $localtlpdb); + if (ref $foo) { + # installation succeeded because we got a reference + merge_into (\%ret, $foo); +@@ -914,6 +1007,32 @@ + return(\%ret); + } + ++# INSTALL ++# ++# tlmgr install foo bar baz ++# will create the closure under dependencies of {foo,bar,baz}, i.e. all ++# dependencies recursively down to the last package, and install all ++# the packages that are necessary ++# ++# tlmgr install --no-depends foo bar baz ++# will *only* install these three packages (if they are not already installed ++# but it will STILL INSTALL foo.ARCH if they are necessary!! ++# ++# tlmgr install --really-no-depends foo bar baz ++# will absolutely only install these three packages, and will not even ++# take .ARCH deps into account ++# ++# tlmgr install --reinstall ... ++# behaves exactely like without --reinstall BUT the following two ++# differences: ++# . dependencies are not expanded from collection to collection, so ++# if you reinstall a collection then all its dependencies of type ++# Package will be reinstalled, too, but not the dependencies on ++# other collection, because that would force the full reinstallation ++# of the whole installation ++# . it does not care for whether a package seems to be installed or ++# not (that is the --reinstall) ++# + sub action_install { + if ($opt_gui) { + action_gui("install"); +@@ -921,19 +1040,41 @@ + init_local_db(1); + # initialize the TLMedia from $location + my $opt_nodepends = 0; ++ my $opt_reallynodepends = 0; + my $opt_dry = 0; ++ my $opt_reinstall = 0; + Getopt::Long::Configure(qw(no_pass_through)); + GetOptions("no-depends" => \$opt_nodepends, ++ "really-no-depends" => \$opt_reallynodepends, ++ "reinstall" => \$opt_reinstall, + "dry-run" => \$opt_dry) or pod2usage(2); + my %ret; + init_tlmedia(); +- foreach my $pkg (@ARGV) { +- if ($opt_dry) { +- print "install: $pkg\n"; +- } else { +- # install the packages and run postinstall actions (that is the 0) ++ my $tlmediatlpdb = $tlmediasrc->tlpdb; ++ $opt_nodepends = 1 if $opt_reallynodepends; ++ my @packs = @ARGV; ++ # first expand the .ARCH dependencies unless $opt_reallynodepends ++ @packs = $tlmediatlpdb->expand_dependencies("-only-arch", $localtlpdb, @ARGV) unless $opt_reallynodepends; ++ # now expand all others unless $opt_nodepends ++ # if $opt_reinstall do not collection->collection dependencies ++ if ($opt_reinstall) { ++ @packs = $tlmediatlpdb->expand_dependencies("-no-collections", $localtlpdb, @packs) unless $opt_nodepends; ++ } else { ++ @packs = $tlmediatlpdb->expand_dependencies($localtlpdb, @packs) unless $opt_nodepends; ++ } ++ foreach my $pkg (sort @packs) { ++ if (defined($localtlpdb->get_package($pkg))) { ++ if ($opt_reinstall) { ++ info("re-"); ++ } else { ++ debug("already installed: $pkg\n"); ++ next; ++ } ++ } ++ info("install: $pkg\n"); ++ if (!$opt_dry) { + info("install: $pkg\n"); +- merge_into(\%ret, $tlmediasrc->install_package($pkg, $localtlpdb, $opt_nodepends, 0)); ++ merge_into(\%ret, $tlmediasrc->install_package($pkg, $localtlpdb)); + } + } + if ($opt_dry) { +@@ -1097,7 +1238,7 @@ + print "Installing $pkg.$a\n"; + } else { + info("install: $pkg.$a\n"); +- merge_into(\%ret, $tlmediasrc->install_package("$pkg.$a", $localtlpdb, 0, 0)); ++ merge_into(\%ret, $tlmediasrc->install_package("$pkg.$a", $localtlpdb)); + } + } + } +@@ -1106,11 +1247,11 @@ + if (TeXLive::TLUtils::member('win32', @todoarchs)) { + # install the necessary win32 stuff + info("install: bin-tlperl.win32\n"); +- merge_into (\%ret, $tlmediasrc->install_package("bin-tlperl.win32", $localtlpdb, 1, 0)); ++ merge_into (\%ret, $tlmediasrc->install_package("bin-tlperl.win32", $localtlpdb)); + info("install: bin-tlgs.win32\n"); +- merge_into (\%ret, $tlmediasrc->install_package("bin-tlgs.win32", $localtlpdb, 1, 0)); ++ merge_into (\%ret, $tlmediasrc->install_package("bin-tlgs.win32", $localtlpdb)); + info("install: bin-tlpsv.win32\n"); +- merge_into (\%ret, $tlmediasrc->install_package("bin-tlpsv.win32", $localtlpdb, 1, 0)); ++ merge_into (\%ret, $tlmediasrc->install_package("bin-tlpsv.win32", $localtlpdb)); + } + # update the option_archs list of installed archs + my @larchs = $localtlpdb->option_available_architectures; |