/usr/local/CPAN/Pushmi/Pushmi/Command/Unlock.pm


package Pushmi::Command::Unlock;
use base 'Pushmi::Command::Mirror';
use strict;
use warnings;

use SVK::I18N;

my $logger = Pushmi::Config->logger('pushmi.unlock');

sub options {
    ( 'revision=i' => 'revision' )
}

sub run {
    my ($self, $repospath) = @_;
    $self->canonpath($repospath);
    my $repos = SVN::Repos::open($repospath) or die "Can't open repository: $@";

    my $t = $self->root_svkpath($repos);

    $self->setup_auth;
    my ($mirror) = $t->is_mirrored;

    my $token   = join(':', $mirror->repos->path, $mirror->_lock_token);
    if ($self->{revision}) {
        # non-runhook commits (like sync), nothing to unlock for.
        my $expected = $t->repos->fs->revision_prop($self->{revision}, 'svk:committed-by') or return;
        if ($expected ne $token) {
            $logger->logdie("[$repospath] revision $self->{revision} does not own lock $expected, expecting $token");
        }
    }
    my $memd = Pushmi::Config->memcached;
    if (my $content = $memd->get( $token ) ) {
        $logger->info("[$repospath] lock $token ($content) removed");
        print loc("Removing lock %1 on %2.\n", $content, $repospath);
        $mirror->unlock('force');
    }
    else {
        $logger->info("[$repospath] lock $token not found");
    }

    return;
}

1;