ディレクトリ追加失敗時の挙動はアトミックでない

ちょっとびっくりしたので記録。

ディレクトリを追加する操作で、先行の追加に失敗すると後行はローカル作業ディレクトリだけ管理情報が更新されてしまい、リポジトリには存在しない状態になる。

例えばリポジトリ内に hoge が既に存在し、moge は存在しないとする時に、以下のように両方を追加しようとすると

% cvs add hoge moge (←二つのディレクトリを追加しようとする)
cvs [add aborted]: there is a version in hoge already (← hoge は既にある)
% cvs update
cvs update: cannot open directory /repo/module/moge: No such file or directory
cvs update: skipping directory moge (← moge はリポジトリ内に追加されていない)
% find moge
moge/CVS/Root
moge/CVS/Repository
moge/CVS/Entries
(↑しかし、作業ディレクトリ側の管理情報は、できてしまっている…)

cvs って、ディレクトリ操作はやっぱり苦手なのね。教訓としては…、一個づつやれってことかな。