MYDan

 view release on metacpan or  search on metacpan

lib/MYDan/Util/Deploy.pm  view on Meta::CPAN

package MYDan::Util::Deploy;
use strict;
use warnings;
use Cwd;
use Digest::MD5;
use File::Basename;

sub new
{
    my ( $class, %self ) = @_;

    map{ die "$_ undef" unless $self{$_} }qw( link path repo version keep );

    map{ 
        die "$_ format error" unless $self{$_} =~ /[a-zA-Z0-9]/ && $self{$_} !~ /'/;
    }qw( link path repo version );

    die "keep format error" unless $self{keep} =~ /^\d+$/;

    die "$self{repo}: No such directory.\n" if $self{repo} !~ /@/ && ! -d $self{repo};

    unless( -d $self{path} )
    {
        die "mkdir path $self{path} fail: $!" if system "mkdir -p '$self{path}'";
    }

    my $linkdir = dirname $self{link};
    unless( -d $linkdir )
    {
        die "mkdir path $linkdir fail: $!" if system "mkdir -p '$linkdir'";
    }

    $self{cache} = (getpwnam((getpwuid $<)[0]))[7] . "/.mydan/deploy";

    $self{path} = Cwd::abs_path( $self{path} ) unless $self{path} =~ /^\//;
    $self{repo} = Cwd::abs_path( $self{repo} ) if $self{repo} !~ /@/ && $self{repo} !~ /^\//;

    bless \%self, ref $class || $class;
}

sub deploy
{
    my $this = shift;

    my ( $path, $link, $version ) = @$this{qw( path link version )};

	return $this->_recoverlink() if $this->{comeback};

    my $temp = "$link.backup";

    if( $version =~ /^backup\d*$/ )
    {
        $temp = "$link.$version";
        die "$temp: No such directory.\n" unless -d $temp;
        die "link $link fail.\n" if syscmd( "ln -fsn '$temp' '$link'" );
        return $this;
    }

    $this->_explain();

    if( -d $link && ! -e $temp )
    {
        die "backup old link fail.\n" if syscmd( "mv '$link' '$temp'" );
    }

    die "link $link may be a directory.\n" if -d $link && ! -l $link;

	$this->_savelink();

	return $this if $this->{stage};

    die "link $link fail.\n" if syscmd( "ln -fsn '$path/$version' '$link'" );

    $this->_clean();
    return $this;
}

sub _recoverlink
{
    my $this = shift;

    my ( $link, $version, $cache ) = @$this{qw( link version cache )};

    my $md5 = Digest::MD5->new->add( "$link:$version" )->hexdigest;

    die "recover link fail: No such link.\n" unless -l "$cache/$md5";
    my $newlink = readlink "$cache/$md5";
    die "recover link fail: No link to a directory.\n" unless -d $newlink;

    die "recover link fail: ln -fsn.\n" if syscmd("ln -fsn $newlink '$link'");

    return $this;
}



( run in 2.216 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )