Author image Barrie Slaymaker


VCP::Source::cvs - A CVS repository source


   vcp cvs:module/... -d ">=2000-11-18 5:26:30"
                                  # All file revs newer than a date/time

   vcp cvs:module/... -r foo      # all files in module and below labelled foo
   vcp cvs:module/... -r foo:     # All revs of files labelled foo and newer,
                                  # including files not tagged with foo.
   vcp cvs:module/... -r 1.1:1.10 # revs 1.1..1.10
   vcp cvs:module/... -r 1.1:     # revs 1.1 and up

   ## NOTE: Unlike cvs, vcp requires spaces after option letters.


Reads a CVS repository.

NOTE: You no longer need to check the desired files out in to a local directory. VCP::Source::cvs now creates it's own checkout for two reasons: it's easier and less coupled to the user's system and it's less likely to be in some unknown state that causes odd behaviors due to sticky tags, etc. If you do want to use a workspace, see the --cd option.

This module in alpha.

This doesn't deal with branches yet (at least not intentionally). That will require a bit of Deep Thought.

This only deals with filespecs with trailing wildcards, like "/a/b/c" or "a/b/..." for now. Later, we can handle filespecs with embedded wildcards by logging all possible files and applying the wildcards to the files cvs emits, probably using Regexp::Shellish.


-b, --bootstrap
   -b '**'
   -b file1[,file2[,...]]

Forces bootstrap mode for an entire export (-b '**') or for certain files. Filenames may contain wildcards, see Regexp::Shellish for details on what wildcards are accepted. For now, one thing to remember is to use '**' instead of p4's '...' wildcard.

Controls how the first revision of a file is exported. A bootstrap export contains the entire contents of the first revision in the revision range. This should only be used when exporting for the first time.

An incremental export contains a digest of the revision preceding the first revision in the revision range, followed by a delta record between that revision and the first revision in the range. This allows the destination import function to make sure that the incremental export begins where the last export left off.

The default is decided on a per-file basis: if the first revision in the range is revision #1, the full contents are exported. Otherwise an incremental export is done for that file.

This option is necessary when exporting only more recent revisions from a repository.


Used to set the CVS working directory. VCP::Source::cvs will cd to this directory before calling cvs, and won't initialize a CVS workspace of it's own (normally, VCP::Source::cvs does a "cvs checkout" in a temporary directory).

This is an advanced option that allows you to use a CVS workspace you establish instead of letting vcp create one in a temporary directory somewhere. This is useful if you want to read from a CVS branch or if you want to delete some files or subdirectories in the workspace.

If this option is a relative directory, then it is treated as relative to the current directory.



Sets the root of the source tree to export. All files to be exported must be under this root directory. The default rev-root is all of the leading non-wildcard directory names. This can be useful in the unusual case of exporting a sub-tree of a larger project. I think.

   -r v_0_001:v_0_002
   -r v_0_002:

Passed to 'cvs log' as a '-r' revision specification. This corresponds to the -r option for the rlog command, not either of the -r options for the cvs command. Yes, it's confusing, but 'cvs log' calls 'rlog' and passes the options through.

IMPORTANT: When using tags to specify CVS file revisions, it would ordinarily be the case that a number of unwanted revisions would be selected. This is because the behavior of the cvs log command dumps the entire log history for any files that do not contain the tag. VCP captures the histories of such files and ignores all revisions that are older or newer than any files that match the tags.

Be cautious using HEAD as the end of a revision range, this seems to cause the delete actions for files deleted in the last revision to not be noticed. Not sure why.

One of -r or "-d" must be specified.

   -d "2000-11-18 5:26:30<="

Passed to 'cvs log' as a '-d' date specification.

WARNING: if this string doesn't contain a '>' or '<', you're probably doing something wrong, since you're not specifying a range. vcp may warn about this in the future.

One of "-r" or -d must be specified.


   "What we have here is a failure to communicate!"
       - The warden in Cool Hand Luke

CVS does not try to protect itself from people checking in things that look like snippets of CVS log file: they go in Ok, and they come out Ok, screwing up the parser.

So, if a repository contains messages in the log file that look like the output from some other "cvs log" command, things will likely go awry.

At least one cvs repository out there has multiple revisions of a single file with the same rev number. The second and later revisions with the same rev number are ignored with a warning like "Can't add same revision twice:...".


This class uses the fields pragma, so you'll need to use base and possibly fields in any subclasses.


Copyright 2000, Perforce Software, Inc. All Rights Reserved.

This module and the VCP package are licensed according to the terms given in the file LICENSE accompanying this distribution, a copy of which is included in vcp.


Barrie Slaymaker <>