The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- perl -*-
#
# Test::AutoBuild::Repository::Subversion by Daniel Berrange <dan@berrange.com>
#
# Copyright (C) 2002-2004 Daniel Berrange <dan@berrange.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# $Id: Subversion.pm,v 1.1.4.2 2004/09/23 23:14:09 danpb Exp $

=pod

=head1 NAME

Test::AutoBuild::Repository::Subversion - A repository for Subversion

=head1 SYNOPSIS

  use Test::AutoBuild::Repository::Subversion


=head1 DESCRIPTION

Description

=head1 METHODS

=over 4

=cut

package Test::AutoBuild::Repository::Subversion;

use strict;
use Carp qw(confess);

use base qw(Test::AutoBuild::Repository);


=pod

=item my $???? = Test::AutoBuild::Repository::Subversion->new(  );

=cut

sub new {
    my $proto = shift;
    my $class = ref($proto) || $proto;
    my $self = $class->SUPER::new(@_);

    bless $self, $class;

    return $self;
}


sub export {
    my $self = shift;
    my $name = shift;		# Name of the module to export.
    my $module = shift;		# Module object.

    my $url = $self->option("url");
    $url =~ s,/$,,;

    my $changed = 0;
    my $default = 0;
    foreach my $path (@{$module->paths}) {
        my ($src, $dst, $rev);
        if ($path =~ /^\s*(.*?)(?::(\d+))?\s*->\s*(.*?)\s*$/) {
            $rev = $2;
            $src = $1;
            $dst = $3;
        } elsif ($path =~ /^\s*(.*?)(?::(\d+))?\s*$/) {
	    if ($default) {
		die "only one default path allowed, use 'src -> dst' syntax instead\n";
	    }
	    $default = 1;
            $rev = $2;
            $src = $1;
            $dst = "";
        } else {
            die "cannot parse subversion path $path\n";
        }
	
	$src =~ s,^/,,;
	$dst =~ s,^/,,;

	my $path = $url . "/" . $src;

        my $output = $rev ? 
	    $self->_run("svn checkout -r $rev $path $name/$dst") :
	    $self->_run("svn checkout $path $name/$dst");

        # Simple change checking - look for any magic
        # file update status codes.
        foreach (split /\n/, $output) {
	    next if /^Checked out revision (\d+).$/;
	    $changed = 1;
        }
    }
    return $changed;
}



1 # So that the require or use succeeds.

__END__

=back 4

=head1 AUTHORS

Daniel Berrange <dan@berrange.com>

=head1 COPYRIGHT

Copyright (C) 2002-2004 Daniel Berrange <dan@berrange.com>

=head1 SEE ALSO

L<perl(1)>

=cut