Dist-Zilla-Plugin-Subversion-NextVersion

 view release on metacpan or  search on metacpan

lib/Dist/Zilla/Plugin/Subversion/NextVersion.pm  view on Meta::CPAN

use strict;
use warnings;
package Dist::Zilla::Plugin::Subversion::NextVersion;
# ABSTRACT: provide a version number by bumping the last SVN release tag

use Dist::Zilla 4 ();
use version;
use Version::Next;

use Moose;
use Moose::Util::TypeConstraints;
use SVN::Client;
use Try::Tiny;

with 'Dist::Zilla::Role::VersionProvider';
with 'Dist::Zilla::Role::BeforeRelease';

has 'svn' => (
	is => 'ro',
	isa => 'SVN::Client',
	lazy => 1,
	default => sub {
		my $self = shift;
		SVN::Client->new();
	},
);

use constant _CoercedRegexp => do {
    my $tc = subtype as 'RegexpRef';
    coerce $tc, from 'Str', via { qr/$_/ };
    $tc;
};

has 'tag_folder' => (
	is => 'ro', isa => 'Str',
	default => sub {
		my $self = shift;
		return( '^/'.$self->zilla->name.'/tags/' );
	},
);

has version_regexp  => ( is => 'ro', isa=> _CoercedRegexp, coerce => 1,
                         default => sub { qr/^(.+)$/ } );

has first_version  => ( is => 'ro', isa=>'Str', default => '0.001' );

has 'all_versions' => (
	is => 'ro', isa => 'ArrayRef[version]', lazy => 1,
	default => sub {
		my $self = shift;
		my $regex = $self->version_regexp;
		my $listing = $self->svn->ls($self->tag_folder, 'HEAD', 0);
		my @versions = keys %$listing;
		@versions = sort map { /$regex/ ? try { version->parse("$1") } : () } @versions;
		return( \@versions );
	},
);

has 'max_version' => (
	is => 'ro', isa => 'version', lazy => 1,
	default => sub {
		my $self = shift;
		if( ! @{$self->all_versions} ) {
			die('could not obtain max_version from empty version list!');
		}
		return( $self->all_versions->[-1] );
	},
);

has 'next_version' => (
	is => 'ro', isa => 'Str', lazy => 1,
	default => sub {
		my $self = shift;
		return( Version::Next::next_version($self->max_version->stringify) );
	},
);

sub provide_version {
	my ($self) = @_;

	# override (or maybe needed to initialize)
	if( exists $ENV{V} ) {
		$self->log("using version ".$ENV{V}.' from environment');
		return $ENV{V};
	}

	my $max_version = $self->max_version;
	my $next_version = $self->next_version;

	$self->log("bumping version from $max_version to $next_version");

	return "$next_version";
}

sub before_release {
	my $self = shift;
	my $version = version->parse( $self->zilla->version );

	if( grep { $_ == $version } @{$self->all_versions} ) {
		$self->log_fatal("version $version has already been tagged")
	}
}

1;

__END__

=pod



( run in 0.954 second using v1.01-cache-2.11-cpan-39bf76dae61 )