summaryrefslogtreecommitdiff
path: root/Master/tlpkg/archive
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2011-05-09 22:46:38 +0000
committerNorbert Preining <preining@logic.at>2011-05-09 22:46:38 +0000
commit9f55eda0e50ee25f2dc228440fbea1cc3183ade3 (patch)
tree1c2661d4d6653970c95de94f7a9f043e6793a774 /Master/tlpkg/archive
parent5299a5975ba12e66b32ab39a3b9c206a144d75fb (diff)
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
Diffstat (limited to 'Master/tlpkg/archive')
-rw-r--r--Master/tlpkg/archive/dev.split-desktop-integration.README18
-rw-r--r--Master/tlpkg/archive/dev.split-desktop-integration.patch86
-rw-r--r--Master/tlpkg/archive/dev.usermode-tlmgr.README212
-rw-r--r--Master/tlpkg/archive/dev.usermode-tlmgr.patch582
4 files changed, 898 insertions, 0 deletions
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 @@
+ <li>set LESS='-R' and unset LESSOPEN and LESSPIPE in the environment
+ before calling pod2usage.
+ <li>don't load the remote db if tlmgr update is called without arguments
++<li>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<USER MODE> below.
++
++=item B<--usertree> I<dir>
++
++Uses I<dir> as user tree in user mode, seel L<USER MODE> below.
++
++
+ =back
+
+ The standard options for TeX Live programs are also accepted:
+@@ -5923,7 +6018,110 @@
+ C<updmap-local.cfg>, you need to run C<tlmgr generate updmap> yourself
+ after making any local changes.
+
++
++=head2 init-usertree
+
++sets up the default user tree (C<TEXMFHOME>) or the one specified
++on the command line using C<--usertree> for user mode management.
++See L<USER MODE> below.
++
++
++=head1 USER MODE
++
++B<WARNING> B<WARNING> B<WARNING>
++This is very much work in progress
++and experimental. Expect breakage, and the need to reinstall your
++user tree a new.
++
++C<tlmgr> 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<tlmgr> 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<tlmgr> works on a user tree, which by default will be
++the value of C<TEXMFHOME>, 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<TEXMFHOME> or the one given on the command line.
++
++Not all actions are allowed in user mode, C<tlmgr> will warn you and
++not carry out this action. The actions of C<tlmgr> 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<help>, B<version>, B<search>, B<show>, B<list>, B<check>, B<print-arch>.
++
++Most of the actions dealing with package management on the other hand
++need write permissions, and behave differently:
++B<install>, B<update>, B<remove>, B<option>, B<paper>, B<generate>,
++B<backup>, B<restore>, B<uninstall>, B<symlinks>.
++
++Currently not supported (and probably will never be) is the B<arch>
++action.
++
++As for the B<gui> action it is currently not supported, but might be
++in future.
++
++Before using C<tlmgr> in user mode, you have to set up the user tree
++with the B<init-usertree> action. This will create C<USERTREE/web2c>,
++C<USERTREE/tlpkg/tlpobj> and set up a minimal C<USERTREE/tlpkg/texlive.tlpdb>.
++From then on you can use the supported actions as normal by adding
++the C<--usermode> command line switch.
++
++In user mode the file C<USERTREE/tlpkg/texlive.tlpdb> contains only the
++packages that have been installed into the user tree C<USERTREE> using
++C<tlmgr>, plus additional options in the virtual package
++00texlive.installation (like with the main installation's texlive.tlpdb).
++
++All actions on packages in user mode can only be carried out on packages
++that are marked as B<relocatable>. Basically that means that the contained
++files all reside in the C<texmd-dist> tree. B<NOTE> That already excludes
++all binary packages! Of the currently about 1900 packages the majority,
++currently about 1750, are relocatable, i.e., they can be installed into
++a user tree.
++
++Description of changes of actions in user mode:
++
++=head2 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).
++
++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.
++
++=head2 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.
++
++=head2 option
++
++only acts upon the user's texlive.tlpdb
++
++=head2 paper
++
++changes configuration files in user tree
++
++=head2 generate
++
++creates configuration files in user tree
++
++B<WARNING WARNING WARNING> Be again warned that this is very experimental!
++
++
++
+ =head1 CONFIGURATION FILE
+
+ A small subset of the command line options can be set in a config file