Meta-CVS is a version control system built around CVS. It is more capable than CVS, and is easier to use. Its main features are:
* Directory structure versioning. Under Meta-CVS, the directory structure of a project is versioned in the same way as the contents of its files. Concurrent changes to the directory structure are permitted. It an be branched, and merged. The program dynamically rearranges the structure of the sandbox as you obtain updates from the repository, switch branches or retrieve old revisions.
* Support for a promotion model. It's possible to start versioning local files, before making them visible to the project. This is done by selectively comitting the changes to the files, but retaining the directory structure change uncomitted until the new material is ready to be promoted to the project.
* User-friendly file type handling. Meta-CVS interactively handles file types when files are imported or added. It remembers, for instance, that .png files are considered binary so that when new instances of them are added, they are automatically treated as binary.
* Sane corner cases. Meta-CVS handles the use case when two or more developers add a file of the same name to the same location. It handles the case when someone removes a file that someone else is modifying. And it handles the case of files being removed and later added with a different keyword expansion mode. All of these cause problems in CVS.
* Simple branching and merging. Creating a branch, switching among branches and merging are simple commands that take one argument. The software keeps track of what has been merged where from what branch.
* Support for symbolic links and meta-data. Symbolic links are versioned objects in Meta-CVS. Files and symbolic links can have attached property lists, which are versioned. One standard property determines whether or not a file is executable, so in this way Meta-CVS versions the execute permission.
* Tracking of third party code containing moves and renames. Meta-CVS has an importing feature called ``grab'' similar in concept to CVS vendor branches, but with significant differences. When a snapshot of code is grabbed onto a branch, the program analyzes the contents of apparently added and removed files to determine which of them are actually moves. An ordinary branch is used, not CVS vendor branches, which are deprecated in Meta-CVS. Ordinary branches can shoot from anywhere, not just version 1.1 of every file, so third party ``grab branches'' representing multiple sources are possible. The grab feature can be used to reconstruct the restructuring history of old projects, provided that a sequence of snapshots is available. Then it's possible to apply standard version control tricks, like fix a bug in an old version, and merge it to the latest, despite renamed or moved files.
* Ease of deployment. The software doesn't require any repository-side installation; it uses the CVS client interface only. If you have write access to a remote CVS repository, you can install it on your client system and create a Meta-CVS module stored on the remote repository.
While it does not have all the features of the next generation version control systems under development, Meta-CVS seems to address many important problems people have regarding CVS. It may just succeed in making CVS "good enough" to serve the needs of many Free Software projects for a long time to come...