/usr/local/CPAN/ShipIt/ShipIt/ProjectType/AutoConf.pm
package ShipIt::ProjectType::AutoConf;
use strict;
use base 'ShipIt::ProjectType';
use ShipIt::Util qw(slurp write_file tempdir_obj);
use File::Copy ();
use Cwd;
# factory when called directly.
# returns undef if not a perl project, otherwise returns
# ::MakeMaker or ::ModuleBuild instance.
sub new {
my ($class) = @_;
return undef unless -e "configure.ac";
my $self = $class->SUPER::new;
return $self;
}
sub current_version {
my ($self) = @_;
my $conf = slurp("configure.ac");
die "No AC_INIT found" unless
$conf =~ /^AC_INIT\((.+?), (\S+?), .+\)/m;
$self->{projname} = $1;
$self->{projver} = $2;
return $2;
}
sub update_version {
my ($self, $newver) = @_;
my $conf = slurp("configure.ac");
$conf =~ s/^AC_INIT\((.+?), (\S+?), (.+)\)/AC_INIT($1, $newver, $3)/m
or die "update_version regpexp failed";
write_file("configure.ac", $conf);
}
sub makedist {
my $self = shift;
my $distfile = $self->_build_tempdist;
return $distfile;
}
sub disttest {
my ($self) = @_;
my $distfile = $self->_build_tempdist;
# debug,
my $size = -s $distfile;
warn "distfile = $distfile (size = $size)\n";
my ($basename) = $distfile =~ m!([^/]+)$! or die;
my $testdir_o = tempdir_obj();
my $testdir = $testdir_o->directory;
File::Copy::copy($distfile, $testdir)
or die "Copy from $distfile to $testdir failed: $!\n";
my $old_cwd = getcwd;
warn "Changing to tempdir $testdir for make/make test...\n";
chdir($testdir) or die "chdir to testdir $testdir failed";
system("tar -zxvf $basename") and die "untar failed";
my ($untardir) = $basename =~ m!^(.+)\.tar\.gz$! or die;
die "Expected untarred dir $untardir, but not there" unless -d $untardir;
chdir($untardir) or die;
system("./configure") and die "configure during test failed";
system("make") and die "make during test failed";
system("make", "test") and die "make test failed";
# restore old working directory
chdir($old_cwd) or die;
return 1;
}
sub _build_tempdist {
my $self = shift;
my $projname = $self->{projname} or die "no projname found?";
my $projver = $self->{projver} or die "no projver found?";
my $distfile = "$projname-$projver.tar.gz";
# did we already build it for a DistTest step earlier?
if (my $tdir = $self->{dist_tempdirobj}) {
my $file = $tdir->directory . "/$distfile";
return $file if -e $file;
}
die "Distfile $distfile already exists" if -e $distfile;
if (-e "Makefile") {
system("make", "distclean") and die "Distclean failed";
}
if (-x "autogen.sh") {
system("./autogen.sh") and die "autogen.sh failed";
}
system("./configure") and die "configure failed";
system("make", "dist") and die "make dist failed";
die "Distfile $distfile doesn't exist" unless -e $distfile;
# throw object in $self, so it doesn't get rmtree'd until
# $self goes out of scope, later.
my $tdir = $self->{dist_tempdirobj} = tempdir_obj();
File::Copy::move($distfile, $tdir->directory) or
die "Failed to move dist $distfile to tempdir";
return $tdir->directory . "/$distfile";
}
1;