package SVL::Command::Pull;
use strict;
use warnings;
use base qw( SVL::Command );
use constant options => ('C|check-only' => 'checkonly');
use SVK::Util qw(find_local_mirror);
use Path::Class;
sub run {
my ($self, $path) = @_;
my $target = $self->svkcmd->arg_co_maybe($path, 1);
my $minfo =
SVK::Merge->new(xd => $self->xd)->find_merge_sources($target, 1, 1);
my ($ancestor_data) = $target->copy_ancestors;
#This is a work around because find_merge_sources doesn't find sources unless you have merged
$minfo->{join(":", SVK::Util::find_svm_source($target->{repos}, $ancestor_data->[0], $ancestor_data->[1] ) )}++;
my %shares;
foreach my $share (SVL::Sharing->new(file($self->svkpath, 'svl-share'), $self->xd)->list) {
$shares{$share->uuid}++;
}
my $source;
for (sort keys %$minfo) {
my ($uuid, $path) = split /:/;
$source->{$uuid}->{$path}++;
}
my $bonjour = SVL::Bonjour->new;
$bonjour->discover();
foreach my $peer (@{ $bonjour->peers }) {
my $host_port = $peer->address . ':' . $peer->svnport;
foreach my $share (@{ $peer->shares }) {
my $top_uuid = $share->uuid;
my $url = $share->url;
my $string = `svn pg svk:merge --strict $url`;
$string .= "\n".$share->uuid.":".$share->path .":0";
# warn "$url => \n$string\n";
my $peer_data = SVK::Merge::Info->new($string);
foreach my $remote (values %$peer_data) {
my $uuid = $remote->{uuid};
next if(exists $shares{$share->uuid});
next unless exists $source->{$uuid}->{$remote->{path}};
$self->do_pull($peer, $target, $share->uuid, $share->path);
last;
}
}
}
}
sub do_pull {
my ($self, $peer, $target, $uuid, $source) = @_;
my ($path) = find_local_mirror($target->{repos}, $uuid, $source);
# TODO: NO LOCAL MIRROR, WE SHOULD WARN
unless($path) {
warn "We have a remote repository relation but we don't have a local mirror please link\n";
warn "$target->{repos}, $uuid, $source";
return;
}
print "merge from " . $peer->name . "\n";
# TODO: --remoterev and proper --host as well
$self->svk->sm(
'--sync', '-lm',
"merge from " . $peer->name . " by svl:",
"/" . $target->depotname . $path => $target->{depotpath}
);
$self->svk->up($target->{report})
if exists $target->{copath};
}
1;
__END__
=head1 NAME
SVL::Command::Pull - Pull from repositories
=head1 SYNOPSIS
svl pull
svl pull --check-only
=head1 OPTIONS
---check-only # do not pull, check only