Initial Commit
This commit is contained in:
218
database/perl/vendor/lib/Alien/Build/Plugin/Extract/ArchiveTar.pm
vendored
Normal file
218
database/perl/vendor/lib/Alien/Build/Plugin/Extract/ArchiveTar.pm
vendored
Normal file
@@ -0,0 +1,218 @@
|
||||
package Alien::Build::Plugin::Extract::ArchiveTar;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use 5.008004;
|
||||
use Alien::Build::Plugin;
|
||||
use File::chdir;
|
||||
use File::Temp ();
|
||||
use Path::Tiny ();
|
||||
|
||||
# ABSTRACT: Plugin to extract a tarball using Archive::Tar
|
||||
our $VERSION = '2.38'; # VERSION
|
||||
|
||||
|
||||
has '+format' => 'tar';
|
||||
|
||||
|
||||
sub handles
|
||||
{
|
||||
my(undef, $ext) = @_;
|
||||
|
||||
return 1 if $ext =~ /^(tar|tar.gz|tar.bz2|tbz|taz)$/;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
sub available
|
||||
{
|
||||
my(undef, $ext) = @_;
|
||||
|
||||
if($ext eq 'tar.gz')
|
||||
{
|
||||
return !! eval { require Archive::Tar; Archive::Tar->has_zlib_support };
|
||||
}
|
||||
elsif($ext eq 'tar.bz2')
|
||||
{
|
||||
return !! eval { require Archive::Tar; Archive::Tar->has_bzip2_support && __PACKAGE__->_can_bz2 };
|
||||
}
|
||||
else
|
||||
{
|
||||
return $ext eq 'tar';
|
||||
}
|
||||
}
|
||||
|
||||
sub init
|
||||
{
|
||||
my($self, $meta) = @_;
|
||||
|
||||
$meta->add_requires('share' => 'Archive::Tar' => 0);
|
||||
if($self->format eq 'tar.gz' || $self->format eq 'tgz')
|
||||
{
|
||||
$meta->add_requires('share' => 'IO::Zlib' => 0);
|
||||
}
|
||||
elsif($self->format eq 'tar.bz2' || $self->format eq 'tbz')
|
||||
{
|
||||
$meta->add_requires('share' => 'IO::Uncompress::Bunzip2' => 0);
|
||||
$meta->add_requires('share' => 'IO::Compress::Bzip2' => 0);
|
||||
}
|
||||
|
||||
$meta->register_hook(
|
||||
extract => sub {
|
||||
my($build, $src) = @_;
|
||||
my $tar = Archive::Tar->new;
|
||||
$tar->read($src);
|
||||
$tar->extract;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
sub _can_bz2
|
||||
{
|
||||
# even when Archive::Tar reports that it supports bz2, I can sometimes get this error:
|
||||
# 'Cannot read enough bytes from the tarfile', so lets just probe for actual support!
|
||||
my $dir = Path::Tiny->new(File::Temp::tempdir( CLEANUP => 1 ));
|
||||
eval {
|
||||
local $CWD = $dir;
|
||||
my $tarball = unpack "u", q{M0EIH.3%!62936=+(]$0``$A[D-$0`8!``7^``!!AI)Y`!```""``=!JGIH-(MT#0]0/2!**---&F@;4#0&:D;X?(6@JH(2<%'N$%3VHC-9E>S/N@"6&I*1@GNJNHCC2>$I5(<0BKR.=XBZ""HVZ;T,CV\LJ!K&*?9`#\7<D4X4)#2R/1$`};
|
||||
Path::Tiny->new('xx.tar.bz2')->spew_raw($tarball);
|
||||
require Archive::Tar;
|
||||
my $tar = Archive::Tar->new;
|
||||
$tar->read('xx.tar.bz2');
|
||||
$tar->extract;
|
||||
my $content = Path::Tiny->new('xx.txt')->slurp;
|
||||
die unless $content && $content eq "xx\n";
|
||||
};
|
||||
my $error = $@;
|
||||
$dir->remove_tree;
|
||||
!$error;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
=encoding UTF-8
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Alien::Build::Plugin::Extract::ArchiveTar - Plugin to extract a tarball using Archive::Tar
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
version 2.38
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use alienfile;
|
||||
plugin 'Extract::ArchiveTar' => (
|
||||
format => 'tar.gz',
|
||||
);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Note: in most case you will want to use L<Alien::Build::Plugin::Extract::Negotiate>
|
||||
instead. It picks the appropriate Extract plugin based on your platform and environment.
|
||||
In some cases you may need to use this plugin directly instead.
|
||||
|
||||
This plugin extracts from an archive in tarball format (optionally compressed by either
|
||||
gzip or bzip2) using L<Archive::Tar>.
|
||||
|
||||
=head1 PROPERTIES
|
||||
|
||||
=head2 format
|
||||
|
||||
Gives a hint as to the expected format. This helps make sure the prerequisites are set
|
||||
correctly, since compressed archives require extra Perl modules to be installed.
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=head2 handles
|
||||
|
||||
Alien::Build::Plugin::Extract::ArchiveTar->handles($ext);
|
||||
$plugin->handles($ext);
|
||||
|
||||
Returns true if the plugin is able to handle the archive of the
|
||||
given format.
|
||||
|
||||
=head2 available
|
||||
|
||||
Alien::Build::Plugin::Extract::ArchiveTar->available($ext);
|
||||
|
||||
Returns true if the plugin has what it needs right now to extract from the given format
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<Alien::Build::Plugin::Extract::Negotiate>, L<Alien::Build>, L<alienfile>, L<Alien::Build::MM>, L<Alien>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Author: Graham Ollis E<lt>plicease@cpan.orgE<gt>
|
||||
|
||||
Contributors:
|
||||
|
||||
Diab Jerius (DJERIUS)
|
||||
|
||||
Roy Storey (KIWIROY)
|
||||
|
||||
Ilya Pavlov
|
||||
|
||||
David Mertens (run4flat)
|
||||
|
||||
Mark Nunberg (mordy, mnunberg)
|
||||
|
||||
Christian Walde (Mithaldu)
|
||||
|
||||
Brian Wightman (MidLifeXis)
|
||||
|
||||
Zaki Mughal (zmughal)
|
||||
|
||||
mohawk (mohawk2, ETJ)
|
||||
|
||||
Vikas N Kumar (vikasnkumar)
|
||||
|
||||
Flavio Poletti (polettix)
|
||||
|
||||
Salvador Fandiño (salva)
|
||||
|
||||
Gianni Ceccarelli (dakkar)
|
||||
|
||||
Pavel Shaydo (zwon, trinitum)
|
||||
|
||||
Kang-min Liu (劉康民, gugod)
|
||||
|
||||
Nicholas Shipp (nshp)
|
||||
|
||||
Juan Julián Merelo Guervós (JJ)
|
||||
|
||||
Joel Berger (JBERGER)
|
||||
|
||||
Petr Pisar (ppisar)
|
||||
|
||||
Lance Wicks (LANCEW)
|
||||
|
||||
Ahmad Fatoum (a3f, ATHREEF)
|
||||
|
||||
José Joaquín Atria (JJATRIA)
|
||||
|
||||
Duke Leto (LETO)
|
||||
|
||||
Shoichi Kaji (SKAJI)
|
||||
|
||||
Shawn Laffan (SLAFFAN)
|
||||
|
||||
Paul Evans (leonerd, PEVANS)
|
||||
|
||||
Håkon Hægland (hakonhagland, HAKONH)
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
This software is copyright (c) 2011-2020 by Graham Ollis.
|
||||
|
||||
This is free software; you can redistribute it and/or modify it under
|
||||
the same terms as the Perl 5 programming language system itself.
|
||||
|
||||
=cut
|
||||
174
database/perl/vendor/lib/Alien/Build/Plugin/Extract/ArchiveZip.pm
vendored
Normal file
174
database/perl/vendor/lib/Alien/Build/Plugin/Extract/ArchiveZip.pm
vendored
Normal file
@@ -0,0 +1,174 @@
|
||||
package Alien::Build::Plugin::Extract::ArchiveZip;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use 5.008004;
|
||||
use Alien::Build::Plugin;
|
||||
|
||||
# ABSTRACT: Plugin to extract a tarball using Archive::Zip
|
||||
our $VERSION = '2.38'; # VERSION
|
||||
|
||||
|
||||
has '+format' => 'zip';
|
||||
|
||||
|
||||
sub handles
|
||||
{
|
||||
my($class, $ext) = @_;
|
||||
|
||||
return 1 if $ext eq 'zip';
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
sub available
|
||||
{
|
||||
my(undef, $ext) = @_;
|
||||
|
||||
!! ( $ext eq 'zip' && eval { require Archive::Zip; 1} );
|
||||
}
|
||||
|
||||
sub init
|
||||
{
|
||||
my($self, $meta) = @_;
|
||||
|
||||
$meta->add_requires('share' => 'Archive::Zip' => 0);
|
||||
|
||||
$meta->register_hook(
|
||||
extract => sub {
|
||||
my($build, $src) = @_;
|
||||
my $zip = Archive::Zip->new;
|
||||
$zip->read($src);
|
||||
$zip->extractTree;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
=encoding UTF-8
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Alien::Build::Plugin::Extract::ArchiveZip - Plugin to extract a tarball using Archive::Zip
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
version 2.38
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use alienfile;
|
||||
plugin 'Extract::ArchiveZip' => (
|
||||
format => 'zip',
|
||||
);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Note: in most case you will want to use L<Alien::Build::Plugin::Extract::Negotiate>
|
||||
instead. It picks the appropriate Extract plugin based on your platform and environment.
|
||||
In some cases you may need to use this plugin directly instead.
|
||||
|
||||
B<Note>: Seriously do NOT use this plugin! L<Archive::Zip> is pretty unreliable and
|
||||
breaks all-the-time. If you use the negotiator plugin mentioned above, then it will
|
||||
prefer installing L<Alien::unzip>, which is much more reliable than L<Archive::Zip>.
|
||||
|
||||
This plugin extracts from an archive in zip format using L<Archive::Zip>.
|
||||
|
||||
=head2 format
|
||||
|
||||
Gives a hint as to the expected format. This should always be C<zip>.
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=head2 handles
|
||||
|
||||
Alien::Build::Plugin::Extract::ArchiveZip->handles($ext);
|
||||
$plugin->handles($ext);
|
||||
|
||||
Returns true if the plugin is able to handle the archive of the
|
||||
given format.
|
||||
|
||||
=head2 available
|
||||
|
||||
Alien::Build::Plugin::Extract::ArchiveZip->available($ext);
|
||||
|
||||
Returns true if the plugin has what it needs right now to extract from the given format
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<Alien::Build::Plugin::Extract::Negotiate>, L<Alien::Build>, L<alienfile>, L<Alien::Build::MM>, L<Alien>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Author: Graham Ollis E<lt>plicease@cpan.orgE<gt>
|
||||
|
||||
Contributors:
|
||||
|
||||
Diab Jerius (DJERIUS)
|
||||
|
||||
Roy Storey (KIWIROY)
|
||||
|
||||
Ilya Pavlov
|
||||
|
||||
David Mertens (run4flat)
|
||||
|
||||
Mark Nunberg (mordy, mnunberg)
|
||||
|
||||
Christian Walde (Mithaldu)
|
||||
|
||||
Brian Wightman (MidLifeXis)
|
||||
|
||||
Zaki Mughal (zmughal)
|
||||
|
||||
mohawk (mohawk2, ETJ)
|
||||
|
||||
Vikas N Kumar (vikasnkumar)
|
||||
|
||||
Flavio Poletti (polettix)
|
||||
|
||||
Salvador Fandiño (salva)
|
||||
|
||||
Gianni Ceccarelli (dakkar)
|
||||
|
||||
Pavel Shaydo (zwon, trinitum)
|
||||
|
||||
Kang-min Liu (劉康民, gugod)
|
||||
|
||||
Nicholas Shipp (nshp)
|
||||
|
||||
Juan Julián Merelo Guervós (JJ)
|
||||
|
||||
Joel Berger (JBERGER)
|
||||
|
||||
Petr Pisar (ppisar)
|
||||
|
||||
Lance Wicks (LANCEW)
|
||||
|
||||
Ahmad Fatoum (a3f, ATHREEF)
|
||||
|
||||
José Joaquín Atria (JJATRIA)
|
||||
|
||||
Duke Leto (LETO)
|
||||
|
||||
Shoichi Kaji (SKAJI)
|
||||
|
||||
Shawn Laffan (SLAFFAN)
|
||||
|
||||
Paul Evans (leonerd, PEVANS)
|
||||
|
||||
Håkon Hægland (hakonhagland, HAKONH)
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
This software is copyright (c) 2011-2020 by Graham Ollis.
|
||||
|
||||
This is free software; you can redistribute it and/or modify it under
|
||||
the same terms as the Perl 5 programming language system itself.
|
||||
|
||||
=cut
|
||||
557
database/perl/vendor/lib/Alien/Build/Plugin/Extract/CommandLine.pm
vendored
Normal file
557
database/perl/vendor/lib/Alien/Build/Plugin/Extract/CommandLine.pm
vendored
Normal file
@@ -0,0 +1,557 @@
|
||||
package Alien::Build::Plugin::Extract::CommandLine;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use 5.008004;
|
||||
use Alien::Build::Plugin;
|
||||
use Path::Tiny ();
|
||||
use File::Which ();
|
||||
use File::chdir;
|
||||
use File::Temp qw( tempdir );
|
||||
use Capture::Tiny qw( capture_merged );
|
||||
|
||||
# ABSTRACT: Plugin to extract an archive using command line tools
|
||||
our $VERSION = '2.38'; # VERSION
|
||||
|
||||
|
||||
has '+format' => 'tar';
|
||||
|
||||
|
||||
sub gzip_cmd
|
||||
{
|
||||
_which('gzip') ? 'gzip' : undef;
|
||||
}
|
||||
|
||||
|
||||
sub _which { scalar File::Which::which(@_) }
|
||||
|
||||
sub bzip2_cmd
|
||||
{
|
||||
_which('bzip2') ? 'bzip2' : undef;
|
||||
}
|
||||
|
||||
|
||||
sub xz_cmd
|
||||
{
|
||||
_which('xz') ? 'xz' : undef;
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
my $bsd_tar;
|
||||
|
||||
# Note: GNU tar can be iffy to very bad on windows, where absolute
|
||||
# paths get confused with remote tars. We used to assume that 'tar.exe'
|
||||
# is borked on Windows, but recent versions of Windows 10 come bundled
|
||||
# with bsdtar (libarchive) named 'tar.exe', and we should definitely
|
||||
# prefer that to ptar.
|
||||
sub _windows_tar_is_bsdtar
|
||||
{
|
||||
return 1 if $^O ne 'MSWin32';
|
||||
return $bsd_tar if defined $bsd_tar;
|
||||
my($out) = capture_merged {
|
||||
system 'tar', '--version';
|
||||
};
|
||||
return $bsd_tar = $out =~ /bsdtar/ ? 1 : 0
|
||||
}
|
||||
}
|
||||
|
||||
sub tar_cmd
|
||||
{
|
||||
_which('bsdtar')
|
||||
? 'bsdtar'
|
||||
# Slowlaris /usr/bin/tar doesn't seem to like pax global header
|
||||
# but seems to have gtar in the path by default, which is okay with it
|
||||
: $^O eq 'solaris' && _which('gtar')
|
||||
? 'gtar'
|
||||
# See note above for Windows logic.
|
||||
: _which('tar') && _windows_tar_is_bsdtar()
|
||||
? 'tar'
|
||||
: _which('ptar')
|
||||
? 'ptar'
|
||||
: undef;
|
||||
};
|
||||
|
||||
|
||||
sub unzip_cmd
|
||||
{
|
||||
if($^O eq 'MSWin32' && _which('tar') && _windows_tar_is_bsdtar())
|
||||
{
|
||||
(_which('tar'), 'xf');
|
||||
}
|
||||
else
|
||||
{
|
||||
_which('unzip') ? 'unzip' : undef;
|
||||
}
|
||||
}
|
||||
|
||||
sub _run
|
||||
{
|
||||
my(undef, $build, @cmd) = @_;
|
||||
$build->log("+ @cmd");
|
||||
system @cmd;
|
||||
die "execute failed" if $?;
|
||||
}
|
||||
|
||||
sub _cp
|
||||
{
|
||||
my(undef, $build, $from, $to) = @_;
|
||||
require File::Copy;
|
||||
$build->log("copy $from => $to");
|
||||
File::Copy::cp($from, $to) || die "unable to copy: $!";
|
||||
}
|
||||
|
||||
sub _mv
|
||||
{
|
||||
my(undef, $build, $from, $to) = @_;
|
||||
$build->log("move $from => $to");
|
||||
rename($from, $to) || die "unable to rename: $!";
|
||||
}
|
||||
|
||||
sub _dcon
|
||||
{
|
||||
my($self, $src) = @_;
|
||||
|
||||
my $name;
|
||||
my $cmd;
|
||||
|
||||
if($src =~ /\.(gz|tgz|Z|taz)$/)
|
||||
{
|
||||
$self->gzip_cmd(_which('gzip')) unless defined $self->gzip_cmd;
|
||||
if($src =~ /\.(gz|tgz)$/)
|
||||
{
|
||||
$cmd = $self->gzip_cmd unless $self->_tar_can('tar.gz');
|
||||
}
|
||||
elsif($src =~ /\.(Z|taz)$/)
|
||||
{
|
||||
$cmd = $self->gzip_cmd unless $self->_tar_can('tar.Z');
|
||||
}
|
||||
}
|
||||
elsif($src =~ /\.(bz2|tbz)$/)
|
||||
{
|
||||
$self->bzip2_cmd(_which('bzip2')) unless defined $self->bzip2_cmd;
|
||||
$cmd = $self->bzip2_cmd unless $self->_tar_can('tar.bz2');
|
||||
}
|
||||
elsif($src =~ /\.(xz|txz)$/)
|
||||
{
|
||||
$self->xz_cmd(_which('xz')) unless defined $self->xz_cmd;
|
||||
$cmd = $self->xz_cmd unless $self->_tar_can('tar.xz');
|
||||
}
|
||||
|
||||
if($cmd && $src =~ /\.(gz|bz2|xz|Z)$/)
|
||||
{
|
||||
$name = $src;
|
||||
$name =~ s/\.(gz|bz2|xz|Z)$//g;
|
||||
}
|
||||
elsif($cmd && $src =~ /\.(tgz|tbz|txz|taz)$/)
|
||||
{
|
||||
$name = $src;
|
||||
$name =~ s/\.(tgz|tbz|txz|taz)$/.tar/;
|
||||
}
|
||||
|
||||
($name,$cmd);
|
||||
}
|
||||
|
||||
|
||||
sub handles
|
||||
{
|
||||
my($class, $ext) = @_;
|
||||
|
||||
my $self = ref $class
|
||||
? $class
|
||||
: __PACKAGE__->new;
|
||||
|
||||
$ext = 'tar.Z' if $ext eq 'taz';
|
||||
$ext = 'tar.gz' if $ext eq 'tgz';
|
||||
$ext = 'tar.bz2' if $ext eq 'tbz';
|
||||
$ext = 'tar.xz' if $ext eq 'txz';
|
||||
|
||||
return 1 if $ext eq 'tar.gz' && $self->_tar_can('tar.gz');
|
||||
return 1 if $ext eq 'tar.Z' && $self->_tar_can('tar.Z');
|
||||
return 1 if $ext eq 'tar.bz2' && $self->_tar_can('tar.bz2');
|
||||
return 1 if $ext eq 'tar.xz' && $self->_tar_can('tar.xz');
|
||||
|
||||
return 0 if $ext =~ s/\.(gz|Z)$// && (!$self->gzip_cmd);
|
||||
return 0 if $ext =~ s/\.bz2$// && (!$self->bzip2_cmd);
|
||||
return 0 if $ext =~ s/\.xz$// && (!$self->xz_cmd);
|
||||
|
||||
return 1 if $ext eq 'tar' && $self->_tar_can('tar');
|
||||
return 1 if $ext eq 'zip' && $self->_tar_can('zip');
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
sub available
|
||||
{
|
||||
my(undef, $ext) = @_;
|
||||
|
||||
# this is actually the same as handles
|
||||
__PACKAGE__->handles($ext);
|
||||
}
|
||||
|
||||
sub init
|
||||
{
|
||||
my($self, $meta) = @_;
|
||||
|
||||
if($self->format eq 'tar.xz' && !$self->handles('tar.xz'))
|
||||
{
|
||||
$meta->add_requires('share' => 'Alien::xz' => '0.06');
|
||||
}
|
||||
elsif($self->format eq 'tar.bz2' && !$self->handles('tar.bz2'))
|
||||
{
|
||||
$meta->add_requires('share' => 'Alien::Libbz2' => '0.22');
|
||||
}
|
||||
elsif($self->format =~ /^tar\.(gz|Z)$/ && !$self->handles($self->format))
|
||||
{
|
||||
$meta->add_requires('share' => 'Alien::gzip' => '0.03');
|
||||
}
|
||||
elsif($self->format eq 'zip' && !$self->handles('zip'))
|
||||
{
|
||||
$meta->add_requires('share' => 'Alien::unzip' => '0');
|
||||
}
|
||||
|
||||
$meta->register_hook(
|
||||
extract => sub {
|
||||
my($build, $src) = @_;
|
||||
|
||||
my($dcon_name, $dcon_cmd) = _dcon($self, $src);
|
||||
|
||||
if($dcon_name)
|
||||
{
|
||||
unless($dcon_cmd)
|
||||
{
|
||||
die "unable to decompress $src";
|
||||
}
|
||||
# if we have already decompressed, then keep it.
|
||||
unless(-f $dcon_name)
|
||||
{
|
||||
# we don't use pipes, because that may not work on Windows.
|
||||
# keep the original archive, in case another extract
|
||||
# plugin needs it. keep the decompressed archive
|
||||
# in case WE need it again.
|
||||
my $src_tmp = Path::Tiny::path($src)
|
||||
->parent
|
||||
->child('x'.Path::Tiny::path($src)->basename);
|
||||
my $dcon_tmp = Path::Tiny::path($dcon_name)
|
||||
->parent
|
||||
->child('x'.Path::Tiny::path($dcon_name)->basename);
|
||||
$self->_cp($build, $src, $src_tmp);
|
||||
$self->_run($build, $dcon_cmd, "-d", $src_tmp);
|
||||
$self->_mv($build, $dcon_tmp, $dcon_name);
|
||||
}
|
||||
$src = $dcon_name;
|
||||
}
|
||||
|
||||
if($src =~ /\.zip$/i)
|
||||
{
|
||||
$self->_run($build, $self->unzip_cmd, $src);
|
||||
}
|
||||
elsif($src =~ /\.tar/ || $src =~ /(\.tgz|\.tbz|\.txz|\.taz)$/i)
|
||||
{
|
||||
$self->_run($build, $self->tar_cmd, '-xf', $src);
|
||||
}
|
||||
else
|
||||
{
|
||||
die "not sure of archive type from extension";
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
my %tars;
|
||||
|
||||
sub _tar_can
|
||||
{
|
||||
my($self, $ext) = @_;
|
||||
|
||||
unless(%tars)
|
||||
{
|
||||
my $name = '';
|
||||
local $_; # to avoid dynamically scoped read-only $_ from upper scopes
|
||||
while(my $line = <DATA>)
|
||||
{
|
||||
if($line =~ /^\[ (.*) \]$/)
|
||||
{
|
||||
$name = $1;
|
||||
}
|
||||
else
|
||||
{
|
||||
$tars{$name} .= $line;
|
||||
}
|
||||
}
|
||||
|
||||
foreach my $key (keys %tars)
|
||||
{
|
||||
$tars{$key} = unpack "u", $tars{$key};
|
||||
}
|
||||
}
|
||||
|
||||
my $name = "xx.$ext";
|
||||
|
||||
return 0 unless $tars{$name};
|
||||
|
||||
local $CWD = tempdir( CLEANUP => 1 );
|
||||
|
||||
my $cleanup = sub {
|
||||
my $save = $CWD;
|
||||
unlink $name;
|
||||
unlink 'xx.txt';
|
||||
$CWD = '..';
|
||||
rmdir $save;
|
||||
};
|
||||
|
||||
Path::Tiny->new($name)->spew_raw($tars{$name});
|
||||
|
||||
my @cmd = ($self->tar_cmd, 'xf', $name);
|
||||
if($ext eq 'zip')
|
||||
{
|
||||
@cmd = ($self->unzip_cmd, $name);
|
||||
}
|
||||
|
||||
my(undef, $exit) = capture_merged {
|
||||
system(@cmd);
|
||||
$?;
|
||||
};
|
||||
|
||||
if($exit)
|
||||
{
|
||||
$cleanup->();
|
||||
return 0;
|
||||
}
|
||||
|
||||
my $content = eval { Path::Tiny->new('xx.txt')->slurp };
|
||||
$cleanup->();
|
||||
|
||||
return defined $content && $content eq "xx\n";
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
=pod
|
||||
|
||||
=encoding UTF-8
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Alien::Build::Plugin::Extract::CommandLine - Plugin to extract an archive using command line tools
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
version 2.38
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use alienfile;
|
||||
plugin 'Extract::CommandLine' => (
|
||||
format => 'tar.gz',
|
||||
);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Note: in most case you will want to use L<Alien::Build::Plugin::Extract::Negotiate>
|
||||
instead. It picks the appropriate Extract plugin based on your platform and environment.
|
||||
In some cases you may need to use this plugin directly instead.
|
||||
|
||||
This plugin extracts from an archive in various formats using command line tools.
|
||||
|
||||
=head1 PROPERTIES
|
||||
|
||||
=head2 format
|
||||
|
||||
Gives a hint as to the expected format.
|
||||
|
||||
=head2 gzip_cmd
|
||||
|
||||
The C<gzip> command, if available. C<undef> if not available.
|
||||
|
||||
=head2 bzip2_cmd
|
||||
|
||||
The C<bzip2> command, if available. C<undef> if not available.
|
||||
|
||||
=head2 xz_cmd
|
||||
|
||||
The C<xz> command, if available. C<undef> if not available.
|
||||
|
||||
=head2 tar_cmd
|
||||
|
||||
The C<tar> command, if available. C<undef> if not available.
|
||||
|
||||
=head2 unzip_cmd
|
||||
|
||||
The C<unzip> command, if available. C<undef> if not available.
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=head2 handles
|
||||
|
||||
Alien::Build::Plugin::Extract::CommandLine->handles($ext);
|
||||
$plugin->handles($ext);
|
||||
|
||||
Returns true if the plugin is able to handle the archive of the
|
||||
given format.
|
||||
|
||||
=head2 available
|
||||
|
||||
Alien::Build::Plugin::Extract::CommandLine->available($ext);
|
||||
|
||||
Returns true if the plugin is available to extract without
|
||||
installing anything new.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<Alien::Build::Plugin::Extract::Negotiate>, L<Alien::Build>, L<alienfile>, L<Alien::Build::MM>, L<Alien>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Author: Graham Ollis E<lt>plicease@cpan.orgE<gt>
|
||||
|
||||
Contributors:
|
||||
|
||||
Diab Jerius (DJERIUS)
|
||||
|
||||
Roy Storey (KIWIROY)
|
||||
|
||||
Ilya Pavlov
|
||||
|
||||
David Mertens (run4flat)
|
||||
|
||||
Mark Nunberg (mordy, mnunberg)
|
||||
|
||||
Christian Walde (Mithaldu)
|
||||
|
||||
Brian Wightman (MidLifeXis)
|
||||
|
||||
Zaki Mughal (zmughal)
|
||||
|
||||
mohawk (mohawk2, ETJ)
|
||||
|
||||
Vikas N Kumar (vikasnkumar)
|
||||
|
||||
Flavio Poletti (polettix)
|
||||
|
||||
Salvador Fandiño (salva)
|
||||
|
||||
Gianni Ceccarelli (dakkar)
|
||||
|
||||
Pavel Shaydo (zwon, trinitum)
|
||||
|
||||
Kang-min Liu (劉康民, gugod)
|
||||
|
||||
Nicholas Shipp (nshp)
|
||||
|
||||
Juan Julián Merelo Guervós (JJ)
|
||||
|
||||
Joel Berger (JBERGER)
|
||||
|
||||
Petr Pisar (ppisar)
|
||||
|
||||
Lance Wicks (LANCEW)
|
||||
|
||||
Ahmad Fatoum (a3f, ATHREEF)
|
||||
|
||||
José Joaquín Atria (JJATRIA)
|
||||
|
||||
Duke Leto (LETO)
|
||||
|
||||
Shoichi Kaji (SKAJI)
|
||||
|
||||
Shawn Laffan (SLAFFAN)
|
||||
|
||||
Paul Evans (leonerd, PEVANS)
|
||||
|
||||
Håkon Hægland (hakonhagland, HAKONH)
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
This software is copyright (c) 2011-2020 by Graham Ollis.
|
||||
|
||||
This is free software; you can redistribute it and/or modify it under
|
||||
the same terms as the Perl 5 programming language system itself.
|
||||
|
||||
=cut
|
||||
|
||||
__DATA__
|
||||
|
||||
[ xx.tar ]
|
||||
M>'@N='AT````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M`````````````#`P,#8T-"``,#`P-S8U(``P,#`P,C0@`#`P,#`P,#`P,#`S
|
||||
M(#$S-#,U,#0S-#(R(#`Q,C<P,P`@,```````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M``````````````````````````````````````````!U<W1A<@`P,&]L;&ES
|
||||
M9P``````````````````````````````````<W1A9F8`````````````````
|
||||
M```````````````````P,#`P,#`@`#`P,#`P,"``````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M``````````````````````!X>`H`````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
M````````````````````````````````````````````````````````````
|
||||
7````````````````````````````````
|
||||
|
||||
|
||||
[ xx.tar.Z ]
|
||||
M'YV0>/"XH(.'#H"#"!,J7,BPH<.'$"-*1`BCH@T:-$``J`CCAHT:&CG"D)%Q
|
||||
MH\B3,T#$F$%C1@T8+6G(D`$"1@P9-V#,`%!SHL^?0(,*!5!G#ITP<DR^8<,F
|
||||
MS9PS0Q<:#6/&3-2%)V&$/*GQJM>O8,.*'1I0P=BS:-.J7<NVK=NW<./*G4NW
|
||||
7KMV[>//JW<NWK]^_@`,+'DRXL.'#0P$`
|
||||
|
||||
|
||||
[ xx.tar.bz2 ]
|
||||
M0EIH.3%!629365(,+ID``$A[D-$0`8!``7^``!!AI)Y`!```""``=!JGIBC3
|
||||
M30&CU`]($HHTTR:`>D#0)SI*Z'R%H*J"&3@H]P@J>U$F5BMHOC`$L-"8C!(V
|
||||
I"`'?*WA:(9*4U)@4)+"(V%.G]#W(_E6B'J8G]D`/Q=R13A0D%(,+ID``
|
||||
|
||||
|
||||
[ xx.tar.gz ]
|
||||
M'XL("!)'=%P``WAX+G1A<@"KJ-`KJ2AAH"DP,#`P,S%1`-'F9J9@VL`(PH<"
|
||||
M8P5#8Q-C4P,38Q,C(P4#0R-S`V,&!0/:.@L"2HM+$HN`3LG/R<DL3L>M#J@L
|
||||
E+0V/.1"/*,#I(0(J*K@&V@FC8!2,@E$P"@8````U:,3F``@`````
|
||||
|
||||
|
||||
[ xx.tar.xz ]
|
||||
M_3=Z6%H```3FUK1&`@`A`18```!T+^6CX`?_`&!=`#Q@M.AX.4O&N38V648.
|
||||
M[J6L\\<_[3M*R;CASOTX?B.F\V:^)+G;\YY4"!4MLF9`*\N40G=O+K,J0"NF
|
||||
M0VU7J%NN(A,R^DM8@/(_YGR5CAO+1CS_YNHE:,1!G%6L1\GT``"[$^?"O*"!
|
||||
9`P`!?(`0````:OY*7K'$9_L"``````196@``
|
||||
|
||||
|
||||
[ xx.zip ]
|
||||
M4$L#!`H``````%5V64X:^I"B`P````,````&`!P`>'@N='AT550)``,21W1<
|
||||
M$D=T7'5X"P`!!/4!```$%````'AX"E!+`0(>`PH``````%5V64X:^I"B`P``
|
||||
M``,````&`!@```````$```"D@0````!X>"YT>'155`4``Q)'=%QU>`L``03U
|
||||
>`0``!!0```!02P4&``````$``0!,````0P``````
|
||||
|
||||
|
||||
181
database/perl/vendor/lib/Alien/Build/Plugin/Extract/Directory.pm
vendored
Normal file
181
database/perl/vendor/lib/Alien/Build/Plugin/Extract/Directory.pm
vendored
Normal file
@@ -0,0 +1,181 @@
|
||||
package Alien::Build::Plugin::Extract::Directory;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use 5.008004;
|
||||
use Alien::Build::Plugin;
|
||||
use Alien::Build::Util qw( _mirror );
|
||||
use Path::Tiny ();
|
||||
|
||||
# ABSTRACT: Plugin to extract a downloaded directory to a build directory
|
||||
our $VERSION = '2.38'; # VERSION
|
||||
|
||||
|
||||
has '+format' => 'd';
|
||||
|
||||
|
||||
sub handles
|
||||
{
|
||||
my(undef, $ext) = @_;
|
||||
$ext eq 'd' ? 1 : ();
|
||||
}
|
||||
|
||||
|
||||
sub available
|
||||
{
|
||||
my(undef, $ext) = @_;
|
||||
__PACKAGE__->handles($ext);
|
||||
}
|
||||
|
||||
sub init
|
||||
{
|
||||
my($self, $meta) = @_;
|
||||
|
||||
$meta->register_hook(
|
||||
extract => sub {
|
||||
my($build, $src) = @_;
|
||||
|
||||
die "not a directory: $src" unless -d $src;
|
||||
|
||||
if($build->meta_prop->{out_of_source})
|
||||
{
|
||||
$build->install_prop->{extract} = Path::Tiny->new($src)->absolute->stringify;
|
||||
}
|
||||
else
|
||||
{
|
||||
my $dst = Path::Tiny->new('.')->absolute;
|
||||
# Please note: _mirror and Alien::Build::Util are ONLY
|
||||
# allowed to be used by core plugins. If you are writing
|
||||
# a non-core plugin it may be removed. That is why it
|
||||
# is private.
|
||||
_mirror $src => $dst, { verbose => 1 };
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
=encoding UTF-8
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Alien::Build::Plugin::Extract::Directory - Plugin to extract a downloaded directory to a build directory
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
version 2.38
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use alienfile;
|
||||
plugin 'Extract::Directory';
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Some Download or Fetch plugins may produce a directory instead of an archive
|
||||
file. This plugin is used to mirror the directory from the Download step
|
||||
into a fresh directory in the Extract step. An example of when you might use
|
||||
this plugin is if you were using the C<git> command in the Download step,
|
||||
which results in a directory hierarchy.
|
||||
|
||||
=head1 PROPERTIES
|
||||
|
||||
=head2 format
|
||||
|
||||
Should always set to C<d> (for directories).
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=head2 handles
|
||||
|
||||
Alien::Build::Plugin::Extract::Directory->handles($ext);
|
||||
$plugin->handles($ext);
|
||||
|
||||
Returns true if the plugin is able to handle the archive of the
|
||||
given format. Only returns true for C<d> (for directory).
|
||||
|
||||
=head2 available
|
||||
|
||||
Alien::Build::Plugin::Extract::Directory->available($ext);
|
||||
$plugin->available($ext);
|
||||
|
||||
Returns true if the plugin can extract the given format with
|
||||
what is already installed.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<Alien::Build::Plugin::Extract::Negotiate>, L<Alien::Build>, L<alienfile>, L<Alien::Build::MM>, L<Alien>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Author: Graham Ollis E<lt>plicease@cpan.orgE<gt>
|
||||
|
||||
Contributors:
|
||||
|
||||
Diab Jerius (DJERIUS)
|
||||
|
||||
Roy Storey (KIWIROY)
|
||||
|
||||
Ilya Pavlov
|
||||
|
||||
David Mertens (run4flat)
|
||||
|
||||
Mark Nunberg (mordy, mnunberg)
|
||||
|
||||
Christian Walde (Mithaldu)
|
||||
|
||||
Brian Wightman (MidLifeXis)
|
||||
|
||||
Zaki Mughal (zmughal)
|
||||
|
||||
mohawk (mohawk2, ETJ)
|
||||
|
||||
Vikas N Kumar (vikasnkumar)
|
||||
|
||||
Flavio Poletti (polettix)
|
||||
|
||||
Salvador Fandiño (salva)
|
||||
|
||||
Gianni Ceccarelli (dakkar)
|
||||
|
||||
Pavel Shaydo (zwon, trinitum)
|
||||
|
||||
Kang-min Liu (劉康民, gugod)
|
||||
|
||||
Nicholas Shipp (nshp)
|
||||
|
||||
Juan Julián Merelo Guervós (JJ)
|
||||
|
||||
Joel Berger (JBERGER)
|
||||
|
||||
Petr Pisar (ppisar)
|
||||
|
||||
Lance Wicks (LANCEW)
|
||||
|
||||
Ahmad Fatoum (a3f, ATHREEF)
|
||||
|
||||
José Joaquín Atria (JJATRIA)
|
||||
|
||||
Duke Leto (LETO)
|
||||
|
||||
Shoichi Kaji (SKAJI)
|
||||
|
||||
Shawn Laffan (SLAFFAN)
|
||||
|
||||
Paul Evans (leonerd, PEVANS)
|
||||
|
||||
Håkon Hægland (hakonhagland, HAKONH)
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
This software is copyright (c) 2011-2020 by Graham Ollis.
|
||||
|
||||
This is free software; you can redistribute it and/or modify it under
|
||||
the same terms as the Perl 5 programming language system itself.
|
||||
|
||||
=cut
|
||||
194
database/perl/vendor/lib/Alien/Build/Plugin/Extract/Negotiate.pm
vendored
Normal file
194
database/perl/vendor/lib/Alien/Build/Plugin/Extract/Negotiate.pm
vendored
Normal file
@@ -0,0 +1,194 @@
|
||||
package Alien::Build::Plugin::Extract::Negotiate;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use 5.008004;
|
||||
use Alien::Build::Plugin;
|
||||
use Alien::Build::Plugin::Extract::ArchiveTar;
|
||||
use Alien::Build::Plugin::Extract::ArchiveZip;
|
||||
use Alien::Build::Plugin::Extract::CommandLine;
|
||||
use Alien::Build::Plugin::Extract::Directory;
|
||||
|
||||
# ABSTRACT: Extraction negotiation plugin
|
||||
our $VERSION = '2.38'; # VERSION
|
||||
|
||||
|
||||
has '+format' => 'tar';
|
||||
|
||||
sub init
|
||||
{
|
||||
my($self, $meta) = @_;
|
||||
|
||||
my $format = $self->format;
|
||||
$format = 'tar.gz' if $format eq 'tgz';
|
||||
$format = 'tar.bz2' if $format eq 'tbz';
|
||||
$format = 'tar.xz' if $format eq 'txz';
|
||||
|
||||
my $plugin = $self->pick($format);
|
||||
$meta->apply_plugin($plugin, format => $format);
|
||||
$self;
|
||||
}
|
||||
|
||||
|
||||
sub pick
|
||||
{
|
||||
my(undef, $format) = @_;
|
||||
|
||||
if($format =~ /^tar(\.(gz|bz2))?$/)
|
||||
{
|
||||
if(Alien::Build::Plugin::Extract::ArchiveTar->available($format))
|
||||
{
|
||||
return 'Extract::ArchiveTar';
|
||||
}
|
||||
else
|
||||
{
|
||||
return 'Extract::CommandLine';
|
||||
}
|
||||
}
|
||||
elsif($format eq 'zip')
|
||||
{
|
||||
# Archive::Zip is not that reliable. But if it is already installed it is probably working
|
||||
if(Alien::Build::Plugin::Extract::ArchiveZip->available($format))
|
||||
{
|
||||
return 'Extract::ArchiveZip';
|
||||
}
|
||||
|
||||
# If it isn't available, then use the command-line unzip. Alien::unzip will be used
|
||||
# as necessary in environments where it isn't already installed.
|
||||
else
|
||||
{
|
||||
return 'Extract::CommandLine';
|
||||
}
|
||||
}
|
||||
elsif($format eq 'tar.xz' || $format eq 'tar.Z')
|
||||
{
|
||||
return 'Extract::CommandLine';
|
||||
}
|
||||
elsif($format eq 'd')
|
||||
{
|
||||
return 'Extract::Directory';
|
||||
}
|
||||
else
|
||||
{
|
||||
die "do not know how to handle format: $format";
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=pod
|
||||
|
||||
=encoding UTF-8
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Alien::Build::Plugin::Extract::Negotiate - Extraction negotiation plugin
|
||||
|
||||
=head1 VERSION
|
||||
|
||||
version 2.38
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use alienfile;
|
||||
plugin 'Extract' => (
|
||||
format => 'tar.gz',
|
||||
);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This is a negotiator plugin for extracting packages downloaded from the internet.
|
||||
This plugin picks the best Extract plugin to do the actual work. Which plugins are
|
||||
picked depend on the properties you specify, your platform and environment. It is
|
||||
usually preferable to use a negotiator plugin rather than using a specific Extract
|
||||
Plugin from your L<alienfile>.
|
||||
|
||||
=head1 PROPERTIES
|
||||
|
||||
=head2 format
|
||||
|
||||
The expected format for the download. Possible values include:
|
||||
C<tar>, C<tar.gz>, C<tar.bz2>, C<tar.xz>, C<zip>, C<d>.
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
=head2 pick
|
||||
|
||||
my $name = Alien::Build::Plugin::Extract::Negotiate->pick($format);
|
||||
|
||||
Returns the name of the best plugin for the given format.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<Alien::Build>, L<alienfile>, L<Alien::Build::MM>, L<Alien>
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Author: Graham Ollis E<lt>plicease@cpan.orgE<gt>
|
||||
|
||||
Contributors:
|
||||
|
||||
Diab Jerius (DJERIUS)
|
||||
|
||||
Roy Storey (KIWIROY)
|
||||
|
||||
Ilya Pavlov
|
||||
|
||||
David Mertens (run4flat)
|
||||
|
||||
Mark Nunberg (mordy, mnunberg)
|
||||
|
||||
Christian Walde (Mithaldu)
|
||||
|
||||
Brian Wightman (MidLifeXis)
|
||||
|
||||
Zaki Mughal (zmughal)
|
||||
|
||||
mohawk (mohawk2, ETJ)
|
||||
|
||||
Vikas N Kumar (vikasnkumar)
|
||||
|
||||
Flavio Poletti (polettix)
|
||||
|
||||
Salvador Fandiño (salva)
|
||||
|
||||
Gianni Ceccarelli (dakkar)
|
||||
|
||||
Pavel Shaydo (zwon, trinitum)
|
||||
|
||||
Kang-min Liu (劉康民, gugod)
|
||||
|
||||
Nicholas Shipp (nshp)
|
||||
|
||||
Juan Julián Merelo Guervós (JJ)
|
||||
|
||||
Joel Berger (JBERGER)
|
||||
|
||||
Petr Pisar (ppisar)
|
||||
|
||||
Lance Wicks (LANCEW)
|
||||
|
||||
Ahmad Fatoum (a3f, ATHREEF)
|
||||
|
||||
José Joaquín Atria (JJATRIA)
|
||||
|
||||
Duke Leto (LETO)
|
||||
|
||||
Shoichi Kaji (SKAJI)
|
||||
|
||||
Shawn Laffan (SLAFFAN)
|
||||
|
||||
Paul Evans (leonerd, PEVANS)
|
||||
|
||||
Håkon Hægland (hakonhagland, HAKONH)
|
||||
|
||||
=head1 COPYRIGHT AND LICENSE
|
||||
|
||||
This software is copyright (c) 2011-2020 by Graham Ollis.
|
||||
|
||||
This is free software; you can redistribute it and/or modify it under
|
||||
the same terms as the Perl 5 programming language system itself.
|
||||
|
||||
=cut
|
||||
Reference in New Issue
Block a user