summaryrefslogtreecommitdiff
path: root/Master/tlpkg/etc/dev.rework-setup-programs-with-copy.patch
blob: 6d38d05a3e679bf64c2d08e212075018724be5ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
Index: tlpkg/TeXLive/TLConfig.pm
===================================================================
--- tlpkg/TeXLive/TLConfig.pm	(revision 11959)
+++ tlpkg/TeXLive/TLConfig.pm	(working copy)
@@ -28,6 +28,7 @@
     $WinSpecialUpdatePackagesRegexp
     @CriticalPackagesList
     @AllowedConfigOptions
+    @PostMortemRemovals
   );
   @EXPORT = @EXPORT_OK;
 }
@@ -81,7 +82,9 @@
   backupdir
   autobackup
   /;
-  
+
+our @PostMortemRemovals = ();
+
 1;
 
 
@@ -165,6 +168,11 @@
 
 A list of a config options that can be set in 00texlive-installation.config.
 
+=item C<@TeXLive::TLConfig::PostMortemRemovals>
+
+A list of files and directories we try to remove after install-tl or 
+tlmgr has been terminated.
+
 =back
 
 =head1 SEE ALSO
Index: tlpkg/TeXLive/TLUtils.pm
===================================================================
--- tlpkg/TeXLive/TLUtils.pm	(revision 11959)
+++ tlpkg/TeXLive/TLUtils.pm	(working copy)
@@ -1324,10 +1324,6 @@
 If a program is not present in the TeX Live tree, we also check along
 PATH (without the platform extension.)
 
-Returns -1 if the architecture is not supported (i.e., there is no
-C<lzmadec> binary for that arch present), 0 for programs that are
-present but don't work, and 1 for success.
-
 =cut
 
 sub setup_programs {
@@ -1342,7 +1338,17 @@
     $::progs{'tar'}     = conv_to_w32_path("$bindir/tar.exe");
     $::progs{'lzmadec'} = conv_to_w32_path("$bindir/lzma/lzmadec.win32.exe");
     $::progs{'lzma'}    = conv_to_w32_path("$bindir/lzma/lzma.exe");
-
+    for my $prog ("lzmadec", "wget") {
+      my $opt = $prog eq "lzmadec" ? "--help" : "--version";
+      my $ret = system("$::progs{$prog} $opt > nul 2>&1"); # on windows
+      if ($ret != 0) {
+        warn "TeXLive::TLUtils::setup_programs failed";  # no newline
+        warn "$::progs{$prog} $opt failed (status $ret): $!\n";
+        warn "Output is:\n";
+        system ("$::progs{$prog} $opt");
+        return 0;
+      }
+    }
   } else {
     if (!defined($platform) || ($platform eq "")) {
       # we assume that we run from the DVD, so we can call platform() and
@@ -1352,51 +1358,102 @@
       $::installerdir = "$bindir/../..";
       $platform = platform();
     }
-    $::progs{'wget'} = "$bindir/wget/wget.$platform"
-      if -x "$bindir/wget/wget.$platform";
-    $::progs{'lzmadec'} = "$bindir/lzma/lzmadec.$platform"
-      if -x "$bindir/lzma/lzmadec.$platform";
-    $::progs{'lzma'} = "$bindir/lzma/lzma.$platform"
-      if -x "$bindir/lzma/lzma.$platform";
+    our $tmp;
+    setup_unix_one('wget', "$bindir/wget/wget.$platform", "--version");
+    setup_unix_one('lzmadec', "$bindir/lzma/lzmadec.$platform", "--help");
+    setup_unix_one('lzma', "$bindir/lzma/lzma.$platform", "notest");
+    push @TeXLive::TLConfig::PostMortemRemovals, $tmp;
   }
 
-  # Check for existence of lzmadec in our directory; if so, the present
-  # platform is supported.  But if it's not there, the test below for a
-  # working lzmadec could still succeed if the binary is found in $PATH.
-  # 
-  # Because conv_to_w32_path possibly added quotes, strip them away for
-  # the file test.  Since all other uses of conv_to_w32_path use the
-  # result in shell commands, this is the most expedient thing to do.
-  # 
-  (my $lzmadec = $::progs{'lzmadec'}) =~ s/^"(.*)"/$1/;
-  my $found_lzmadec = -x $lzmadec;
+  return 1;  # success
+}
 
