ctm
— source code
mirror program
ctm |
[-cFklquv ] [-b
basedir] [-B
backup-file] [-e
include-regex] [-t
tar-command] [-T
tmpdir] [-V
level] [-x
exclude-regex] file ... |
The ctm
utility was originally “Cvs
Through eMail”, but now instead it seems more fitting to call it
“Current Through eMail”.
The ctm
utility is now meant to be the
definitive way to make and apply a delta between two versions of a directory
tree.
There are two parts to this, making the delta and applying it.
These are two entirely different things.
To apply a CTM delta, you pass it to the
ctm
command. You can pass a CTM delta on stdin, or
you can give the filename as an argument. If you do the latter, you make
life a lot easier for your self, since the program can accept gzip'ed,
bzip2'ed, or xz'ed files and since it will not have to make a temporary copy
of your file. (If you pass it an xz'ed file, and xz is not part of your base
system, you will have to install xz from the ports.) You can specify
multiple deltas at one time, they will be processed one at a time. Deltas
that are already applied will be ignored.
The ctm
command runs in a number of
passes. It will process the entire input file in each pass, before
commencing with the next pass.
Before working on a file name
ctm
first checks for the existence of the file
name.ctm. If this file exists,
ctm
works on it instead.
Pass 1 will verify that the input file is OK. The syntax, the data
and the global MD5 checksum will be checked. If any of these fail,
ctm
will simply reject the input file.
Pass 2 will validate that the directory tree is in the state
expected by the CTM delta. This is done by looking for files and directories
which should/should not exist and by checking the MD5 checksums of
files.
If a backup-file had been specified using
the -B
option, all files that would be modified by
this ctm
invocation are backed up to this file using
the archiver command specified by the -t
option. The
default archiver command is tar -rf %s -T -
.
Pass 3 will actually apply the delta.
The list of files that would be modified by
ctm
is subject to filtering regular expressions
specified using the -e
and
-x
options. The -e
and
-x
options are applied in order of appearance on the
command line. The last filter that matched a given file name determines
whether the file would be operated on or left alone by
ctm
.
The ctm
utility will extract the file
hierarchy below its working directory. Absolute filenames or filenames
containing references through ‘.’ and
‘..’ are explicitly prohibited as a
security measure.
-b
basedir
- Prepend the path basedir to every filename.
-B
backup-file
- Backup all files that would be modified by this CTM run to
backup-file. If any filters are specified using the
-e
and -x
options, then
the final set of files backed up are those that would be modified by CTM
after the filters are applied.
-c
- Check it out, do not do anything.
-e
regular_expression
- Match each name in the CTM file against
regular_expression, and if it matches process the
file, otherwise leave it alone. There may be any number of these options.
Use of this option disables the .ctm_status
sequence number checks. For example, the expression
^usr.sbin/ctm
for example, will select the
usr.sbin/ctm source directory and all pathnames
under it.
Pathnames can be disabled from being considered by CTM using
the -x
option.
-F
- Force.
-k
- Keep files and directories and do not remove them even if the CTM file
specifies they are to be removed. If the
-B
option
is specified, these files and directories will not be backed up.
-l
- List files that would be modified by this invocation of CTM and the
actions that would be performed on them. Use of the
-l
option disables the
.ctm_status checks and integrity checks on the
source tree being operated on. The -l
option can
be combined with the -e
and
-x
options to determine which files would be
modified by the given set of command line options.
-q
- Tell us less.
-t
tar-command
- Use tar-command instead of the default archiver
tar
. This option takes effect only if a backup
file had been specified using the -B
option. A %s
in the tar command will be replaced by the name of the backup file.
-T
tmpdir
- Put temporary files under tmpdir.
-u
- Set modification time of created and modified files to the CTM delta
creation time.
-v
- Tell us more.
-V
level
- Tell us more. Level is the level of verbosity.
-x
regular_expression
- Match each name in the CTM file against
regular_expression and if it matches, leave the file
alone. There may be any number of these options. Use of this option
disables the .ctm_status sequence number checks.
Pathnames can be selected for CTM's consideration using the
-e
option.
On its own, CTM is an insecure protocol - there is no
authentication performed that the changes applied to the source code were
sent by a trusted party, and so care should be taken if the CTM deltas are
obtained via an unauthenticated medium such as regular email. It is a
relatively simple matter for an attacker to forge a CTM delta to replace or
precede the legitimate one and insert malicious code into your source tree.
If the legitimate delta is somehow prevented from arriving, this will go
unnoticed until a later delta attempts to touch the same file, at which
point the MD5 checksum will fail.
To remedy this insecurity, CTM pieces generated by FreeBSD.org are
cryptographically signed in a format compatible with the GNU Privacy Guard
utility, available in /usr/ports/security/gpg, and the Pretty Good Privacy
v5 utility, /usr/ports/security/pgp5. The relevant public key can be
obtained by fingering ctm@FreeBSD.org.
CTM deltas which are thus signed cannot be undetectably altered by
an attacker. Therefore it is recommended that you make use of GPG or PGP5 to
verify the signatures if you receive your CTM deltas via email.
TMPDIR
, if set to a pathname, will cause
ctm to use that pathname as the location of temporary file. See
tempnam(3),
for more details on this. The same effect may be achieved with the
-T
flag.
.ctm_status contains the sequence number
of the last CTM delta applied. Changing or removing this file will greatly
confuse ctm
.
.svn_revision contains the revision number
emitted by SVN (to reference when discussing sources with users of
svn
direct).
Using the -e
and
-x
options can update a partial subset of the source
tree and causes sources to be in an inconsistent state. It is assumed that
you know what you are doing when you use these options.
cd ~cvs
/usr/sbin/ctm ~ctm/cvs-*
To extract and patch all sources under `lib'
cd ~/lib-srcs
/usr/sbin/ctm -e '^lib' ~ctm/src-cur*
Numerous messages, hopefully self-explanatory. The “noise
level” can be adjusted with the -q
,
-v
and -V
options.
Initial trials were run during the work on
FreeBSD 1.1.5, and many bugs and methods were hashed
out.
The ctm
command appeared in
FreeBSD 2.1.