Dancer2
view release on metacpan or search on metacpan
lib/Dancer2/CLI/Gen.pm view on Meta::CPAN
my ( $self, $from, $to ) = @_;
$from =~ s{/+$}{};
my @result;
my $iter = path( $from )->iterator({ recurse => 1 });
while( my $file = $iter->() ) {
warn "File not found: $file" unless $file->exists; # Paranoia
next if $file->basename =~ m{^\.git(/|$)};
next if $file->is_dir;
my $filename = $file->relative( $from );
push @result, [ $file, path( $to, $filename )];
}
return \@result;
}
sub _copy_templates {
my ( $self, $files, $vars, $overwrite ) = @_;
my $app_name = $vars->{ appname };
foreach my $pair (@$files) {
my ( $from, $to ) = @{$pair};
next if $self->no_package_files && $from =~ /MANIFEST\.SKIP$/;
next if $self->no_package_files && $from =~ /Makefile.PL$/;
if ( -f $to && !$overwrite ) {
print "! $to exists, overwrite? (or rerun this command with -o) [N/y/a]: ";
my $res = <STDIN>; chomp($res);
$overwrite = 1 if $res eq 'a';
next unless ( $res eq 'y' ) or ( $res eq 'a' );
}
$to =~ s/AppFile/$app_name/;
my $to_dir = path( $to )->parent;
if ( ! $to_dir->is_dir ) {
print "+ $to_dir\n";
$to_dir->mkpath;
}
# Skeleton files whose names are prefixed with + need to be executable, but we must strip
# that from the name when copying them
my $to_file = path( $to )->basename;
my $ex = ( $to_file =~ s/^\+// );
$to = path( $to_dir, $to_file ) if $ex;
print "+ $to\n";
my $content;
{
local $/;
open( my $fh, '<:raw', $from ) or die "unable to open file `$from' for reading: $!";
$content = <$fh>;
close $fh;
}
if( $from !~ m/\.(db|ico|jpg|png|css|eot|map|swp|ttf|svg|woff|woff2|js)$/ ) {
$content = $self->_process_template($content, $vars);
}
path( $to )->spew_raw( $content );
if( $ex ) {
$to->chmod( 0755 ) or warn "unable to change permissions for $to: $!";
}
}
}
sub _create_manifest {
my ( $self, $files, $dir ) = @_;
my $manifest_name = path( $dir, 'MANIFEST' );
open( my $manifest, '>', $manifest_name ) or die $!;
print $manifest "MANIFEST\n";
foreach my $file( @{ $files } ) {
my $filename = path( $file->[1] )->relative( $dir );
my $basename = $filename->basename;
my $clean_basename = $basename;
$clean_basename =~ s/^\+//;
$filename =~ s/\Q$basename\E/$clean_basename/;
print {$manifest} "$filename\n";
}
close $manifest;
}
sub _add_to_manifest_skip {
my ( $self, $dir ) = @_;
my $filename = path( $dir, 'MANIFEST.SKIP' );
open my $fh, '>>', $filename or die $!;
print {$fh} "^$dir-\n";
close $fh;
}
sub _process_template {
my ( $self, $template, $tokens ) = @_;
return $self->_engine->render( \$template, $tokens );
}
sub _version_check {
my $self = shift;
my $version = $self->parent_command->_dancer2_version;
return if $version =~ m/_/;
my $latest_version = 0;
my $resp = HTTP::Tiny->new( timeout => 5 )->get( 'https://fastapi.metacpan.org/release/Dancer2' );
if( $resp->{ success } && decode_json( $resp->{ content } )->{ version } =~ /(\d\.\d+)/ ) {
$latest_version = $1;
if ($latest_version gt $version) {
print qq{
The latest stable Dancer2 release is $latest_version. You are currently using $version.
Please check https://metacpan.org/pod/Dancer2/ for updates.
};
}
} else {
warn "\nCouldn't determine latest version of Dancer2. Please check your internet
connection, or pass -x to gen to bypass this check in the future.\n\n";
}
}
( run in 1.421 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )