Milo Banks

Checking Out from SCVS Repositories

I'm currently playing with trying to get Sprite to compile on modern hardware. Sprite was a UNIX-like experimental distributed operating system developed between 1984 and 1992 at the University of California Berkeley. Sprite was developed with the intent to create a more "network aware," while keeping it invisible to the user. The primary innovation was a new network file system that utilized local client-side caching to enhance performance. Once a file is opened and some initial reads are completed, the network is accessed only on-demand, with most user actions interacting with the cache. Similar mechanisms allow remote devices to be integrated into the local computer's environment, enabling retwork printing and other similar functions.

Regardless, the team managed their code with a home grown tool called SCVS, which stands for "Sprite Concurrent Version System." It's described as a wrapper around CVS, which is in turn a wrapper around RCS (what is this, Javascript?). The tool is primarily implemented in one Perl file, which calls out to some other files scattered out around the Sprite source tree. I've compiled them together here, and fixed some errors preventing it from running on modern Perl (the code was last updated in 1992). However, it's still a pain to use, and for some reason it errors out when checking out specific modules (the signal one in the kernel to be more precise).

That's why, when I wanted the code (or at least the code according to the VCS, not some random dump), I had to figure out a way to get around SCVS to read it. Turns out it's really pretty simple if you don't want to anything crazy and just want to checkout the code; in fact, I stumbled into it accidentally.

Reading SCVS Data with CVS

The formats are pretty much the same (remember, SCVS is a wrapper). To convert it into a format CVS can read, we'll create a directory outside of the repository path:

cd ..
mkdir checkout-dump

Then we can go ahead and set CVSROOT. It should be set to the parent directory of the CVSROOT directory (literally named) that SCVS uses. After that, the module file found in the kernel tree should be copied into the CVSROOT directory.

export CVSROOT=$(realpath ../kernel)
cp ../kernel/Modules ../kernel/CVSROOT/modules

Then, we need to make some changes to the modules file. Since the layout here is so basic we don't have to do anything more than give each module a path:

awk '{print $1, "CVSROOT/kernel." $1}' ../kernel/CVSROOT/modules > new_modules
mv new_modules ../kernel/CVSROOT/modules

After that, assuming you're in the directory checkout-dump, you can checkout whatever you want! To check everything out, like I wanted to do for the Sprite kernel, run:

for module in $(cat ../kernel/CVSROOT/modules | awk '{print $1}'); do
	cvs checkout $module
done

This will run through every module and check it out. No need to worry about SCVS specific files like SCVS.config, indexes, or CVSROOT.adm administrative files.