summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xMaster/texmf-dist/scripts/texlive/tlmgr.pl7
-rw-r--r--Master/tlpkg/TeXLive/TLPDB.pm10
-rw-r--r--Master/tlpkg/TeXLive/TLUtils.pm10
3 files changed, 16 insertions, 11 deletions
diff --git a/Master/texmf-dist/scripts/texlive/tlmgr.pl b/Master/texmf-dist/scripts/texlive/tlmgr.pl
index 7431ebcb69c..8ee5ee58b33 100755
--- a/Master/texmf-dist/scripts/texlive/tlmgr.pl
+++ b/Master/texmf-dist/scripts/texlive/tlmgr.pl
@@ -4434,9 +4434,9 @@ sub action_repository {
return ($F_ERROR);
}
# check if it is either url or absolute path
- if (($p !~ m!^(https?|ftp)://!i) &&
+ if (($p !~ m!^(https?|ftp)://!i) && ($p !~ m!$TeXLive::TLUtils::SshURIRegex!) &&
!File::Spec->file_name_is_absolute($p)) {
- tlwarn("$prg: neither https?/ftp URL nor absolute path, no action: $p\n");
+ tlwarn("$prg: neither https?/ftp/ssh/scp/file URI nor absolute path, no action: $p\n");
return ($F_ERROR);
}
my $t = shift @ARGV;
@@ -6550,7 +6550,8 @@ sub init_local_db {
# we normalize the path only if it is
# - a url starting with neither http or ftp
# - if we are on Windows, it does not start with Drive:[\/]
- if (! ( $location =~ m!^(https?|ftp)://!i ||
+ if (! ( $location =~ m!^(https?|ftp)://!i ||
+ $location =~ m!$TeXLive::TLUtils::SshURIRegex!i ||
(win32() && (!(-e $location) || ($location =~ m!^.:[\\/]!) ) ) ) ) {
# seems to be a local path, try to normalize it
my $testloc = abs_path($location);
diff --git a/Master/tlpkg/TeXLive/TLPDB.pm b/Master/tlpkg/TeXLive/TLPDB.pm
index e8a6ca878ac..7c19c9a805e 100644
--- a/Master/tlpkg/TeXLive/TLPDB.pm
+++ b/Master/tlpkg/TeXLive/TLPDB.pm
@@ -116,10 +116,10 @@ my $_listdir;
C<< TeXLive::TLPDB->new >> creates a new C<TLPDB> object. If the
argument C<root> is given it will be initialized from the respective
-location starting at $path. If C<$path> begins with C<http://> or
-C<ftp://>, the program C<wget> is used to download the file. The
-C<$path> can also start with C<file:/> in which case it is treated as a
-file on the filesystem in the usual way.
+location starting at $path. If C<$path> begins with C<http://>, C<https://>,
+C<ftp://>, C<scp://>, C<ssh://> or C<I<user>@I<host>:>, the respective file
+is downloaded. The C<$path> can also start with C<file:/> in which case it
+is treated as a file on the filesystem in the usual way.
Returns an object of type C<TeXLive::TLPDB>, or undef if the root was
given but no package could be read from that location.
@@ -283,7 +283,7 @@ sub from_file {
my $rootpath = $self->root;
if ($rootpath =~ m,https?://|ftp://,) {
$media = 'NET';
- } elsif ($rootpath =~ m,^[^@]*@[^:]*:,) {
+ } elsif ($rootpath =~ m,$TeXLive::TLUtils::SshURIRegex,) {
$media = 'NET';
} else {
if ($rootpath =~ m,file://*(.*)$,) {
diff --git a/Master/tlpkg/TeXLive/TLUtils.pm b/Master/tlpkg/TeXLive/TLUtils.pm
index d6c4a700677..b8151bf35de 100644
--- a/Master/tlpkg/TeXLive/TLUtils.pm
+++ b/Master/tlpkg/TeXLive/TLUtils.pm
@@ -198,6 +198,7 @@ BEGIN {
&encode_json
&True
&False
+ &SshURIRegex
);
@EXPORT = qw(setup_programs download_file process_logging_options
tldie tlwarn info log debug ddebug dddebug debug_hash
@@ -213,6 +214,7 @@ use TeXLive::TLConfig;
$::opt_verbosity = 0; # see process_logging_options
+our $SshURIRegex = '^((ssh|scp)://([^@]*)@([^/]*)/|([^@]*)@([^:]*):).*$';
=head2 Platform detection
@@ -2176,7 +2178,7 @@ sub unpack {
$containerfile_quote = "\"$containerfile\"";
$tarfile_quote = "\"$tarfile\"";
$target_quote = "\"$target\"";
- if ($what =~ m,^(https?|ftp)://, || $what =~ m,^[^@]*@[^:]*:,) {
+ if ($what =~ m,^(https?|ftp)://, || $what =~ m!$SshURIRegex!) {
# we are installing from the NET
# check for the presence of $what in $tempdir
if (-r $containerfile) {
@@ -2575,7 +2577,7 @@ sub download_file {
}
}
- if ($relpath =~ m;([^@]*)@([^:]*):(.*)$;) {
+ if ($relpath =~ m!$SshURIRegex!) {
my $downdest;
if ($dest eq "|") {
my ($fh, $fn) = TeXLive::TLUtils::tl_tmpfile();
@@ -2583,6 +2585,8 @@ sub download_file {
} else {
$downdest = $dest;
}
+ # massage ssh:// into the scp acceptable scp://
+ $relpath =~ s!^ssh://!scp://!;
my $retval = system("scp", "-q", $relpath, $downdest);
if ($retval != 0) {
$retval /= 256 if $retval > 0;
@@ -3834,7 +3838,7 @@ Returns the local file name if succeeded, otherwise undef.
sub download_to_temp_or_file {
my $url = shift;
my ($url_fh, $url_file);
- if ($url =~ m,^(https?|ftp|file)://, || $url =~ m,^[^@]*@[^:]*:,) {
+ if ($url =~ m,^(https?|ftp|file)://, || $url =~ m!$SshURIRegex!) {
($url_fh, $url_file) = tl_tmpfile();
# now $url_fh filehandle is open, the file created
# TLUtils::download_file will just overwrite what is there