Cygwin 併用時の CVS からの hg convert
Windows 上で CVS リポジトリから hg convert
する場合、特に Cygwin 環境と併用しているようなケースでは、改行コード周りで色々混乱する可能性があります。
以下、CVS リポジトリから hg convert
する際に、あらかじめ確認しておくべき事柄を列挙しておきます。
※ CVSNT の cvs コマンド併用時の hg convert
における障害情報あり
hg convert 時に実行される cvs コマンドの確認
Cygwin 固有のパス設定が自動的に適用される可能性があるため、Cygwin の対話的シェル上での which cvs
や cvs --version
等で特定される cvs コマンドは、hg convert
時に使用される cvs コマンドとは異なる場合があります。
そのため、hg convert
で実行される cvs コマンドの確認は、以下の様に hg コマンド経由で行った方が良いでしょう。
$ hg --config alias.cvsversion='!cvs --version' cvsversion
Cygwin の cvs コマンドが起動される場合は、以下のようなバージョン情報が表示されますが:
Concurrent Versions System (CVS) 1.12.13 (client/server) Copyright (C) 2005 Free Software Foundation, Inc. : : :
Windows ネイティブな cvs コマンドが起動される場合は、「Windows 向けのビルドである」旨の何らかの表示がある筈です。
例えば、WinCVS や CvsGui、TortoiseCVS 等でも使用されている CVSNT であれば、以下のようなバージョン情報が表示されます。
Concurrent Versions System (CVSNT) 2.5.05 (Gan) Build 3744 (client/server) CVSNT 2.5.05 (Mar 26 2010) Copyright (c) 2008 March Hare Software Ltd. see http://www.march-hare.com/cvspro
なお、CVSNT の cvs コマンドを使用するのであれば、Mercurial 3.3 (2015-02-01 リリース予定) 以降の版を使用してください。
それよりも古い版の Mercurial を CVSNT を組み合わせた場合、後述する改行コードの問題を解消したとしても、CVS からの履歴変換が正しく機能しない障害が確認されています。
CVSNT 以外の Windows ネイティブな cvs としては、GNU の ftp サイトで配布している Windows 向け cvs バイナリもありますが、こちらも上記と同様の挙動がみられました。
Cygwin の改行モードの確認
Cygwin の場合、インストール時に UNIX 改行と DOS 改行のいずれかが選択されます。
以下のコマンドを実行した際に:
$ echo foo | od -t x1
UNIX 改行 (LF) モードであれば、末尾が 0x0a に:
0000000 66 6f 6f 0a 0000004
DOS 改行 (CR/LF) モードであれば、末尾が 0x0d 0x0a になります。
0000000 66 6f 6f 0d 0a 0000005
hg コマンドの確認
hg convert
で使用する hg コマンドが、Windows ネイティブな Python 処理系と、Cygwin の Python 処理系の、どちらを使用するものであるのかを確認します。
基本的には、Cygwin の対話的シェル上での which hg
実行で出力される hg
コマンドが:
- "C:/Program Files" (or "C:/Program Files (x86)") 配下なら Windows ネイティブ Python 処理系
- それ以外の場合は Cygwin の Python 処理系
程度の認識で大丈夫でしょう。Windows ネイティブ版を標準以外の場所にインストールしているような人であれば、わざわざここで説明しなくても、判断できることと思います(笑)
cvs と hg の組み合わせの確認
cvs コマンドと hg コマンドの組み合わせの可否を、改行コードベースで見た場合、以下のようになります。
cvs コマンド | hg コマンド | |
---|---|---|
LF ベース | CR/LF ベース | |
LF ベース | OK | OK |
CR/LF ベース | NG | OK |
改行コードベースが一致しているのが理想ですが、CR/LF ベースの hg コマンドであれば、cvs コマンドが LF と CR/LF のどちらの改行コードベースでも、正しく処理可能(の筈)です。
その一方で、LF ベースの hg コマンドと、CR/LF ベースの cvs コマンドの組み合わせの場合、余計な CR バイトによって、設定ファイルや cvs コマンドの出力解析が正しく実施されません。
また、LF ベースの cvs コマンド/hg コマンドの組み合わせであっても、変換元として指定する CVS ワーキングコピー領域が、CF/LF ベースの cvs コマンドで checkout したものだったりする場合は、やはり変換が上手く行きません。
checkout 時の cvs コマンドの改行コードは、CVS ワーキングコピー領域の適当な階層の管理ファイル (CVS/Root 等) を od -t x1
でダンプした際に、末尾が 0x0a (LF) か 0x0d 0x0a (CR/LF) かで確認できます。
このようなベース改行コードの相違がある場合は、LF ベースの cvs コマンドで改めて checkout したものを使用するのが、簡単・確実だと思われます(配下の管理ファイルを手動でいじる手もありますが……)
ちなみに、上記の「CR/LF ベースの CVS ワーキングコピーから、LF ベースのコマンドで変換」ケースに対応するための修正の提案も検討してみたのですが、物凄くニッチなケースのため、提案が受理される可能性は低そうだなぁ、ということで、二の足を踏んでます(笑)