| VCI documentation | Contained in the VCI distribution. |
VCI::VCS::Svn - Object-oriented interface to Subversion
my $repository = VCI->connect(type => 'Svn',
repo => 'svn://svn.example.com/svn/');
This is a "driver" for VCI for the Subversion version-control system. You can find out more about Subversion at http://subversion.apache.org/.
For information on how to use VCI::VCS::Svn, see VCI.
For the repo argument to connect in VCI, pass the same URL that you'd pass to your SVN client, without the actual branch name. That is, pass a URL to the very root of your repository.
For example, if I have a project called Foo that I store in
svn.domain.com/svn/repo/Foo/trunk then the repo would be
svn://svn.domain.com/svn/repo/.
Though Subversion itself doesn't allow relative paths in file://
URLs, VCI::VCS::Svn does. So file://path/to/repo will be interpreted
as meaning that you want the repo in the directory path/to/repo.
In actuality, VCI::VCS::Svn converts that to an absolute path when creating the Repository object, so using relative paths will fail if you are in an environment where abs_path in Cwd fails.
VCI::VCS::Svn requires at least Subversion 1.2, and the SVN::Client perl modules that ship with Subversion must be installed.
The Subversion API requires that certain output be written to a real file on the filesystem. So, for certain operations (such as getting a diff or the contents of a file), we need to be able to write to the system's temporary directory.
Listed here are other limitations of VCI::VCS::Svn compared to the general
API specified in the VCI::Abstract modules (or compared to how you might
expect the driver to function):
Svn supports "root_project".
added, removed, modified and copied, objects only
implement Committable without actually
being File or Directory
objects. This is due to a limitation in the current Subversion API.
(See http://subversion.tigris.org/issues/show_bug.cgi?id=1967.) copied files always show up in added, they never show up in modified,
even if they were changed after they were copied. This is because
Subversion doesn't track that a copied file was modified after you copied
it.
as_diff -- it looks like
a whole new file was added. copied, added, and removed instead of in moved.VCI::VCS::Svn performs well with both local and remote repositories, even
when there are large numbers of revisions in the repository. We use the
API directly in C (via SVN::Client), so there is no overhead of actually
using the svn binary.
Some optimizations are not implemented yet, though, so certain operations may be slow, such as searching commits by time. This should be easy to rectify in a future version, particularly as I get some idea from users about how they most commonly use VCI.
Max Kanat-Alexander <mkanat@cpan.org>
Copyright 2007-2010 by Everything Solved, Inc.
http://www.everythingsolved.com
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| VCI documentation | Contained in the VCI distribution. |
package VCI::VCS::Svn; use Moose; our $VERSION = '0.7.1'; use SVN::Client; extends 'VCI'; has 'x_client' => (is => 'ro', isa => 'SVN::Client', lazy_build => 1); use constant revisions_are_universal => 0; sub _build_x_client { my $self = shift; return SVN::Client->new(config => {}); } sub diff_class { require VCI::Abstract::Diff; return 'VCI::Abstract::Diff'; } __PACKAGE__->meta->make_immutable; 1; __END__