Ctm is a system which was designed by Poul-Henning Kamp for making changes to a source tree available on a daily basis by email. This is a good way to stay up to date with the current source- or cvs-tree if you have a bad internet connection - for instance via modem.
Ctm uses very low bandwidth for distributing the changes to the tree, and compresses them using gzip -9.
The basic idea of ctm is that you subscribe to a special mailing list for a particular source tree. Each day you receive an email message containing all the changes to that tree during that period. One set of differences is called a "delta".
You begin with a base set against which later deltas are patched. To begin using ctm you must grab the latest base set and all deltas after that; once you have processed those you can process later deltas you receive on the mailing list. The base sets are split into pieces of 1400k each for easier downloading over bad lines and you can even put them onto floppies this way.
Bases are generated approximately once every 100 relative deltas, so you never have to grab more than 100 deltas to catch up.
As mentioned above, the base set contains a full source tree in TAR format, and is thus quite large. You must obtain the base set and all relative deltas up to present via ftp from the site listed below. Sizes are:
Larger ctm updates are rare, though, usually occurring only after a major import of something like binutils, perl, etc.
There are several mailing lists related to ctm. There is a list for updates to the updates to cvs tree, a list for the source tree, a list for the X11 part of both and one for the ports tree plus a list for seeing log messages from the ctm delta generator runs.
The following commands will subscribe you to the appropriate lists:
For the cvs tree (without the X11 part):
echo subscribe OpenBSD-cvs | mail majordomo@OpenBSD.org
For the X11 part of the cvs tree:
echo subscribe OpenBSD-cvs-x11 | mail majordomo@OpenBSD.org
For the source tree (without the X11 part):
echo subscribe OpenBSD-src | mail majordomo@OpenBSD.org
For the X11 part of the source tree:
echo subscribe OpenBSD-src-x11 | mail majordomo@OpenBSD.org
For the ports tree:
echo subscribe OpenBSD-ports-ctm | mail majordomo@OpenBSD.org
For the ctm log list:
echo subscribe ctm-log | mail majordomo@OpenBSD.org
It is no longer necessary to keep these files around, if you're sure you've got a complete tree. However, be sure to note the number of the base, before continuing.
You now need to grab the deltas which have been generated since the base
was generated. Go to the ftp site below in the subdirectory
OpenBSD-cvs or OpenBSD-src for instance and grab
every file whose number is
The addresses for the base and deltas are:
It will take some time to run all of the deltas, but the daily invocations of ctm_rmail and ctm will not take nearly as long.
This depends on your diskspace, among other factors. Since ctm doesn't yet deal with files which have been modified outside of the ctm process, the "better" choice is probably the cvs-tree. Then you can check out your working source tree from your cvs-tree, and keep your local mods in your source tree, leaving only ctm to touch your cvs tree.
The drawback, however, is the amount of diskspace it takes. A checked-out source tree takes about 300Mb or so, but if you have your own cvs tree you need 400Mb or so for it, plus another 300Mb for the checked out tree.
This doesn't count the 100Mb or more you will need to do a build (depending on the architecture).
If you just get the source tree, you will need to deal with local modifications. One way to do this is to use the union filesystem, although there have been reports that the union filesystem can be unstable if both the upper and lower layers reside on the same physical filesystem. If you place your upper and lower layers on separate filesystems you should have no problems. A sample of this is as follows:
Suppose your ctm-updated tree is in /usr/src-ctm, and your real
source tree, the one you make your modifications to and do your builds from,
is in /usr/src. /usr/src should be initially an empty
directory. The following command will set up the union mount:
mount -t union -o -b /usr/src-ctm /usr/src
Modifications made to files in /usr/src will become a file contained within
/usr/src, hiding the one in src-ctm. If changes are made via ctm to the
underlying src-ctm tree, those changes will not be seen if there is
a file in the upper layer hiding it.
You should periodically unmount the
union and search for files which are local to the union filesystem.
umount /usr/src
find /usr/src -type f
The commands ls -W and rm -W will be useful too, as objects
named "whiteouts" in /usr/src will also hide files in src-ctm.
If you get the cvs-tree, you can use the "cvs checkout" command to check
out a source tree from it, and each time you update with ctm you can use
the "cvs update" command to update your source tree.
To get an initial src tree:
cd /usr
cvs -qd YOUR_CVS_TREE checkout src
and after each ctm update:
cd /usr/src
cvs -q update -PAd
You can also contact the OpenBSD mailing lists or myself if you have difficulties with ctm, although my free time tends to be rather limited.
Summary:
I will make any important notes and announcements about ctm in:
NOTE: If you use ctm for OpenBSD, please send me email so I know how many people are using it!
Good luck!
t