1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
package VCS;
my @IMPLEMENTATIONS;
my $CONTAINER_PAT = '(' . join('|', qw(VCS/Dir VCS/File VCS/Version)) . ')';
use vars qw($VERSION);
use VCS::Dir;
use VCS::File;
use VCS::Version;
use URI;
$VERSION = '0.14';
sub parse_url {
# vcs://hostname/classname/...
my ($class, $url) = @_;
my $uri = URI->new($url);
die "Non-vcs URL '$url' passed!\n" unless $uri->scheme eq 'vcs';
my $path = $uri->path;
$path =~ s#^/([^/]+)##;
my $classname = $1;
($uri->authority, $classname, $path, $uri->query)
}
sub _class2file {
my $class = shift;
$class =~ s#::#/#g;
$class .= '.pm';
$class;
}
sub class_load {
my ($class, $to_load) = @_;
require(_class2file($to_load));
}
1;
__END__
=head1 NAME
VCS - Library for generic Version Control System access in Perl
=head1 SYNOPSIS
use VCS;
$file = VCS::File->new($ARGV[0]);
print $file->url, ":\n";
for $version ($file->versions) {
print $version->version,
' was checked in by ',
$version->author,
"\n";
}
=head1 DESCRIPTION
C<VCS> is an API for abstracting access to all version control systems
from Perl code. This is achieved in a similar fashion to the C<DBI>
suite of modules. There are "container" classes, C<VCS::Dir>,
C<VCS::File>, and C<VCS::Version>, and "implementation" classes, such
as C<VCS::Cvs::Dir>, C<VCS::Cvs::File>, and C<VCS::Cvs::Version>, which
are subclasses of their respective "container" classes.
The container classes are instantiated with URLs. There is a URL scheme
for entities under version control. The format is as follows:
vcs://localhost/VCS::Cvs/fs/path/?query=1
The "query" part is ignored for now. The path must be an absolute path,
meaningful to the given class. The class is an implementation class,
such as C<VCS::Cvs>.
The "container" classes work as follows: when the C<new> method of a
container class is called, it will parse the given URL, using the
C<VCS-E<gt>parse_url> method. It will then call the C<new> of the
implementation's appropriate container subclass, and return the
result. For example,
VCS::Version->new('vcs://localhost/VCS::Cvs/fs/path/file/1.2');
will return a C<VCS::Cvs::Version>.
An implementation class is recognised as follows: its name starts with
C<VCS::>, and C<require "VCS/Classname.pm"> will load the appropriate
implementation classes corresponding to the container classes.
=head1 VCS METHODS
=head2 VCS-E<gt>parse_url
This returns a four-element list:
($hostname, $classname, $path, $query)
For example,
VCS->parse_url('vcs://localhost/VCS::Cvs/fs/path/file/1.2');
will return
(
'localhost',
'VCS::Cvs',
'/fs/path/file/1.2',
''
)
This is mostly intended for use by the container classes, and its
interface is subject to change.
=head2 VCS-E<gt>class_load
This loads its given implementation class.
This is mostly intended for use by the container classes, and its
interface is subject to change.
=head1 VCS::* METHODS
Please refer to the documentation for L<VCS::Dir>, L<VCS::File>,
and L<VCS::Version>; as well as the implementation specific documentation
as in L<VCS::Cvs>, L<VCS::Rcs>.
=head1 AVAILABILITY
Much of this information is incorrect, the current up to date
version of VCS is held on a different CVS server now, i'm going
to make things a little more public and then update the below
information - thanks for your patience.
VCS.pm and its friends are available from CPAN. There is a web page
at:
http://www.astray.com/VCS/
as well as a sourceforge project page at:
http://sourceforge.net/projects/vcs/
=head1 MAILING LIST
There is currently a mailing list about VCS. Go to the following
webpage to subscribe to it:
http://www.astray.com/mailman/listinfo/vcs
There is a web archive of the mailing list at:
http://www.astray.com/pipermail/vcs/
General queries should be made directly to the mailing list.
=head1 AUTHORS
Greg McCarroll <greg@mccarroll.org.uk>
Leon Brocard
=head1 KUDOS
Thanks to the following for patches,
Richard Clamp
Pierre Denis
Slaven Rezic
=head1 COPYRIGHT
Copyright (c) 1998-2003 Leon Brocard & Greg McCarroll. All rights
reserved. This program is free software; you can redistribute it
and/or modify it under the same terms as Perl itself.
=head1 SEE ALSO
L<VCS::Cvs>, L<VCS::Dir>, L<VCS::File>, L<VCS::Rcs>, L<VCS::Version>.
|