SVK
view release on metacpan or search on metacpan
lib/SVK/Command/Mirror.pm view on Meta::CPAN
}
sub recover_headrev {
my ($self, $target, $m) = @_;
my $fs = $target->repos->fs;
my ($props, $headrev, $rev, $firstrev, $skipped, $uuid, $rrev);
traverse_history (
root => $fs->revision_root ($fs->youngest_rev),
path => $m->{target_path},
cross => 1,
callback => sub {
$rev = $_[1];
$firstrev ||= $rev;
$logger->info(loc("Analyzing revision %1...\n", $rev),
('-' x 70),"\n",
$fs->revision_prop ($rev, 'svn:log'));
if ( $headrev = $fs->revision_prop ($rev, 'svm:headrev') ) {
($uuid, $rrev) = split(/[:\n]/, $headrev);
$props = $fs->revision_proplist($rev);
get_prompt(loc(
"Found merge ticket at revision %1 (remote %2); use it? (y/n) ",
$rev, $rrev
), qr/^[YyNn]/) =~ /^[Nn]/ or return 0; # last
undef $headrev;
}
$skipped++;
return 1;
},
);
if (!$headrev) {
die loc("No mirror history found; cannot recover.\n");
}
if (!$skipped) {
$logger->warn(loc("No need to revert; it is already the head revision."));
return;
}
get_prompt(
loc("Revert to revision %1 and discard %*(%2,revision)? (y/n) ", $rev, $skipped),
qr/^[YyNn]/,
) =~ /^[Yy]/ or die loc("Aborted.\n");
$self->command(
delete => { direct => 1, message => '' }
)->run($target);
$target->refresh_revision;
$self->command(
copy => { direct => 1, message => '' },
)->run($target->new(revision => $rev) => $target->new);
# XXX - race condition? should get the last committed rev instead
$target->refresh_revision;
$self->command(
propset => { direct => 1, revprop => 1 },
)->run($_ => $props->{$_}, $target) for sort grep {m/^sv[nm]/} keys %$props;
$logger->info( loc("Mirror state successfully recovered."));
return;
}
sub recover_list_entry {
my ($self, $target, $m) = @_;
my %mirrors = map { ($_ => 1) } SVN::Mirror::list_mirror ($target->repos);
return if $mirrors{$m->{target_path}}++;
$self->command ( propset => { direct => 1, message => 'foo' } )->run (
'svm:mirror' => join ("\n", (grep length, sort keys %mirrors), ''),
$self->arg_depotpath ('/'.$target->depotname.'/'),
);
$logger->info( loc("%1 added back to the list of mirrored paths.\n", $target->report));
return;
}
1;
__DATA__
=head1 NAME
SVK::Command::Mirror - Initialize a mirrored depotpath
=head1 SYNOPSIS
mirror [http|svn]://host/path DEPOTPATH
# You may also list the target part first:
mirror DEPOTPATH [http|svn]://host/path
mirror --bootstrap=DUMPFILE DEPOTPATH [http|svn]://host/path
mirror --list [DEPOTNAME...]
mirror --relocate DEPOTPATH [http|svn]://host/path
mirror --detach DEPOTPATH
mirror --recover DEPOTPATH
mirror --upgrade //
mirror --upgrade /DEPOTNAME/
=head1 OPTIONS
-b [--bootstrap] : mirror from a dump file
-l [--list] : list mirrored paths
-d [--detach] : mark a depotpath as no longer mirrored
--relocate : change the upstream URI for the mirrored depotpath
--recover : recover the state of a mirror path
--unlock : forcibly remove stalled locks on a mirror
--upgrade : upgrade mirror state to the latest version
( run in 0.667 second using v1.01-cache-2.11-cpan-71847e10f99 )