cvs.rb - CVS library for Ruby.

Example

require 'cvs'

# needs read permission only:
c = CVS.create(':pserver:anonymous@cvs.m17n.org:/cvs/root')
c.dir('.').listdir.each {|d| p d.path}
c.dir('gnus').listdir.each {|d| p d.path}
c.dir('gnus/lisp').listfile.each {|f| p f.name}
c.dir('semi').parse_log(CVS::Visitor::Dump.new)
c.file('flim/ChangeLog').tags.each {|tag,rev| p [tag,rev.to_s]}
c.file('flim/DOODLE-VERSION').tags.each {|tag,rev| p [tag,rev.to_s]}  # cvs.rb handles attic-ness for you.
c.file('semi/ChangeLog').parse_raw_log(CVS::Visitor::Dump.new)
c.file('semi/ChangeLog').parse_log(CVS::Visitor::Dump.new)
c.file('apel/ChangeLog').checkout(RCS::Revision.create('1.1.1.1')) {|d, a| p a; print d}
c.file('apel/ChangeLog').heads.each {|t, h| print "#{t||'*maintrunk*'} #{h}\n"}
c.file('flim/ChangeLog').annotate(RCS::Revision.create("1.30")) {|line, date, rev, author| p [line, date, rev.to_s, author]}

# needs write permission (works with remote repositories):
d = CVS.create(':ext:foo@bar:/cvsroot//tst')
d.mkdir('subdirname')
h = d.mkfile('a', 'initial contents', 'first log')
h.checkin('modified contents', 'modified log')
h.remove('removed log')
h.add('re-added contents', 'added log')

# needs to be local repository:
c = CVS.create('/home/foo/.cvsroot')
c.file('cvs/ChangeLog').parse_log(CVS::Visitor::Dump.new)
c.file('cvs/ChangeLog').fullannotate(RCS::Revision.create("1.30")) {|line, date1, rev1, author, rev2, date2| p [line, date1, rev1.to_s, author, rev2.to_s, date2]}

CVS

Abstract CVS repository class.

CVS.create(arg[, readonly])

CVS.create is an intelligent factory method for CVS objects.

cvsroot//                  => CVS repository object.
cvsroot//dir               => CVS directory object.
cvsroot//dir//             => CVS directory object. (same as above.)
cvsroot//dir//file         => CVS file object.
cvsroot//dir//Attic/file   => CVS file object which is placed in Attic.

If cvsroot begins with `/', a instantiated obect accesseses a repository directly. Otherwise, the object accesses the repository by cvs command. I.e. this module works well with remote repositories as well as local repositores. It gets speed advantages with local repositories.

If the argument doesn't contain `//' and begins with `/', CVS.create searches a CVSROOT directory and RCS file in given argument and instantiate a suitable object. If it doesn't begins with `/', instantiate a remote CVS repository object.

Syntax:

cvs_create_arg = exact_arg | ambiguous_arg
exact_arg = cvsroot '//' [directory ['//' [file]]] | 
cvsroot = local_cvsroot | remote_cvsroot
local_cvsroot = <cvsroot begins with '/'>
remote_cvsroot = <cvsroot not begins with '/'>
directory = '.' | path
path = name | name '/' path
file = ['Attic/'] name
name = <filename>
ambiguous_arg = '/' path

If `readonly' is true, only write operations are forbidden and locking is disabled.

cvsroot

returns CVSROOT as an string.

top_dir

creates a CVS directory object which points top directory of the repository.

dir(path)

creates a CVS directory object which points `path'.

file(path[, attic])

creates a CVS file object which points `path'.

`attic' specify whether the file is placed in Attic.

CVS::D

Abstract CVS directory class.

cvsroot

returns the CVS repository object.

path

returns a path from a top directory of the repository.

top?

returns true if self is a top directory of the repository.

parent

returns a parent directory. If self is a top directory, nil is returned.

simple_dir(name)

creates a CVS directory object for direct subdirectory.

simple_file(name[, attic])

creates a CVS file object for a file contained by the directory.

dir(path)

creates a CVS directory object for a directory under the directory.

file(path[, attic])

creates a CVS file object for a file under the directory.

listdir

returns an array of CVS directory objects which represent subdirectories.

listfile

returns an array of CVS file objects for non-directory files directly under the directory.

parse_log(visitor[, opts])

run `cvs log' or `rlog' for all non-directory files in the directory.

mkdir(directory_name)

creates a directory under the directory.

mkfile(file_name, contents, log[, description[, branch_tag]])

creates a file in the directory.

CVS::F

Abstract CVS file class.

dir

returns the CVS directory object.

name

returns the filename.

attic

returns attic info.

path

returns a path from a top directory of the repository.

parse_log(visitor[, opts])

run `cvs log' or `rlog' for the file.

tags

returns a hash which maps a tag to a revision.

checkout(rev) {|contents, attr| ...}
annotate(rev) {|line, date, rev, author| ...}
mkbranch(rev, tag)
head([tag])

creates a head object.

If `tag' is not specified, a head object for main trunk is created.

heads

returns a hash which maps a tag to a head object.

The hash contains a head object for main trunk as a value of nil as a key.

CVS::F::Head

Abstract CVS head class.

add(contents, log)
checkin(contents, log)
remove(log)

CVS::Attr

CVS file attribute class

mtime
mode