読者です 読者をやめる 読者になる 読者になる

Windows 環境で hg convert で pserver 接続の CVS リポジトリに接続できない

状況

実際にしたこと

> cvs -d:pserver:user@repository.host:/repo/path checkout somemodule
> hg convert somemodule somemodule-hg 

hg convert を実行すると早々に「そんなリポジトリはない」と言われてしまいます。

なぜ?

convert extension は変換元リポジトリ (CVS) の変更履歴を取得しようとしますが、この時に接続情報として以下が必要です。

  • "BEGIN AUTH REQUEST"
  • CVSROOT
  • ユーザー名
  • パスワード (気休め程度に暗号化されたもの)
  • "END AUTH REQUEST"

これらを LF で結合して送信するのですが、実際に送信したデータを見ると CVSROOT の後ろになぜか CR がありました。
これは convert extension が CVSROOT を作業ディレクトリの管理ファイル (Root) から取得するときの処理が原因でした。

self.cvsroot = open(os.path.join(cvs, "Root")).read()[:-1]

WinCVS なので Root ファイルの改行コードも CRLF になっていて、その CR を取りこぼしてしまったようです *1
「これかー」みたいなことを Twitter で呟いていたら @ さんに「リストから取り出すときに strip() すればいいですよ」と教えて頂いたので、早速試してみたところちゃんと接続出来ました *2

他にも落とし穴が

変換元リポジトリには接続できたのですが、その後の変更履歴を取り出す段になって cvs log コマンドの解析に失敗しているのか、変換後のリポジトリでは全てのリビジョンでファイルが "新規追加" になってしまいました。
リビジョン数も明らかに少なく、@ さんに相談しながら色々と試したのですが、原因究明までは至らずギブアップとなりました。

その後

cygwincvs コマンドでチェックアウトしたものを hg convert したら一発で出来ました。
どう見ても不注意です。@ さん本当にすみませんでした。

*1:ここはものすごく端折っているけど、結局は不注意ですみませんということに。

*2:他にも [:-1] してるところがあるので注意が必要です