ADAMK-Release
view release on metacpan or search on metacpan
lib/ADAMK/Release.pm view on Meta::CPAN
######################################################################
# Constructor
sub new {
my $self = shift->SUPER::new(@_);
# Check module
unless ( _CLASS($self->module) ) {
$self->error("Missing or invalid module");
}
# Inflate and check the github object
if ( Params::Util::_HASH($self->github) ) {
$self->{github} = GitHub::Extract->new( %{$self->github} );
}
unless ( Params::Util::_INSTANCE($self->github, 'GitHub::Extract')) {
$self->error("Missing or invalid GitHub specification");
}
# Release options
$self->{release} = !!$self->{release};
# Find all of the command line tools
foreach my $tool ( TOOLS ) {
$self->{ "bin_" . $tool } = $self->which($tool);
}
return $self;
}
######################################################################
# Command Methods
sub run {
my $self = shift;
# Export from GitHub and change to the directory
my $pushd = $self->github->pushd;
unless ( $pushd ) {
$self->error(
"Failed to download and extract %s: %s",
$self->github->url,
$self->github->error,
);
}
# This is total bulldozer coding, there is no reason whatsoever why
# this stuff should be in seperate methods except that it provides
# a little cleaner logical breakup, and maybe I want to subclass this
# someday or something.
$self->validate;
$self->assemble;
$self->build;
# Release the distribution
$self->upload if $self->release;
return;
}
sub validate {
my $self = shift;
unless ( $self->dist_version ) {
$self->error("Failed to find version number in main module");
}
unless ( $self->makefile_pl or $self->build_pl ) {
$self->error("Failed to find Makefile.PL or Build.PL");
}
return;
}
sub assemble {
my $self = shift;
# Create MANIFEST.SKIP
if ( -f $self->dist_manifest_add ) {
$self->shell(
$self->bin_cat,
$self->shared_manifest_skip,
$self->dist_manifest_add,
'>',
$self->dist_manifest_skip,
"Failed to merge common MANIFEST.SKIP with extra one",
);
} elsif ( not -f $self->dist_manifest ) {
$self->copy( $self->shared_manifest_skip => $self->dist_manifest_skip );
}
# Apply a default LICENSE file
unless ( -f $self->dist_license ) {
$self->copy( $self->shared_license => $self->dist_license );
}
# Add ppport.h if any XS files use it
if ( $self->find_ppport->in( $self->dist_dir ) ) {
Devel::PPPort::WriteFile( $self->dist_ppport );
}
# Copy in author tests as needed
unless ( -f $self->dist_99_author ) {
foreach my $xt ( qw{ pod.t pmv.t } ) {
next if -f catfile( $self->dist_xt, $xt );
$self->copy(
catfile( $self->shared_dir, $xt ),
catfile( $self->dist_xt, $xt ),
);
}
}
# Create the README file
unless ( -f $self->dist_readme ) {
my $dist_readme = $self->dist_readme;
my $module_pod = -f $self->module_pod ? $self->module_pod : $self->module_pm;
lib/ADAMK/Release.pm view on Meta::CPAN
}
return;
}
sub build_makefile_manifest {
my $self = shift;
$self->shell(
$self->bin_make,
"manifest",
"Error while creating the MANIFEST",
);
}
sub build_realclean {
my $self = shift;
# Clean up the distribution (always with root)
$self->sudo(
$self->bin_make,
"realclean",
'sudo make clean failed',
);
$self->remove( $self->dist_manifest );
}
sub build_perl {
my $self = shift;
# Create the Build file
$self->shell(
qw{ perl Build.PL },
'Error while creating Makefile',
);
# Create the MANIFEST file
$self->shell(
"./Build",
"manifest",
'Error while creating the MANIFEST',
);
unless ( $self->no_test ) {
# Test the distribution normally
$self->shell(
qw{ ./Build disttest },
'disttest failed',
);
}
# Build the tardist
$self->shell(
qw{ ./Build dist },
'Error making distribution tarball',
);
return;
}
sub upload {
my $self = shift;
my $pauseid = $self->prompt("PAUSEID:");
unless (_STRING($pauseid) and $pauseid =~ /^[A-Z]{3,}$/) {
$self->error("Missing or invalid PAUSEID");
}
my $password = $self->password("Password:");
unless (_STRING($password) and $password =~ /^\S{5,}$/) {
$self->error("Missing or invalid CPAN password");
}
# Execute the upload to CPAN
CPAN::Uploader->upload_file( $self->dist_tardist, {
user => $pauseid,
password => $password,
});
}
######################################################################
# Content and Scanning Methods
# Get the main github repository url for this release
sub dist_resource_repository {
my $self = shift;
return join( '',
"https://github.com/",
$self->github->username,
$self->github->repository,
'.git',
);
}
sub makefile_pl {
my $self = shift;
unless ( defined $self->{makefile_pl} ) {
my $file = $self->dist_makefile_pl;
return undef unless -f $file;
$self->{makefile_pl} = File::Slurp::read_file($file);
}
return $self->{makefile_pl};
}
sub build_pl {
my $self = shift;
unless ( defined $self->{build_pl} ) {
my $file = $self->dist_build_pl;
return undef unless -f $file;
$self->{build_pl} = File::Slurp::read_file($file);
}
return $self->{build_pl};
}
sub module_doc {
my $self = shift;
unless ( exists $self->{module_doc} ) {
if ( -f $self->module_pod ) {
$self->{module_doc} = $self->module_pod;
} else {
$self->{module_doc} = $self->module_pm;
}
}
return $self->{module_doc};
}
sub module_version {
my $self = shift;
unless ( $self->{module_version} ) {
my $file = $self->module_pm;
( run in 0.947 second using v1.01-cache-2.11-cpan-b16cb0d3907 )