From 9f55eda0e50ee25f2dc228440fbea1cc3183ade3 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 9 May 2011 22:46:38 +0000 Subject: move files from tlpkg/dev/archive to tlpkg/archive please don't keep two archive dirs git-svn-id: svn://tug.org/texlive/trunk@22390 c570f23f-e606-0410-a88d-b1316a301751 --- .../archive/dev.split-desktop-integration.README | 18 + .../archive/dev.split-desktop-integration.patch | 86 +++ Master/tlpkg/archive/dev.usermode-tlmgr.README | 212 ++++++++ Master/tlpkg/archive/dev.usermode-tlmgr.patch | 582 +++++++++++++++++++++ 4 files changed, 898 insertions(+) create mode 100644 Master/tlpkg/archive/dev.split-desktop-integration.README create mode 100644 Master/tlpkg/archive/dev.split-desktop-integration.patch create mode 100644 Master/tlpkg/archive/dev.usermode-tlmgr.README create mode 100644 Master/tlpkg/archive/dev.usermode-tlmgr.patch (limited to 'Master/tlpkg/archive') diff --git a/Master/tlpkg/archive/dev.split-desktop-integration.README b/Master/tlpkg/archive/dev.split-desktop-integration.README new file mode 100644 index 00000000000..ee3c6005306 --- /dev/null +++ b/Master/tlpkg/archive/dev.split-desktop-integration.README @@ -0,0 +1,18 @@ +split-desktop-integration + +I have implemented one additional installer option (and support in tlmgr) +that splits the current + desktop_integration +which currently relates to both shortcuts on the desktop and in the menu +into two options: + desktop_integration + menu_integration +that do one thing. + +Support is written for the installer (text, perltk, wizard), and tlmgr +(changing the settings). + +Karl mentioned that both options should be here, but menu_integration +should *not* be visible for the user at installation time, and should +only be used by $portable. + diff --git a/Master/tlpkg/archive/dev.split-desktop-integration.patch b/Master/tlpkg/archive/dev.split-desktop-integration.patch new file mode 100644 index 00000000000..3020684ffea --- /dev/null +++ b/Master/tlpkg/archive/dev.split-desktop-integration.patch @@ -0,0 +1,86 @@ +Index: install-tl +=================================================================== +--- install-tl (revision 19696) ++++ install-tl (working copy) +@@ -861,15 +861,13 @@ + sub do_tlpdb_postactions { + info ("running package specific postactions\n"); + # Run the post installation code in the postaction tlpsrc entries +- # For now the option_desktop_integrations maps to both desktop +- # and menu entries, but we can split that later + my $usedtlpdb = $vars{'from_dvd'} ? $tlpdb : $localtlpdb; + foreach my $package ($usedtlpdb->list_packages) { + &TeXLive::TLUtils::do_postaction("install", + $usedtlpdb->get_package($package), + $vars{'option_file_assocs'}, ++ $vars{'option_menu_integration'}, + $vars{'option_desktop_integration'}, +- $vars{'option_desktop_integration'}, + $vars{'option_post_code'}); + } + info ("finished with package specific postactions\n"); +@@ -1313,6 +1311,9 @@ + && ($tlpdb->option("paper") eq "letter" ? 1 : 0); + $vars{'option_desktop_integration'} = $tlpdb->option("desktop_integration"); + $vars{'option_desktop_integration'} = 1 if win32(); ++ # we unconditionally set the menu integration, this will be done in all ++ # cases but portable use, where we sanitize it away ++ $vars{'option_menu_integration'} = 1; + $vars{'option_path'} = $tlpdb->option("path"); + $vars{'option_path'} = 0 if !defined($vars{'option_path'}); + $vars{'option_path'} = 1 if win32(); +@@ -1496,6 +1497,7 @@ + $vars{'option_path'} &&= !$vars{'portable'}; + $vars{'option_file_assocs'} &&= !$vars{'portable'}; + $vars{'option_desktop_integration'} &&= !$vars{'portable'}; ++ $vars{'option_menu_integration'} &&= !$vars{'portable'}; + } + + sub prepare_installation { +@@ -1635,6 +1637,7 @@ + $previoustlpdb->option_pkg("00texlive.installation", + "create_formats"); + $vars{'option_desktop_integration'} = 1 if win32(); ++ $vars{'option_menu_integration'} = 1 if win32(); + $vars{'option_path'} = + $previoustlpdb->option_pkg("00texlive.installation", + "path"); +Index: texmf/scripts/texlive/tlmgrgui.pl +=================================================================== +--- texmf/scripts/texlive/tlmgrgui.pl (revision 19696) ++++ texmf/scripts/texlive/tlmgrgui.pl (working copy) +@@ -1098,7 +1098,7 @@ + + if (win32()) { + push @config_set_l, +- $back_config_set->Label(-text => __("Create shortcuts in menu and on desktop"), -anchor => "w"); ++ $back_config_set->Label(-text => __("Create shortcuts on the desktop"), -anchor => "w"); + push @config_set_m, + $back_config_set->Label(-textvariable => \$changeddefaults{"desktop_integration"}{'display'}); + push @config_set_r, +Index: texmf/scripts/texlive/NEWS +=================================================================== +--- texmf/scripts/texlive/NEWS (revision 19696) ++++ texmf/scripts/texlive/NEWS (working copy) +@@ -6,6 +6,8 @@ +
  • set LESS='-R' and unset LESSOPEN and LESSPIPE in the environment + before calling pod2usage. +
  • don't load the remote db if tlmgr update is called without arguments ++
  • menu shortcuts are installed unconditionally, the desktop_integration ++ option only controls shortcuts on the desktop (W32) + + tlmgr rev 19414 (TeX Live 2010 Release Version) + +Index: tlpkg/TeXLive/TLConfig.pm +=================================================================== +--- tlpkg/TeXLive/TLConfig.pm (revision 19696) ++++ tlpkg/TeXLive/TLConfig.pm (working copy) +@@ -140,7 +140,7 @@ + "Create formats on installation" ], + "desktop_integration" => + [ "b", 1, "desktop_integration", +- "Create shortcuts (menu and desktop) in postinst" ], ++ "Create shortcuts on the desktop in postinst" ], + "file_assocs" => + [ "n:0..2", 1, "fileassocs", + "Change file associations in postinst" ], diff --git a/Master/tlpkg/archive/dev.usermode-tlmgr.README b/Master/tlpkg/archive/dev.usermode-tlmgr.README new file mode 100644 index 00000000000..9f1ae445d77 --- /dev/null +++ b/Master/tlpkg/archive/dev.usermode-tlmgr.README @@ -0,0 +1,212 @@ +Using the TeX Live Manager in Usermode +====================================== +(to be discussed and implemented) +(partial implementation working for install and remove is in + tlpkg/dev/dev.usermode-tlmgr.patch) + + +0. Contents +----------- + +0. Contents +1. Rational and definition +2. General layout +3. Description of actions +4. Open questions +5. Changes to the infrastructure + +--------------------------------------------------------------- + +0.1 Implementation notes +------------------------ + +- User has to first call + tlmgr init-usertree [ --usertree .... ] +- available_architectures is set to the empty list, this allows + updating packages depending on .ARCH packages, but I am not sure + if that is a good idea + fixed now, only relocated packages can be installed in usermode +- update, install, remove, paper done +- postinstall action call -sys variant if !$opts{"usermode"} +- most other actions exit 1 with warning if in usermode + +--------------------------------------------------------------- + +1. Rationale and definition +--------------------------- + +The idea behind developing a user mode for the TeX Live Manager is +providing a tool to manage different texmf trees for users without +write permissions to the system TeX Live installation on a multi user +system. + +If a user without write permissions to the main installation +tree is calling tlmgr, or it is called with --user (name to be decided) +command line argument, then tlmgr will work in "usermode" and will behave +as specified here. + +Already supported actions (where no write permissions are needed): + help, version, search, show, list, check, print-arch + +Actions that behave differently in usermode: + install, update, remove, option, paper, generate, backup, restore + uninstall, symlinks + +Actions that are not supported in usermode: + arch + +Actions I am not sure by now + gui + +------------------------------------------------------------ + +2. General layout +----------------- + +In usermode tlmgr manages a different texmf tree. By default it is TEXMFHOME +but can be changed with --user-tree ... (name to be decided) (which implies +automatically --user). The so managed texmf tree TREE contains a new toplevel +directory + TREE/tlpkg +which in turns contains the tlpdb, and the sub directory tlpkg/tlpobj. + +The file + TREE/tlpkg/texlive.tlpdb +contains only the packages that have been installed into the user tree TREE +plus additional options in the virtual package 00texlive.installation +(like with the main installation's texlive.tlpdb). + +Management in user mode is only possible for "relocatable" packages, that are +packages that share the common prefix + $TeXLive::TLConfig::RelocPrefix +which is set to + texmf-dist +That means that only a package where all files are from the texmf-dist tree +can be managed in usermode. + +These packages' containers are created relocatable, that is, the files in +the tar file do not have the "texmf-dist" part included, thus can be +unpacked directly into TEXMFHOME. In the tlpdb this fact is advertised +in a TLPOBJ with the new field + relocated 1 +As an example: + name 12many + category Package + revision ... + relocated 1 + shortdesc ... + ... + docfiles size=98 + RELOC/doc/latex/12many/12many.pdf + RELOC/doc/latex/12many/README + ... + srcfiles size=6 + RELOC/source/latex/12many/12many.dtx + RELOC/source/latex/12many/12many.ins + runfiles size=1 + RELOC/tex/latex/12many/12many.sty + ... + +The normal installation procedure of TeX Live (i.e., currently +TLUtils::install_package) will take care that when unpacking these +relocated containers the missing "texmf-dist" is added. + +----------------------------------------------- + +3. Description of actions +------------------------- + +install: + in usermode the tlmgr action install will check that the package + and all depending packages are either all relocated, or those that + are not relocated are already installed in the system installation. + If this is true it will unpack all containers to be installed into + the user tree (TEXMFHOME or the value of --user-tree) and add the + respective packages to the user texlive.tlpdb (creating it if there + has non be created till now). + + Open question: Should we support installation of dependencies at all + or should install only work on single package in user mode. If only + on single package, what to do with collections and other dependencies? + Maybe the user has to install all packages by hand? + + Currently installing a collection installs all depending packages, + but in contrast to normal mode does not install depending collections. + So in *normal* mode tlmgr install collection-context would install + collection-metapost, c-basic, c-documentation-base, too. In *usermode* + only the packages mentioned in collection-context are installed. + +backup, restore, remove, update: + in usermode the tlmgr action update will check that all packages + to be updated are installed in the user tree, otherwise it behaves + exactely like the system tlmgr. + +option: + only acts upon the user's texlive.tlpdb + +paper: + changes configuration files in user tree + +generate: + creates configuration files in user tree + +uninstall: + will remove all packages from the user's texlive.tlpdb, and then + remove the tlpkg directory in the user tree + +symlinks: + takes the settings from the user's texlive.tlpdb, other then that + it behaves the same way + +gui: + the GUI should be adapted to do (at least): + - if in usermode show all packages with specification whether it is + from user tree or system tree + - show packags that have versions in the user tree and the system tree + - other actions work as described above + +arch: + is simply not supported because it needs access to the binary directories + which are not in the texmf-dist prefix, so no operation is allowed + +----------------------------------------------------------------------- + +4. Open questions +----------------- + +a. Post install actions: + what should be done with post install actions: + - fileassoc -> ignore + - shortcuts -> make them only for the user? + - TLPackageConfigurations (should it go anyway) ? + - post install code scripts: we could pass the "user" argument + so scripts can react on that + +b. Behaviour if system tree has been updated and provides newer packages: + - warn the user + - automatically remove packages in the user tree that are older NO!!! + +c. Currently user mode is only when installing from CD/NET, but not + from svn/DVD. Should this be fixed? + +-------------------------------------------------------------------------- + +5. Changes to the infrastructure (those already known) +-------------------------------- + +- texlive.tlpdb: + entries can now files without any leading texmf tree, but then the + package has to contain the "relocated 1" key/value pair +- TLPOBJ.pm: accept new key "relocated" +- tl-update-container: + . add cmd line option for $opt_relative + . adjust the tlpobj if the container was build relocatable so that + texmf-dist prefix is removed from the files +- TLUtils.pm + install_package(s): check for relocatable and adjust $target by + adding $RelocPrefix +- tlmgr.pl + too many to actually list them + +--------------------------------------------------------------------------- +np, last changed 2009-05-02 diff --git a/Master/tlpkg/archive/dev.usermode-tlmgr.patch b/Master/tlpkg/archive/dev.usermode-tlmgr.patch new file mode 100644 index 00000000000..1ae6bbe98ed --- /dev/null +++ b/Master/tlpkg/archive/dev.usermode-tlmgr.patch @@ -0,0 +1,582 @@ +Index: tlpkg/TeXLive/TLConfig.pm +=================================================================== +--- tlpkg/TeXLive/TLConfig.pm (revision 20263) ++++ tlpkg/TeXLive/TLConfig.pm (working copy) +@@ -173,7 +173,8 @@ + + our %TLPDBSettings = ( + "platform" => [ "s", "Main platform for this computer" ], +- "available_architectures" => [ "l", "All available/installed architectures" ] ++ "available_architectures" => [ "l", "All available/installed architectures" ], ++ "usertree" => [ "b", "This tree acts as user tree" ] + ); + + our $WindowsMainMenuName = "TeX Live $ReleaseYear"; +Index: tlpkg/TeXLive/TLMedia.pm +=================================================================== +--- tlpkg/TeXLive/TLMedia.pm (revision 20263) ++++ tlpkg/TeXLive/TLMedia.pm (working copy) +@@ -59,6 +59,8 @@ + } + if (-d "$location/texmf/web2c") { + $media = 'DVD'; ++ } elsif (-d "$location/web2c") { ++ $media = 'DVD'; + } elsif (-d "$location/$Archive") { + $media = 'CD'; + } else { +@@ -247,8 +249,12 @@ + # if a package is relocatable we have to cancel the reloc prefix + # and unset the relocated setting + # before we save it to the local tlpdb +- if ($tlpobj->relocated) { +- $tlpobj->cancel_reloc_prefix; ++ if ($reloc) { ++ if ($totlpdb->setting("usertree")) { ++ $tlpobj->cancel_reloc_prefix; ++ } else { ++ $tlpobj->replace_reloc_prefix; ++ } + $tlpobj->relocated(0); + } + # we have to write out the tlpobj file since it is contained in the +@@ -321,7 +327,11 @@ + } elsif ($what =~ m,\.tar(\.xz)?$,) { + my $type = defined($1) ? "xz" : "tar"; + +- $target .= "/$TeXLive::TLConfig::RelocTree" if $reloc; ++ if ($reloc) { ++ if (!$totlpdb->setting("usertree")) { ++ $target .= "/$TeXLive::TLConfig::RelocTree" if $reloc; ++ } ++ } + + # this is the case when we install from CD or the NET, or a backup + # +@@ -404,6 +414,7 @@ + my ($self, $pkg, %opts) = @_; + my $localtlpdb = $self->tlpdb; + my $tlp = $localtlpdb->get_package($pkg); ++ my $usertree = $localtlpdb->setting("usertree"); + if (!defined($tlp)) { + tlwarn ("$pkg: package not present, cannot remove\n"); + } else { +@@ -430,9 +441,12 @@ + # in user mode we just remove the prefix, in normal mode we + # replace it with texmf-dist + # since we don't have user mode ++ + if ($tlp->relocated) { + for (@files) { +- s:^$RelocPrefix/:$RelocTree/:; ++ if (!$usertree) { ++ s:^$RelocPrefix/:$RelocTree/:; ++ } + } + } + # +Index: tlpkg/TeXLive/TLPOBJ.pm +=================================================================== +--- tlpkg/TeXLive/TLPOBJ.pm (revision 20263) ++++ tlpkg/TeXLive/TLPOBJ.pm (working copy) +@@ -473,6 +473,21 @@ + sub cancel_reloc_prefix { + my $self = shift; + my @docfiles = $self->docfiles; ++ for (@docfiles) { s:^$RelocPrefix/::; } ++ $self->docfiles(@docfiles); ++ my @runfiles = $self->runfiles; ++ for (@runfiles) { s:^$RelocPrefix/::; } ++ $self->runfiles(@runfiles); ++ my @srcfiles = $self->srcfiles; ++ for (@srcfiles) { s:^$RelocPrefix/::; } ++ $self->srcfiles(@srcfiles); ++ # if there are bin files they have definitely NOT the ++ # texmf-dist prefix, so we cannot cancel it anyway ++} ++ ++sub replace_reloc_prefix { ++ my $self = shift; ++ my @docfiles = $self->docfiles; + for (@docfiles) { s:^$RelocPrefix/:$RelocTree/:; } + $self->docfiles(@docfiles); + my @runfiles = $self->runfiles; +Index: tlpkg/TeXLive/TLUtils.pm +=================================================================== +--- tlpkg/TeXLive/TLUtils.pm (revision 20263) ++++ tlpkg/TeXLive/TLUtils.pm (working copy) +@@ -1279,7 +1279,7 @@ + # if a package is relocatable we have to cancel the reloc prefix + # before we save it to the local tlpdb + if ($tlpobj->relocated) { +- $tlpobj->cancel_reloc_prefix; ++ $tlpobj->replace_reloc_prefix; + } + $totlpdb->add_tlpobj($tlpobj); + # we have to write out the tlpobj file since it is contained in the +Index: texmf/scripts/texlive/tlmgr.pl +=================================================================== +--- texmf/scripts/texlive/tlmgr.pl (revision 20263) ++++ texmf/scripts/texlive/tlmgr.pl (working copy) +@@ -128,6 +128,8 @@ + "persistent-downloads" => "!", + "no-execute-actions" => 1, + "pause" => 1, ++ "usermode" => 1, ++ "usertree" => "=s", + "print-platform|print-arch" => 1, + "version" => 1, + "help|h|?" => 1); +@@ -333,13 +335,30 @@ + pod2usage(-msg => $msg, -exitstatus => 1, -verbose => 1, @noperldoc); + } + ++ # ++ # the main tree we will be working on ++ $::maintree = $Master; ++ if ($opts{"usermode"}) { ++ # we could also try to detect that we don't have write permissions ++ # and switch to user mode automatically ++ if (defined($opts{"usertree"})) { ++ $::maintree = $opts{"usertree"}; ++ } else { ++ chomp($::maintree = `kpsewhich -var-value TEXMFHOME`); ++ } ++ } ++ + # besides doing normal logging if -logfile is specified, we try to log + # package related actions (install, remove, update) to + # the package-log file TEXMFSYSVAR/web2c/tlmgr.log + $packagelogged = 0; # how many msgs we logged + chomp (my $texmfsysvar = `kpsewhich -var-value=TEXMFSYSVAR`); + $packagelogfile = $opts{"package-logfile"}; +- $packagelogfile ||= "$texmfsysvar/web2c/tlmgr.log"; ++ if ($opts{"usermode"}) { ++ $packagelogfile ||= "$::maintree/web2c/tlmgr.log"; ++ } else { ++ $packagelogfile ||= "$texmfsysvar/web2c/tlmgr.log"; ++ } + # + # Try to open the packagelog file, but do NOT die when that does not work + if (!open(PACKAGELOG, ">>$packagelogfile")) { +@@ -510,6 +529,9 @@ + } elsif ($action =~ m/^show$/i) { + action_show(); + finish(0); ++ } elsif ($action =~ m/^init-usertree$/i) { ++ action_init_usertree(); ++ finish(0); + } elsif ($action =~ m/^remove$/i) { + action_remove(); + } elsif ($action =~ /^paper$/) { +@@ -573,6 +595,8 @@ + { + my $errors = 0; + ++ my $sysmode = ($opts{"usermode"} ? "" : "-sys"); ++ + if ($::files_changed) { + $errors += do_cmd_and_check("mktexlsr"); + $::files_changed = 0; +@@ -603,14 +627,14 @@ + } + } + for my $m (keys %do_disable) { +- $errors += do_cmd_and_check("updmap-sys --nomkmap --nohash --disable $m"); ++ $errors += do_cmd_and_check("updmap$sysmode --nomkmap --nohash --disable $m"); + } + for my $m (keys %do_enable) { +- my $str = "updmap-sys --nomkmap --nohash --enable " . ++ my $str = "updmap$sysmode --nomkmap --nohash --enable " . + $::execute_actions{'enable'}{'maps'}{$m} . "=$m"; + $errors += do_cmd_and_check($str); + } +- $errors += do_cmd_and_check("updmap-sys") if $run_full; ++ $errors += do_cmd_and_check("updmap$sysmode") if $run_full; + } + + +@@ -655,7 +679,7 @@ + # first regenerate all formats --byengine + for my $e (keys %updated_engines) { + log ("updating formats based on $e\n"); +- $errors += do_cmd_and_check("fmtutil-sys --no-error-if-no-format --byengine $e"); ++ $errors += do_cmd_and_check("fmtutil$sysmode --no-error-if-no-format --byengine $e"); + } + # now rebuild all other formats + for my $f (keys %do_enable) { +@@ -663,7 +687,7 @@ + # ignore disabled formats + next if !$::execute_actions{'enable'}{'formats'}{$f}{'mode'}; + log ("(re)creating format dump $f\n"); +- $errors += do_cmd_and_check("fmtutil-sys --byfmt $f"); ++ $errors += do_cmd_and_check("fmtutil$sysmode --byfmt $f"); + $done_formats{$f} = 1; + } + } +@@ -704,7 +728,7 @@ + } + if ($localtlpdb->option("create_formats") + && !$::regenerate_all_formats) { +- $errors += do_cmd_and_check("fmtutil-sys --byhyphen $lang"); ++ $errors += do_cmd_and_check("fmtutil$sysmode --byhyphen $lang"); + } + } + } +@@ -713,7 +737,7 @@ + # + if ($::regenerate_all_formats) { + info("Regenerating all formats, this may take some time ..."); +- $errors += do_cmd_and_check("fmtutil-sys --all"); ++ $errors += do_cmd_and_check("fmtutil$sysmode --all"); + info("done\n"); + $::regenerate_all_formats = 0; + } +@@ -881,8 +905,13 @@ + # + sub action_paper { + init_local_db(); +- chomp(my $texmfsysconfig = `kpsewhich -var-value=TEXMFSYSCONFIG`); +- $ENV{"TEXMFCONFIG"} = $texmfsysconfig; ++ my $texmfconfig; ++ if ($opts{"usermode"}) { ++ chomp($texmfconfig = `kpsewhich -var-value=TEXMFCONFIG`); ++ } else { ++ chomp($texmfconfig = `kpsewhich -var-value=TEXMFSYSCONFIG`); ++ } ++ $ENV{"TEXMFCONFIG"} = $texmfconfig; + + my $action = shift @ARGV; + if ($action =~ m/^paper$/i) { # generic paper +@@ -894,7 +923,7 @@ + "as in: tlmgr pdftex paper --list\n"); + + } elsif (!defined($newpaper)) { # tlmgr paper => show all current sizes. +- TeXLive::TLPaper::paper_all($texmfsysconfig,undef); ++ TeXLive::TLPaper::paper_all($texmfconfig,undef); + + } elsif ($newpaper !~ /^(a4|letter)$/) { # tlmgr paper junk => complain. + $newpaper = "the empty string" if !defined($newpaper); +@@ -902,7 +931,7 @@ + + } else { # tlmgr paper {a4|letter} => do it. + return if !check_on_writable(); +- TeXLive::TLPaper::paper_all($texmfsysconfig,$newpaper); ++ TeXLive::TLPaper::paper_all($texmfconfig,$newpaper); + } + + } else { # program-specific paper +@@ -919,7 +948,7 @@ + return if !check_on_writable(); + } + unshift(@ARGV, "--list") if $opts{"list"}; +- TeXLive::TLPaper::do_paper($prog,$texmfsysconfig,@ARGV); ++ TeXLive::TLPaper::do_paper($prog,$texmfconfig,@ARGV); + } + } + +@@ -971,6 +1000,7 @@ + print "longdesc: ", $tlp->longdesc, "\n" if ($tlp->longdesc); + print "installed: ", ($installed ? "Yes" : "No"), "\n"; + print "revision: ", $tlp->revision, "\n" if ($installed); ++ print "relocatable: ", ($tlp->relocated ? "Yes" : "No"), "\n"; + print "cat-version: ", $tlp->cataloguedata->{'version'}, "\n" + if $tlp->cataloguedata->{'version'}; + print "cat-date: ", $tlp->cataloguedata->{'date'}, "\n" +@@ -1071,6 +1101,10 @@ + # PATH + # + sub action_path { ++ if ($opts{"usermode"}) { ++ tlwarn("action `path' not supported in usermode!\n"); ++ exit 1; ++ } + my $what = shift @ARGV; + if (!defined($what) || ($what !~ m/^(add|remove)$/i)) { + tlwarn("tlmgr: action path needs one argument, either add or remove\n"); +@@ -2078,7 +2112,10 @@ + + # check for updates to tlmgr and die unless either --force or --list or --self + # is given +- my @critical = check_for_critical_updates($localtlpdb, $tlmediatlpdb); ++ my @critical; ++ if (!$opts{"usermode"}) { ++ @critical = check_for_critical_updates($localtlpdb, $tlmediatlpdb); ++ } + my $dry_run_cont = $opts{"dry-run"} && ($opts{"dry-run"} < 0); + if ( !$dry_run_cont && !$opts{"self"} && @critical) { + critical_updates_warning(); +@@ -2939,16 +2976,18 @@ + init_tlmedia(); + + # check for updates to tlmgr itself, and die unless --force is given +- if (check_for_critical_updates( $localtlpdb, $tlmediatlpdb)) { +- critical_updates_warning(); +- if ($opts{"force"}) { +- tlwarn("Continuing due to --force\n"); +- } else { +- if ($::gui_mode) { +- # return here and don't do any updates +- return; ++ if (!$opts{"usermode"}) { ++ if (check_for_critical_updates( $localtlpdb, $tlmediatlpdb)) { ++ critical_updates_warning(); ++ if ($opts{"force"}) { ++ tlwarn("Continuing due to --force\n"); + } else { +- die "tlmgr: Not continuing, please see warning above!\n"; ++ if ($::gui_mode) { ++ # return here and don't do any updates ++ return; ++ } else { ++ die "tlmgr: Not continuing, please see warning above!\n"; ++ } + } + } + } +@@ -2961,7 +3000,7 @@ + @packs = $tlmediatlpdb->expand_dependencies("-only-arch", $localtlpdb, @ARGV) unless $opts{"no-depends-at-all"}; + # now expand all others unless $opts{"no-depends"} + # if $opts{"reinstall"} do not collection->collection dependencies +- if ($opts{"reinstall"}) { ++ if ($opts{"reinstall"} || $opts{"usermode"}) { + @packs = $tlmediatlpdb->expand_dependencies("-no-collections", $localtlpdb, @packs) unless $opts{"no-depends"}; + } else { + @packs = $tlmediatlpdb->expand_dependencies($localtlpdb, @packs) unless $opts{"no-depends"}; +@@ -3029,6 +3068,15 @@ + foreach my $pkg (@todo) { + my $flag = $FLAG_INSTALL; + my $re = ""; ++ my $tlp = $tlmediasrc->tlpdb->get_package($pkg); ++ if (!defined($tlp)) { ++ info("Unknown package $pkg\n"); ++ next; ++ } ++ if (!$tlp->relocated && $opts{"usermode"}) { ++ info("Package $pkg is not relocatable, cannot install it in user mode!\n"); ++ next; ++ } + if (defined($localtlpdb->get_package($pkg))) { + if ($opts{"reinstall"}) { + $re = "re"; +@@ -3248,11 +3296,11 @@ + # now also save the TLPOBJ of 00texlive.installation + my $tlpo = $localtlpdb->get_package("00texlive.installation"); + if ($tlpo) { +- if (open(TOFD, ">$Master/tlpkg/tlpobj/00texlive.installation.tlpobj")) { ++ if (open(TOFD, ">$::maintree/tlpkg/tlpobj/00texlive.installation.tlpobj")) { + $tlpo->writeout(\*TOFD); + close(TOFD); + } else { +- tlwarn("Cannot save 00texlive.installation to $Master/tlpkg/tlpobj/00texlive.installation.tlpobj\n"); ++ tlwarn("Cannot save 00texlive.installation to $::maintree/tlpkg/tlpobj/00texlive.installation.tlpobj\n"); + } + } + } else { +@@ -3285,6 +3333,10 @@ + warn("action `platform' not supported on Windows\n"); + return(); + } ++ if ($opts{"usermode"}) { ++ tlwarn("action `platform' not supported in usermode\n"); ++ exit 1; ++ } + my $what = shift @ARGV; + init_local_db(1); + info("platform: dry run, no changes will be made\n") if $opts{"dry-run"}; +@@ -3421,6 +3473,10 @@ + # GENERATE + # + sub action_generate { ++ if ($opts{"usermode"}) { ++ tlwarn("action `generate' not supported in usermode!\n"); ++ exit 1; ++ } + my $what = shift @ARGV; + init_local_db(); + +@@ -4284,6 +4340,35 @@ + } + } + ++# INIT USER TREE ++# sets up the user tree for tlmgr in user mode ++sub action_init_usertree { ++ init_local_db(); ++ my $tlpdb = TeXLive::TLPDB->new; ++ my $usertree; ++ if ($opts{"usertree"}) { ++ $usertree = $opts{"usertree"}; ++ } else { ++ chomp($usertree = `kpsewhich -var-value TEXMFHOME`); ++ } ++ $tlpdb->root($usertree); ++ my $inst = TeXLive::TLPOBJ->new; ++ $inst->name("00texlive.installation"); ++ $inst->category("TLCore"); ++ my @deps; ++ push @deps, "opt_location:$location"; ++ push @deps, "setting_available_architectures:"; ++ push @deps, "setting_usertree:1"; ++ $inst->depends(@deps); ++ $tlpdb->add_tlpobj($inst); ++ $tlpdb->save; ++ # ++ # we need to create web2c dir for TLMedia to succeed setting up ++ # and for tlmgr.log file ++ mkdir ("$usertree/web2c"); ++ mkdir ("$usertree/tlpkg/tlpobj"); ++} ++ + # CONF + # tries to mimic texconfig conf but can also set values for both tlmgr + # and texmf conf files. +@@ -4408,10 +4493,10 @@ + # stuff changed via the GUI + return if defined $localtlmedia; + return if defined $localtlpdb; +- $localtlmedia = TeXLive::TLMedia->new ( $Master ); +- die("cannot setup TLMedia in $Master") unless (defined($localtlmedia)); ++ $localtlmedia = TeXLive::TLMedia->new ( $::maintree ); ++ die("cannot setup TLMedia in $::maintree") unless (defined($localtlmedia)); + $localtlpdb = $localtlmedia->tlpdb; +- die("cannot find tlpdb in $Master") unless (defined($localtlpdb)); ++ die("cannot find tlpdb in $::maintree") unless (defined($localtlpdb)); + # setup the programs, for w32 we need the shipped wget/xz etc, so we + # pass the location of these files to setup_programs. + if (!setup_programs("$Master/tlpkg/installer", $localtlmedia->platform)) { +@@ -4845,6 +4930,7 @@ + } + + sub check_on_writable { ++ return 1 if $opts{"usermode"}; + if (!TeXLive::TLUtils::dir_writable("$Master/tlpkg")) { + tlwarn("You don't have permission to change the installation in any way,\n"); + tlwarn("specifically, the directory $Master/tlpkg/ is not writable.\n"); +@@ -5017,6 +5103,15 @@ + likely untranslated, messages to standard error. Helpful for + translators to see what remains to be done. + ++=item B<--usermode> ++ ++Activates the user mode, see L below. ++ ++=item B<--usertree> I ++ ++Uses I as user tree in user mode, seel L below. ++ ++ + =back + + The standard options for TeX Live programs are also accepted: +@@ -5923,7 +6018,110 @@ + C, you need to run C yourself + after making any local changes. + ++ ++=head2 init-usertree + ++sets up the default user tree (C) or the one specified ++on the command line using C<--usertree> for user mode management. ++See L below. ++ ++ ++=head1 USER MODE ++ ++B B B ++This is very much work in progress ++and experimental. Expect breakage, and the need to reinstall your ++user tree a new. ++ ++C provides a restricted way to manage arbitrary texmf trees ++in the same way as the installation. This allows a user without write ++permissions to the installation location to update/install packages ++into a user tree. ++ ++C is set into user mode by giving the command line option ++C<--usermode>. It will not switch automatically, nor does it support ++a config file by now. Thus, this option has to be given every time. ++ ++This mode of C works on a user tree, which by default will be ++the value of C, but can be overridden with the command line ++option C<--usertree>. In the following when we speak of the user tree ++we mean either C or the one given on the command line. ++ ++Not all actions are allowed in user mode, C will warn you and ++not carry out this action. The actions of C can be classified into ++those that don't need write permissions and thus are working the same ++in user mode or normal mode. Currently these are ++B, B, B, B, B, B, B. ++ ++Most of the actions dealing with package management on the other hand ++need write permissions, and behave differently: ++B, B, B, B