package SVN::Web::Branch::YAML; @ISA = qw(SVN::Web::Revision); use strict; use SVN::Web::Revision; use SVN::Core; use SVN::Repos; use SVN::Fs; use YAML; sub check_branch { my ($self, $data) = @_; while (my ($path, $info) = each %{$data->{paths}}) { next unless $info->{copyfrom}; if ($info->{copyfrom}) { my $revinfo = [$info->{copyfromrev}, $data->{rev}, $info->{isdir}]; push @{$self->{BRANCHINFO}{dst}{$path}{$info->{copyfrom}}}, $revinfo; push @{$self->{BRANCHINFO}{src}{$info->{copyfrom}}{$path}}, $revinfo; } } } sub new { my $class = shift; my $self = $class->SUPER::new (@_); my $pool = SVN::Pool->new_default_sub; my $temp = ($self->{tmpdir} || '.'); my $file = "$temp/branch-$self->{reposname}.yaml"; $self->{BRANCHINFO} = YAML::LoadFile ($file) if -e $file; # XXX: lock this $self->{repos}->get_logs ([], $self->{BRANCHINFO}{youngest}+1, $self->{repos}->fs->youngest_rev, 1, 0, sub { $self->check_branch ($self->_log(@_))}) if $self->{repos}->fs->youngest_rev > $self->{BRANCHINFO}{youngest}; $self->{BRANCHINFO}{youngest} = $self->{repos}->fs->youngest_rev; YAML::DumpFile ($file, $self->{BRANCHINFO}); return $self; } sub branchto { my ($self, $path, $rev) = @_; my @branches = grep { "$_/" eq substr ($path, 0, length($_)+1) } keys %{$self->{BRANCHINFO}{src}}; my $ret; for (@branches) { my $src = $self->{BRANCHINFO}{src}{$_}; my $relpath = $path; $relpath =~ s/^$_//; for (keys %$src) { # XXX: re-branch interface my $info = $src->{$_}[0]; push @$ret, { dst => "$_$relpath", srcrev => $info->[0], dstrev => $info->[1], isdir => $info->[2], } if $info->[0] <= $rev; } } return $ret; } sub branchfrom { my ($self, $path, $rev) = @_; my @branches = grep { "$_/" eq substr ($path, 0, length($_)+1) } keys %{$self->{BRANCHINFO}{dst}}; my $ret; for (@branches) { my $dst = $self->{BRANCHINFO}{dst}{$_}; my $relpath = $path; $relpath =~ s/^$_//; for (keys %$dst) { # XXX: re-branch interface my $info = $dst->{$_}[0]; push @$ret, { src => "$_$relpath", srcrev => $info->[0], dstrev => $info->[1], isdir => $info->[2], } if $info->[1] <= $rev; } } return $ret; } sub branchpoints { my ($self, $path) = @_; my @branches = grep { $path =~ m|^$_/?| } keys %{$self->{BRANCHINFO}{src}}; my $ret; for (@branches) { my $src = $self->{BRANCHINFO}{src}{$_}; my $relpath = $path; $relpath =~ s/^$_//; for (keys %$src) { # XXX: re-branch interface my $info = $src->{$_}[0]; push @$ret, { dst => "$_$relpath", srcrev => $info->[0], dstrev => $info->[1], }; } } @$ret = sort {$b->{srcrev} <=> $a->{srcrev}} @$ret if $ret; return $ret; } sub run { my $self = shift; return '
'.Dump ($self->{BRANCHINFO});
}

1;