view release on metacpan or search on metacpan
bin/fetchware view on Meta::CPAN
use File::Path qw(make_path remove_tree);
use Term::UI;
use Term::ReadLine;
use Perl::OSType 'is_os_type';
use File::HomeDir;
use File::Find 'find';
use File::Temp 'tempfile';
use Fcntl qw(SEEK_SET);
use Path::Class;
use Text::Wrap 'wrap';
use Data::Dumper;
use Fcntl ':flock';
use IO::Uncompress::Gunzip qw(gunzip $GunzipError);
use Sub::Mage;
use URI::Split qw(uri_split uri_join);
use Scalar::Util 'blessed';
use Module::Load 'load';
# Setup exports, which are only meant to ease testing.
use Exporter 'import';
our %EXPORT_TAGS = (
Term::UI = 0
; File::Homedir 0.93+ is needed for my_dist_data() method.
File::HomeDir = 0.93
HTTP::Tiny = 0
HTML::TreeBuilder = 0
Digest::SHA = 0
Digest::MD5 = 0
; Installs ok on Windows, but doesn't do much.
; Fetchware only uses it on Unix.
Privileges::Drop = 0
; Not counting core modules such as File::Spec, Text::Wrap, Data::Dumper,
; File::Find, Net::FTP, Fcntl, File::Path, File::Copy, and perhaps others.
Text::ParseWords = 0
Sub::Mage = 0
; Test::Deep is *only* used during testing, so say so.
[Prereqs / TestRequires]
Test::Deep = 0
; Test::Expect is also only used during testing, but I don't want it "required
; for testing, only used if it is already made available for testing. That's why
; its commented out below, because I want it documented here, but I don't
lib/App/Fetchware.pm view on Meta::CPAN
# ABSTRACT: App::Fetchware is Fetchware's API used to make extensions.
###BUGALERT### Uses die instead of croak. croak is the preferred way of throwing
#exceptions in modules. croak says that the caller was the one who caused the
#error not the specific code that actually threw the error.
use strict;
use warnings;
# CPAN modules making Fetchwarefile better.
use File::Spec::Functions qw(catfile splitpath splitdir file_name_is_absolute);
use Path::Class;
use Data::Dumper;
use File::Copy 'cp';
use HTML::TreeBuilder;
use Scalar::Util qw(blessed looks_like_number);
use Digest::SHA;
use Digest::MD5;
#use Crypt::OpenPGP::KeyRing;
#use Crypt::OpenPGP;
use Archive::Tar;
use Archive::Zip qw(:ERROR_CODES :CONSTANTS);
use Cwd 'cwd';
lib/App/Fetchware.pm view on Meta::CPAN
use App::Fetchware qw(
:OVERRIDE_LOOKUP
:OVERRIDE_DOWNLOAD
:OVERRIDE_VERIFY
:DEFAULT
);
use App::Fetchware::Util ':UTIL';
use HTML::TreeBuilder;
use URI::Split qw(uri_split uri_join);
use Data::Dumper;
use HTTP::Tiny;
program 'php';
lookup_url 'http://us1.php.net/downloads.php';
mirror 'http://us1.php.net';
mirror 'http://us2.php.net';
mirror 'http://www.php.net';
# php does *not* use a standard http or ftp mirrors for downloads. Instead, it
lib/App/Fetchware/Config.pm view on Meta::CPAN
#exceptions in modules. croak says that the caller was the one who caused the
#error not the specific code that actually threw the error.
use strict;
use warnings;
# Enable Perl 6 knockoffs, and use 5.10.1, because smartmatching and other
# things in 5.10 were changed in 5.10.1+.
use 5.010001;
use Carp 'carp';
use Data::Dumper;
# Set up Exporter to bring App::Fetchware's API to everyone who use's it
# including fetchware's ability to let you rip into its guts, and customize it
# as you need.
use Exporter qw( import );
# By default fetchware exports its configuration file like subroutines and
# fetchware().
#
lib/App/Fetchware/Config.pm view on Meta::CPAN
__clear_CONFIG();
Clears the %CONFIG globalish variable. Meant more for use in testing, then for
use in Fetchware itself, or in Fetchware extensions.
=head2 debug_CONFIG()
debug_CONFIG();
Data::Dumper::Dumper()'s %CONFIG and prints it.
=head1 ERRORS
As with the rest of App::Fetchware, App::Fetchware::Config does not return any
error codes; instead, all errors are die()'d if it's App::Fetchware::Config's
error, or croak()'d if its the caller's fault.
=head1 BUGS
App::Fetchware::Config's represenation of your Fetchwarefile is per process. If
lib/App/Fetchware/Util.pm view on Meta::CPAN
use File::Copy 'cp';
use File::Temp 'tempdir';
use File::stat;
use Fcntl qw(S_ISDIR :flock S_IMODE);
# Privileges::Drop only works on Unix, so only load it on Unix.
use if is_os_type('Unix'), 'Privileges::Drop';
use POSIX '_exit';
use Sub::Mage;
use URI::Split qw(uri_split uri_join);
use Text::ParseWords 'quotewords';
use Data::Dumper;
# Enable Perl 6 knockoffs, and use 5.10.1, because smartmatching and other
# things in 5.10 were changed in 5.10.1+.
use 5.010001;
# Set up Exporter to bring App::Fetchware::Util's API to everyone who use's it.
use Exporter qw( import );
our %EXPORT_TAGS = (
UTIL => [qw(
lib/App/Fetchware/Util.pm view on Meta::CPAN
###BUGALERT### Also, if you use request instead, and get chunks of bytes
#instead of just writing them to disk, you could also use a
#Term::ProgressBar to print a cool progress bar during the download!
#This could also be added to the ftp downloaders too, but probably not the
#local file:// downloaders though.
my $response = $http->get($http_url);
die <<EOD unless $response->{success};
App-Fetchware: run-time error. HTTP::Tiny failed to download a directory listing
of your provided lookup_url. HTTP status code [$response->{status} $response->{reason}]
HTTP headers [@{[Data::Dumper::Dumper($response)]}].
See man App::Fetchware.
EOD
while (my ($k, $v) = each %{$response->{headers}}) {
for (ref $v eq 'ARRAY' ? @$v : $v) {
}
}
die <<EOD unless length $response->{content};
App-Fetchware: run-time error. The lookup_url you provided downloaded nothing.
HTTP status code [$response->{status} $response->{reason}]
HTTP headers [@{[Data::Dumper::Dumper($response)]}].
See man App::Fetchware.
EOD
return $response->{content};
}
sub file_download_dirlist {
my $local_lookup_url = shift;
lib/App/Fetchware/Util.pm view on Meta::CPAN
## Should be commented out to avoid borking the terminal, but is needed when
## HTTP::Tiny has internal 599 errors, because the error message is in the
## content.
##diag explain $response->{content};
#diag("]");
die <<EOD unless $response->{success};
App-Fetchware: run-time error. HTTP::Tiny failed to download a file or directory
listingfrom your provided url [$http_url]. HTTP status code
[$response->{status} $response->{reason}] HTTP headers
[@{[Data::Dumper::Dumper($response->{headers})]}].
See man App::Fetchware.
EOD
# In this case the content is binary, so it will mess up your terminal.
#diag($response->{content}) if length $response->{content};
die <<EOD unless length $response->{content};
App-Fetchware: run-time error. The url [$http_url] you provided downloaded
nothing. HTTP status code [$response->{status} $response->{reason}]
HTTP headers [@{[Data::Dumper::Dumper($response)]}].
See man App::Fetchware.
EOD
# Must convert the worthless $response->{content} variable into a real file
# on the filesystem. Note: start() should have cd()d us into a suitable
# tempdir.
my $path = $http_url;
$path =~ s!^http://!!;
# Determine filename from the $path.
my ($volume, $directories, $filename) = splitpath($path);
lib/App/FetchwareX/HTMLPageSync.pm view on Meta::CPAN
:OVERRIDE_NEW
:OVERRIDE_NEW_INSTALL
:OVERRIDE_CHECK_SYNTAX
);
# Local imports.
use File::Copy 'cp';
use File::Path 'remove_tree';
use URI::Split 'uri_split';
use File::Spec 'splitpath';
use Data::Dumper;
use Scalar::Util 'blessed';
# Use App::Fetchware::ExportAPI to specify which App::Fetchware API subroutines
# we are going to "KEEP", import from App::Fetchware, and which API subs we are
# going to "OVERRRIDE", implemente here in this package.
#
# ExportAPI takes care of the grunt work for us by setting our packages @EXPORT
# appropriatly, and even importing Exporter's import() method into our package
# for us, so that our App::Fetchware API subroutines and configuration options
# specified below can be import()ed properly.
t/App-Fetchware-Util.t view on Meta::CPAN
'checked http_download_dirlist() success');
eval_ok(sub {http_download_dirlist('http://meanttofail.fake/gonna/fail');},
qr/.*?HTTP::Tiny failed to download.*?/,
'checked http_download_dirlist() download failure');
##HOWTOTEST## eval_ok(sub {http_download_dirlist('whatshouldthisbe??????');,
##HOWTOTEST## <<EOS, 'checked http_download_dirlist() empty content failure');
##HOWTOTEST##App-Fetchware: run-time error. The lookup_url you provided downloaded nothing.
##HOWTOTEST##HTTP status code [$response->{status} $response->{reason}]
##HOWTOTEST##HTTP headers [@{[Data::Dumper::Dumper($response)]}].
##HOWTOTEST##See man App::Fetchware.
##HOWTOTEST##EOS
};
subtest 'test file_download_dirlist()' => sub {
# Test file_download_dirlist()'s Exceptions.
eval_ok(sub {file_download_dirlist('/akdjf983hfo3e4gghj-doesnotexist')},
t/bin-fetchware-Fetchwarefile.t view on Meta::CPAN
my $php_fetchwarefile = <<'EOF';
use App::Fetchware qw(
:OVERRIDE_LOOKUP
:OVERRIDE_DOWNLOAD
:OVERRIDE_VERIFY
:DEFAULT
);
use App::Fetchware::Util ':UTIL';
use HTML::TreeBuilder;
use URI::Split qw(uri_split uri_join);
use Data::Dumper;
use HTTP::Tiny;
program 'php';
lookup_url 'http://us1.php.net/downloads.php';
mirror 'http://us1.php.net';
mirror 'http://us2.php.net';
mirror 'http://www.php.net';
# php does *not* use a standard http or ftp mirrors for downloads. Instead, it
t/bin-fetchware-Fetchwarefile.t view on Meta::CPAN
php.Fetchwarefile: A path should be found in this link [$link], but there is no
path it in. No href [$h->{href}].
EOD
}
# Find and save the $md5sum for the verify hook below.
# It should be 3 elements over, so it should be the third index
# in the @right array below (remember to start counting 2 0.).
my @right = $h->right();
# Left for the next time the page annoyingly, arbitrarily changes :)
#local $Data::Dumper::Maxdepth = 3; # Only show 3 "levels" of crap.
#use Test::More;
#diag("RIGHT[");
#for my $i (0..$#right) {
# diag("TAG#[$i]");
# diag explain \@right;
# diag("ENDTAG#[$i]");
#}
#diag("]");
my $md5_span_tag = $right[5];
$md5sum = $md5_span_tag->as_text();
t/bin-fetchware-Fetchwarefile.t view on Meta::CPAN
'Checked MariaDB Fetchwarefile success.');
};
subtest 'test PostgreSQL Fetchwarefile success' => sub {
my $postgresql_fetchwarefile = <<'EOF';
use App::Fetchware qw(:DEFAULT :OVERRIDE_LOOKUP);
use App::Fetchware::Util ':UTIL';
use Data::Dumper 'Dumper';
use HTML::TreeBuilder;
program 'postgres';
# The Postgres file browser URL lists the available versions of Postgres.
lookup_url 'http://www.postgresql.org/ftp/source/';
# Mirror URL where the file browser links to download them from.
my $mirror = 'http://ftp.postgresql.org';