-  # should we do something like this?
-  #if (-r $lzmadec && ! -x $lzmadec) {
-  #  warn "$lzmadec is not executable. You might want to mount the DVD without the 'noexec' option.";
-  #  return 0;
-  #}
-
-  # check if the programs are working, but do not test tar, we rely on
-  # the system having a usable one.  The main point is to check the
-  # binaries we provide.
-  for my $prog ("lzmadec", "wget") {
-    my $opt = $prog eq "lzmadec" ? "--help" : "--version";
-    my $ret = system("$::progs{$prog} $opt >"
-                     . (win32() ? "nul" : "/dev/null") . " 2>&1");
-    if ($ret != 0) {
-      warn "TeXLive::TLUtils::setup_programs failed";  # no newline
-      warn "$::progs{$prog} $opt failed (status $ret): $!\n";
-      warn "Output is:\n";
-      system ("$::progs{$prog} $opt");
-      return $found_lzmadec ? 0 : -1;
+sub setup_unix_one {
+  my ($p, $def, $arg) = @_;
+  our $tmp;
+  my $test_fallback = 0;
+  if (-r $def) {
+    my $ready = 0;
+    if (-x $def) {
+      # checking only for the executable bit is not enough, we have
+      # to check for actualy "executability" since a "noexec" mount
+      # option may interfere, which is not taken into account by
+      # perl's -x test.
+      $::progs{$p} = $def;
+      if ($arg ne "notest") {
+        my $ret = system("$def $arg > /dev/null 2>&1" ); # we are on Unix
+        if ($ret == 0) {
+          $ready = 1;
+          debug("Using shipped $def for $p (tested).\n");
+        } else {
+          ddebug("Shipped $def has -x but cannot be executed.\n");
+        }
+      } else {
+        # do not test, just return
+        $ready = 1;
+        debug("Using shipped $def for $p (not tested).\n");
+      }
     }
+    if (!$ready) {
+      # out of some reasons we couldn't execute the shipped program
+      # try to copy it to a temp directory and make it executable
+      #
+      # create tmp dir only when necessary
+      chomp ($tmp = `mktemp -d`) unless defined($tmp);
+      # probably we are running from DVD and want to copy it to 
+      # some temporary location
+      copy($def, $tmp);
+      my $bn = basename($def);
+      $::progs{$p} = "$tmp/$bn";
+      push @TeXLive::TLConfig::PostMortemRemovals, $::progs{$p};
+      chmod(0755,$::progs{$p});
+      # we do not check the return value of chmod, but check whether
+      # the -x bit is now set, the only thing that counts
+      if (! -x $::progs{$p}) {
+        # hmm, something is going really bad, not even the copy is
+        # executable. Fall back to normal path element
+        $test_fallback = 1;
+        ddebug("Copied $p $::progs{$p} does not have -x bit, strange!\n");
+      } else {
+        # check again for executability
+        if ($arg ne "notest") {
+          my $ret = system("$::progs{$p} $arg > /dev/null 2>&1");
+          if ($ret == 0) {
+            # ok, the copy works
+            debug("Using copied $::progs{$p} for $p (tested).\n");
+          } else {
+            # even the copied prog is not executable, strange
+            $test_fallback = 1;
+            ddebug("Copied $p $::progs{$p} has x bit but not executable, strange!\n");
+          }
+        } else {
+          debug("Using copied $::progs{$p} for $p (not tested).\n");
+        }
+      }
+    }
+  } else {
+    # hope that we can find in in the global PATH
+    $test_fallback = 1;
   }
-
-  return 1;  # success
+  if ($test_fallback) {
+    # all our playing around and copying did not succeed, try the 
+    # fallback
+    $::progs{$p} = $p;
+    if ($arg ne "notest") {
+      my $ret = system("$p $arg > /dev/null 2>&1");
+      if ($ret == 0) {
+        debug("Using system $p (tested).\n");
+      } else {
+        tlwarn("TeXLive::TLUtils::setup_programs failed.\n");
+        tlwarn("Could not find a usable program for $p.\n");
+        return 0;
+      }
+    } else {
+      debug ("Using system $p (not tested).\n");
+    }
+  }
 }
 
-
 =item C<download_file( $relpath, $destination [, $progs ] )>
 
 Try to download the file given in C<$relpath> from C<$TeXLiveURL>
Index: install-tl
===================================================================
--- install-tl	(revision 11959)
+++ install-tl	(working copy)
@@ -1371,6 +1371,17 @@
     } else {
       print "No logfile\n";
   }
+
+  # remove stuff that has been accumulated in @PostMortemRemoval
+  # do not check for any success in removal. 
+  #
+  # first remove all not dirs, then try to remove dirs
+  for my $e (@TeXLive::TLConfig::PostMortemRemovals) {
+    unlink $e unless -d $e;
+  }
+  for my $e (@TeXLive::TLConfig::PostMortemRemovals) {
+    rmdir $e if -d $e;
+  }
 }
 
 
Index: texmf/scripts/texlive/tlmgr.pl
===================================================================
--- texmf/scripts/texlive/tlmgr.pl	(revision 11959)
+++ texmf/scripts/texlive/tlmgr.pl	(working copy)
@@ -2431,6 +2431,9 @@
 # 
 # set global $location variable.
 # if we cannot read tlpdb, die if arg SHOULD_I_DIE is true.
+#
+# if an argument is given and is true init_local_db will die if 
+# setting up of programs failed.
 # 
 sub init_local_db {
   my ($should_i_die) = @_;
@@ -2438,17 +2441,8 @@
   die("cannot find tlpdb in $Master") unless (defined($localtlpdb));
   # setup the programs, for w32 we need the shipped wget/lzma etc, so we
   # pass the location of these files to setup_programs.
-  my $ret = setup_programs("$Master/tlpkg/installer",
-                           $localtlpdb->option_platform);
-  if ($ret == -1) {
-    tlwarn("no binary of lzmadec for $::_platform_ detected.\n");
-    if (defined($should_i_die) && $should_i_die) {
-      exit 1;
-    } else {
-      tlwarn("Continuing anyway ...\n");
-    }
-  }
-  if (!$ret) {
+  if (!setup_programs("$Master/tlpkg/installer", 
+                      $localtlpdb->option_platform)) {
     tlwarn("Couldn't set up the necessary programs.\nInstallation of packages is not supported.\nPlease report to texlive\@tug.org.\n");
     if (defined($should_i_die) && $should_i_die) {
       finish(1);