The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use utf8;

package Ukigumo::Client::VC::SVN;
use Mouse;
use Cwd;

with 'Ukigumo::Client::Role::VC';

has log_limit => ( is => 'ro', isa => 'Int', default => 50 );

sub default_branch { 'trunk' }

sub get_revision {
    my $self = shift;
    $self->{revision} ||= $self->_revision() || 'Unknown';
}

sub update {
    my ($self, $c) = @_;

    $c->log("workdir is ".Cwd::getcwd());
    unless (-d ".svn") {
        $c->tee("svn co @{[ $self->repository ]} ./") == 0 or die "Cannot checkout repository";
    }
    $c->tee("svn up") == 0 or die "svn fail";
    $c->tee("svn cleanup") == 0 or die "svn fail";
    $c->tee("svn status") == 0 or die "svn fail";
    $c->tee("svn info") == 0 or die "svn fail";
    delete $self->{revision};
}

sub get_log {
    my ($self, $rev1, $rev2) = @_;
    $rev1 = 1      if $rev1 eq 'Unknown';
    $rev2 = 'HEAD' if $rev2 eq 'Unknown';
    return if $rev1 eq $rev2; # no change
    `svn log --limit @{[ $self->log_limit ]} -r $rev1:$rev2`;
}

sub _trim {
    my @stuff = @_;
    $_ =~ s/^\s+|\s+$// for @stuff;
    return @stuff;
}

sub _revision {
    return +{ map { _trim(split ':', $_, 2) } split "\n", `svn info` }->{Revision};
}

1;
__END__

=head1 NAME

Ukigumo::Client::VC::SVN - svn.

=head1 DESCRIPTION

This is a svn wrapper for Ukigumo.

=head1 ATTRIBUTES

=over 4

=item repository

This is a repository URL.

=item branch

This is a name of branch. It's B<trunk> by default.

=back