彷徨えるフジワラ

年がら年中さまよってます

Cygwin 併用時の CVS からの hg convert

Windows 上で CVS リポジトリから hg convert する場合、特に Cygwin 環境と併用しているようなケースでは、改行コード周りで色々混乱する可能性があります。

以下、CVS リポジトリから hg convert する際に、あらかじめ確認しておくべき事柄を列挙しておきます。

※ CVSNT の cvs コマンド併用時の hg convert における障害情報あり

hg convert 時に実行される cvs コマンドの確認

Cygwin 固有のパス設定が自動的に適用される可能性があるため、Cygwin の対話的シェル上での which cvscvs --version 等で特定される cvs コマンドは、hg convert 時に使用される cvs コマンドとは異なる場合があります。

そのため、hg convert で実行される cvs コマンドの確認は、以下の様に hg コマンド経由で行った方が良いでしょう。

$ hg --config alias.cvsversion='!cvs --version' cvsversion

Cygwincvs コマンドが起動される場合は、以下のようなバージョン情報が表示されますが:

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 としては、GNUftp サイトで配布している 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 処理系と、CygwinPython 処理系の、どちらを使用するものであるのかを確認します。

基本的には、Cygwin の対話的シェル上での which hg 実行で出力される hg コマンドが:

  • "C:/Program Files" (or "C:/Program Files (x86)") 配下なら Windows ネイティブ Python 処理系
  • それ以外の場合は CygwinPython 処理系

程度の認識で大丈夫でしょう。Windows ネイティブ版を標準以外の場所にインストールしているような人であれば、わざわざここで説明しなくても、判断できることと思います(笑)

Windows ネイティブな Python 処理系の場合、改行コードは CR/LF ベースになります。

CygwinPython 処理系の場合の改行コードベースは、先述した方法で確認できます。

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 ベースのコマンドで変換」ケースに対応するための修正の提案も検討してみたのですが、物凄くニッチなケースのため、提案が受理される可能性は低そうだなぁ、ということで、二の足を踏んでます(笑)