Last Update: "2007/05/07 11:51:08 makoto"

devel

cvsync

cvsync は CVS 保管庫の同期を取るソフトウェアです。 もっと簡単に言えば、CVS リポジトリをそっくり写すためのものです。 それを効率よく行なえるような工夫がされています。

同じようなものに CVSup (CVS Update protocol) があります。 しかし これは Modula-3 で書かれていて、 その Modula-3 の処理系は x86 のアセンブリ言語で書かれた部分があるなどの 理由で i386 などの限られた機構(architecture)だけで利用出来ます。 実際には、 cvsup のためだけに作られた限定 modula-3, ezm3 ものがあって、 いくつかのアーキテクチャ用に移植が行なわれているはずです (Mac OS X にも移植されているはずですが上記 URL にはありませんね)。

さて、 これに対して cvsync は、 どの arch でも使えるのが嬉しいところです。

使えるようにするには、 pkgsrc/devel/cvsync/ で make と make install をします。 cvsync サーバでどのようなものを取得出来るかは、 http://www.cvsync.org/に書いてありますが、 次のような形式を使います。

% cvsync cvsync://<host>[:<port>]/
実際には次のような入力と反応になります。
ttyp1:makoto@u2 20:53:00/050126(~/Mail)> cvsync cvsync://cvsync.org/ Connecting to cvsync.org port 7777 Connected to 61.115.120.90 port 7777 Running... Name: cvsync, Release: rcs Comment: CVSync CVS Repository Name: cvsync-www, Release: rcs Comment: To mirror CVSync web pages Finished successfully
上の例では cvsync.org に「何がありますか」と聞きましたが、その代りに cvsync.allbsd.org に聞くと、もっと沢山の一覧が表示されます。

cvsync.conf

cvsync の設定は cvsync.conf に書きます。 /usr/pkg/share/examples/cvsync に設定例があります。それを見て /usr/pkg/etc/cvsync.conf に設定します。 例えば一番簡単な例だと、次のようになります。
config {
        hostname  cvsync.allbsd.org

        collection {
                name netbsd release rcs
                prefix /export/cvsync
        }
}
これは、cvsync.allbsd.org という機械に取りに行って、 「名前が netbsd で、リリース が rcs のもの」を持って来て、それを /export/cvsync の下に置く、と読みます。 つまり、この例では netbsd 関係の CVS 保管庫の全ての内容を /export/cvsync 以下に取得します。

それを実際に実行するには、 上のように書いておいて後は単に cvsync と入力するだけです。 その結果次のようなディレクトリが作られます。

ttypf:makoto@st4200 19:22:08/050126(~)> ls /export/cvsync/ CVSROOT/ htdocs/ othersrc/ pkgsrc/ src/ xsrc/
もし /usr/pkg/etc/cvsync.conf 以外の位置を参照したい時には
cvsync -c ~/etc/cvsync.conf
のように -c を使ってその名前を指定します。 これらの方法で 全部持って来ると、次のような大きさになります。これは 2005/01 現在の数字です。合計では 3.2GBytes くらいになります。
directory size(kBytes)
2005/012006/09
CVSROOT 59 61
htdocs 238,371 490,799
othersrc 22,738 27,253
pkgsrc 398,468 562,714
src 1,864,931 2,511,947
xsrc 642,828 948,898
合計 3,167,396 4,050,873
もし全部ということではなく、src だけが必要という場合なら、cvsync.conf の中の
name netbsd 
と書いてある部分を
name netbsd-src
に変更します。
config {
        hostname  cvsync.allbsd.org

        collection {
                name netbsd-src release rcs
                prefix /export/cvsync
        }
}

ソースの取出

上で cvsync について説明しましたが、これで手元に持って来ると、 それは CVS 保管庫になりますから、後は cvs の操作です。

例えば、この後で、

% mkdir /export/cvs-work % cd /export/cvs-work % cvs -d /export/cvsync co src
と入力すると最新の src を手元に持出せます。

問題

cvs co した時に、次のような問題が起きることがあります。
% cvs [update aborted]: EOF in key in RCS file /export/cvsync/src/distrib/utils/sysinst/factor.c,v
この指摘された譜を rcscan を使って調べると、次のように言われるはずです。
% rcscan /export/cvsync/src/distrib/utils/sysinst/factor.c,v ERROR: /export/cvsync/src/distrib/utils/sysinst/factor.c,v
この場合は、 簡単に言えば、自分のサーバ側の譜がこわれています。可能性は二つあります。
  1. 元のサーバは正常で自分のサーバ側がこわれている
  2. cvsync している元のサーバ側でもこわれている
この一つ目の場合には 単純にこれを消して、もう一度 cvsync をすれば、たいていの場合は解決します。

ただ、これでは、また次のところで同様に操作が必要で、 cvs co を見ている必要があります。そこで、次のようにするのも一つの方法です。

% setenv CVSYNC /export/cvsync ( 一例です) % cd $CVSYNC % find . -name \*,v -exec rcscan -q '{}' \; | awk -F : '{print "rm -f", $2} % find . -name \*,v -exec rcscan -q '{}' \; | awk -F : '{print "rm -f", $2} | sh (または) % find . -name \*,v -exec rcscan -q '{}' \; | awk -F : '{print "rm -f", $2} | tee | sh
(上の例のうち、3 行目は単に確認ですから、実際には不要ですが、初めての時には 御自分で確認のために試して見て下さい)。 この後に cvsync をもう一度実行すると、全て回復するはずです。
desired version
cvs [update aborted]: could not find desired version 1.13 \
     in /e/cvsync/cvsync/pkgsrc/cad/geda-examples/PLIST,v
ttyp0:makoto@tc2120 12:07:19/070411(/export/pkgsrc)> grep  1.13  cad/geda-examples/CVS/Entries

/PLIST/1.13/Mon Oct 23 09:43:13 2006//
Removing this Entries line will fix this problem.
ttyp0:makoto@tc2120 13:19:40/070411(/export/pkgsrc)> cvs update cad/geda-examples
cvs update: Updating cad/geda-examples
cvs update: move away cad/geda-examples/PLIST; it is in the way
C cad/geda-examples/PLIST
cvs update: move away cad/geda-examples/distinfo; it is in the way
C cad/geda-examples/distinfo
ttyp0:makoto@tc2120 13:20:54/070411(/export/pkgsrc)> cvs update cad/geda-examples
cvs update: Updating cad/geda-examples
U cad/geda-examples/PLIST
U cad/geda-examples/distinfo
ttyp0:makoto@tc2120 13:20:56/070411(/export/pkgsrc)> cat  cad/geda-examples/CVS/Entries 
/DESCR/1.1.1.1/Wed Apr 11 03:07:19 2007//
/Makefile/1.15/Wed Apr 11 03:07:19 2007//
/PLIST/1.5/Wed Feb 21 13:23:57 2007//
/distinfo/1.11/Wed Feb 21 13:23:57 2007//
D
ttyp0:makoto@tc2120 13:21:08/070411(/export/pkgsrc)> 
参考:
NetBSD General Commands Manual cvsync(1)
http://www.cvsync.org/man/cvsync.1.html