NAME
VCI::VCS::Cvs - Object-oriented interface to CVS
DESCRIPTION
This is a "driver" for VCI for the CVS (Concurrent Versioning System) version-control system. You can find out more about CVS at http://www.nongnu.org/cvs/.
For information on how to use VCI::VCS::Cvs, see VCI.
CONNECTING TO A CVS REPOSITORY
For the repo argument to "connect" in VCI, choose what you would put in the CVSROOT
environment variable.
The constructor also takes two additional, optional parameters:
x_cvs
-
The path to the "cvs" binary on your system. If not specified, we will search your
PATH
and throw an error ifcvs
isn't found.Taint Mode: VCI will throw an error if this argument is tainted, because VCI just runs this command blindly, and we wouldn't want to run something like
delete_everything_on_this_computer.sh
. x_cvsps
-
The path to the "cvsps" binary on your system. If not specified, we will search your
PATH
and throw an error ifcvsps
isn't found.Taint Mode: VCI will throw an error if this argument is tainted, because VCI just runs this command blindly, and we wouldn't want to run something like
delete_everything_on_this_computer.sh
.
Local Repositories
Though CVS itself doesn't allow relative paths in :local:
roots, VCI::VCS::Cvs does. So :local:path/to/repo
(or just path/to/repo
) will be interpreted as meaning that you want the CVS repository in the directory path/to/repo
.
In actuality, VCI::VCS::Cvs converts the relative path 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.
REQUIREMENTS
In addition to the Perl modules listed for CVS Support when you install VCI, VCI::VCS::Cvs requires that the following things be installed on your system:
- cvs
-
The
cvs
client program, at least version 1.11. You can get this at http://www.nongnu.org/cvs for *nix systems and http://www.cvsnt.org/ for Windows systems. - cvsps
-
This is a program that interacts with CVS to figure out what files were committed together, since CVS doesn't normally track that information, and VCI needs that information.
You can get it from http://www.cobite.com/cvsps/. (Windows users have to use Cygwin to run cvsps, which you can get from http://www.cygwin.com/.)
REVISION IDENTIFIERS
cvsps groups file commits that are close together in time and have the same message into "PatchSets". Each of these PatchSets is given a unique, integer identifier.
Since VCI::VCS::Cvs uses cvsps, the revision identifiers on Commit objects will be these PatchSet ids.
For File objects, the revision identifiers will be the actual revision identifier as returned by CVS for that file. For example 1.1
, etc.
For Directory objects, the revision identifier is currently always HEAD
.
LIMITATIONS AND EXTENSIONS
Currently VCI doesn't understand the concept of "branches", so you are always dealing with the
HEAD
branch of a project. This will change in the future so that VCI can access branches of projects.cvsps needs to write to the
HOME
directory of the current user, you must have write access to that directory in order to interact with the History of a Project.VCI::VCS::Cvs has to write files to your system's temporary directory (/tmp on *nix systems), and many operations will fail if it cannot. It uses the temporary directory returned by "tmpdir" in File::Spec.
If your program dies during execution, there is a chance that directories named like vci.cvs.XXXXXX will be left in your temporary directory. As long as no instance of VCI is currently running, it should be safe to delete these directories.
In addition, here are the limitations of specific modules compared to the general API specified in the VCI::Abstract
modules:
VCI::VCS::Cvs::Repository
get_project
doesn't support modules yet, only directory names in the repository. Using a module name won't throw an error, but operations on that Project are likely to then fail.
VCI::VCS::Cvs::Project
CVS supports "root_project".
VCI::VCS::Cvs::Commit
CVS doesn't track the history of a Directory, so Directory objects will never show up in the added, removed, modified, or contents of a Commit.
VCI::VCS::Cvs::Directory
For the
time
accessor, we return the time of the most-recently-modified file in this directory. If there are no files in the directory, we return a time that corresponds totime() == 0
on your system, probably January 1, 1970 00:00:00. Currently this is a fairly slow operation, but it may be optimized in the future.All Directory objects have a revision of
HEAD
, even if you get them through theparent
accessor of a File.If you manually create a Directory with a revision other than
HEAD
, the contents will be incorrect.
PERFORMANCE
VCI::VCS::Cvs performs fairly well, although it may be slower on projects that have lots of files in one directory, or very long histories.
Working with a local repository will always be faster than working with a remote repository. For most operations, the latency between you and the repository is far more important than the bandwidth between you and the repository.
SEE ALSO
BUGS
VCI::VCS::Cvs is very new, and may have significant bugs. The code is alpha-quality at this point.
AUTHOR
Max Kanat-Alexander <mkanat@cpan.org>
COPYRIGHT AND LICENSE
Copyright 2007-2008 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.