bzrプロキシサーバー問題

サーバー上のsvnリポジトリを、bzr checkoutしようとするが、以下のようなエラーが出て実行できない。

C:\work\src>bzr checkout http://192.168.xx.xx/svn/proj/src/
bzr: ERROR: Transport error: Server refuses to fulfill the request (403 Forbidde
n) for http://192.168.xx.xx/svn/proj/src/.bzr/branch-fo
rmat

この問題は、Internet Explorerの接続設定でプロキシサーバーの使用をオフにすることで回避できる。
bzrはIEの接続設定で設定しているプロキシ例外設定を見てくれないらしい。

https://bugs.launchpad.net/bzr/+bug/330570

MercurialとBazaarのSubversionとの連携を検討する

職場ではSubversion(以下svn)サーバーが公式のソースコードと文書管理のサーバーとなっている。
この公式svnサーバーと連携をとり、手元で利用できる分散型バージョン管理システムが欲しい。

Windowsでの利用を考えているので、Mercurial(以下hg)とBazaar(以下bzr)を候補とした。
GitはWindows対応が良くなさそうなので検討対象からはずした。

サーバーのsvnリポジトリを、ローカルのそれぞれのリポジトリへ変換することをしてみたので、ここまでの状況をまとめておく。


使用環境
========

サーバー

              • -

Windows 2003 server
Subversion 1.4x (TracLightでインストール)

ソフトウェアの開発プロジェクトを管理している。各プロジェクトでは、文書、ソースコード、ヘルプ、取扱説明書などのファイルを管理している。各プロジェクトの全体のファイルサイズは数百MB〜数十GBといろいろ。


クライアント

                      • -

CPU Pentium4 3GHz
Memory 1GB
Windows XP Pro.
Sbuversion 1.6x
TortoiseSVN 1.6x

svnTortoiseSVNを使い、hg,bzrはコマンドラインから使用する。
Tortoiseexplorerの動作速度や安定性を損なうような気がしているので、まだ完成しているとは言い難いhg,bzrのTortoise利用は考えていない。

クライアントはすべてWindowsUnix系のクライアントは無い。

検討したバージョン管理ソフト

                                                      • -

* Mercurial
ver.1.2.1の0x5c問題対策の改変をしたもの
http://d.hatena.ne.jp/kokiya/20090503

Merucurial.ini

[extensions]
hgext.win32text =
hgext.win32mbcs =
[encode]
** = cleverencode:
[encode]
** = cleverencode:

* hgsvn
ver.0.16の日本語ファイル名問題対策の改変をしたもの
http://d.hatena.ne.jp/kokiya/20080920/1221931756

* Bazaar
ver.1.13

* bzr-svn
ver.0.5.3の日本語ファイル名問題対策の改変をしたもの
http://d.hatena.ne.jp/kokiya/20090421


想定している使い方
==================

基本的な使い方

                          • -

公式svnサーバーへコミットするソースコードはビルド可能でスモークテスト程度は実施していることがお約束だが、まだビルドがかからないとか、まだテストしてないとかの状態のソースコードでもコミットしておきたいことがある。

svnのワーキングコピーのファイルをhgまたはbzrでも管理することで、svnサーバーへコミットしないで、手元でローカルコミットできるようにする。

より進んだ使い方

                              • -

svnリポジトリをhgまたはbzrリポジトリへ変換してローカルでバージョン管理を行う。手元では、分散型ならではの自由度の高い構成でバージョン管理を行い、適当なタイミングで手元のリポジトリからsvnサーバーへコミットをする。

hgにはhgsvn, bzrにはbzr-svnという、svnリポジトリをそれぞれのリポジトリへ変換し、svnリポジトリと連携するためのツールがあるので、これらが利用できればOK。


バージョン管理ソフトに望むこと
==============================

日本語対応

                  • -

日本語パス名、日本語コミットログが使えてほしい。ソースコードではさすがに日本語パス名は使わないが、文書やメモでは良く使う。

操作性

          • -

いろいろ面倒なことをしなくても、簡単にsvnリポジトリをそれぞれのリポジトリへ変換したり、連携したりできるとうれしい。


検討内容
========

日本語対応

                  • -

* hg

インストーラでインストールした状態では日本語は使えない。
win32mbcs extensionを手動で有効にすれば、一応日本語は使えるようにはなるが、日本語パス名に関しては以下の制限がある。コミットログの日本語使用は問題ない。

- ファイル名やフォルダ名の最後の文字が2バイト目に0x5cとなる日本語の場合は、コマンドがそのパス名を認識してくれなかったりする。

- ローマ数字や丸囲み文字などの、いわゆる機種依存文字はパス名には使えない。
(機種依存文字を積極的に使いたいというわけではなく、svnでは特に問題が起きないため、他の人が使ってしまい、その結果hgが利用できなくなったり、利用しづらくなるのが嫌ということ。)


* bzr

インストーラでインストールした状態で日本語使用可能である。0x5c文字や機種依存文字も問題ない。
ただし、すべてのコマンドで日本語が問題なく処理されるかどうかは疑問な点もある。例えば、日本語ファイル名でコンフリクトが発生した場合にエラーでコマンドが実行できないことがあった。

http://d.hatena.ne.jp/kokiya/20090421/1240331034

上記のようにhg,bzrともWindowsで動作し、日本語がある程度使えるが、svn連携extensionは残念ながらそうではない。


* hgsvn

Windowsクライアントでhgpullsvnを実行すると、日本語ログや日本語ファイル名で処理が中断してしまう。
また、hgpushsvnは安定版の0.16には無く、開発版に0.17のリポジトリには含まれているが、これもWindows上では動作しない。

(一応Windows上で動作し、日本語も扱えるように改変したものはあることはあるが…。)

* bzr-svn
Windowsバイナリインストーラを使ってbzrをインストールするとbzr-svnもインストールされる。Windows上での動作は問題なさそうだが、日本語パス名が使えないコマンドがある。


リポジトリの変換

                              • -

* hg

svnでは空のフォルダも管理対象にできるのに対して、hgはできないので、あえて空フォルダをバージョン管理しているプロジェクトに含めている場合は、リポジトリをそのまま変換することはできない。

svnリポジトリをhgリポジトリへ変換するのに改変hgsvnを使用した。
ところが、リポジトリ全体を変換しようとすると途中でメモリーエラーで止まってしまう。
比較的サイズの大きいMS Officeの文書ファイルが多数含まれているので、それが原因かと思い、せめてソースコードだけでも変換できないかとソースコードフォルダだけを指定してもやはりメモリエラー発生。

エラーが発生するチェンジセットは決まっていて、そのチェンジセットでは総量600MBくらいのzipファイルやMS Officeファイルが追加されている。特にzipファイルは100〜200MBくらいのファイルが数個追加されている。その後それらのファイルは別のフォルダへ移動されていたので最新リビジョンではソースファイルフォルダには無いのだが、このチェンジセットの変換でメモリエラーが発生するためリポジトリ変換ができない。

PCのメモリが足りないのかもしれないが、同じPCでsvnでは問題なく扱えるので、メモリ必要量が大幅に異なると連携運用は難しいことが多くなるだろう。

結局リポジトリの履歴はあきらめ、hgimportsvn -rオプションによりエラーが発生しないリビジョンからの履歴だけをhgリポジトリで管理するようにした。


* bzr

bzrではsvn同様に空のフォルダも管理対象にできる。

svnリポジトリをbzrリポジトリを変換するのに改変bzr-svnを使用した。
bzr checkoutで変換しようとするが、403 Forbiddenエラーが出て実行できない。

この問題は、Internet Explorerの接続設定でプロキシサーバーの使用をオフにすることで回避できる。

http://d.hatena.ne.jp/kokiya/20090516/1242465351

bzrでもリポジトリ全体を変換しようとすると、hgと同様にメモリーエラーで止まってしまう。
うーむ、やはりPCのメモリが足りないのか?

bzrでは、hgsvnのような変換開始リビジョンの指定機能は見つけられなかったが、

bzr branch --stacked
bzr checkout --lightweight

で特定リビジョンのコードのみ取得することができるらしい。
これらのコマンドを試してみたが、残念ながら日本語パス名でエラーとなってしまう。

http://d.hatena.ne.jp/kokiya/20090511/1242055101

bzr co --lightweightでは、日本語パス名があっても何とかワーキングコピーが取得できるようだが、ちょっと動作が変な気がする。

http://d.hatena.ne.jp/kokiya/20090516/1242492582

bzr自体は比較的日本語対応が良いが、残念ながら、bzr-svnはいろいろ日本語パス名周りを修正しないと使えなさそう。


まとめ
======

Windowsクライアントで、svnサーバーのリポジトリをhgリポジトリ, bzrリポジトリへ変換する際に以下の点が問題になる。

1. 変換時のメモリエラー
2. 日本語パス名

1に関しては、hg, bzrはsvnよりも多くのメモリを消費するため、svnで問題がなくてもhg, bzrでは問題となると考えられる。
svnリポジトリの状況と、リポジトリ変換時に必要とされるクライアントPCのメモリ量の検討が必要。その上で、元のsvnリポジトリの運用(大きなサイズのファイルはコミット禁止にするなど)の検討が必要となってくるだろう。

2に関しては、hg, bzrは日本語パス名にはかなり良く対応しているとはいえsvnのレベルには達していない。また、今回検討したリポジトリ変換に使用したツールは日本語パス名に対応していないのでパッチを当てながら使用せざるを得ない状況である。

上記問題により、svnリポジトリの変換は
hgでは、一部の変換に成功
bzrでは、変換できていない
という状況である。

bzr co --lightweightでワーキングコピー作成

bzr co --lightweightでエラーは表示されるものの、
一応ローカルにワーキングコピーはできているようである。

エラーが気になって、そのまま使う気にはなれないが。

C:\work\proj>bzr init --1.9-rich-root test
Created a standalone tree (format: 1.9-rich-root)

C:\work\proj>cd test

C:\work\proj\test>bzr co --lightweight -v http://192.168.xx.xx/svn/proj/main_app/trunk/src/Doc
bzr: ERROR: [Errno 2] No such file or directory: 'C:/work/proj/test/Doc/trac/.svn/text-base/010\(中略)\xbc.JPG.svn-base'

C:\work\proj\test>tree
フォルダ パスの一覧
ボリューム シリアル番号は 98F1-DBB2 です
C:.
└─Doc
    ├─trac
    └─開発用参考資料

ただし、logは見れない。
"You need to get a newer Subversion client"って、なんのこと?

C:\work\proj\test\Doc>bzr log -l2
bzr: ERROR: This client is too old to work with working copy 'C:\work\proj\test\Doc'.
You need to get a newer Subversion client, or to downgrade this working copy.
See http://subversion.tigris.org/faq.html#working-copy-format-change for details.

逆にbzr branch --stackedでは、ワーキングコピーは作成されないが、logは参照できる。

bzr-svn コマンドと日本語ファイル名

日本語ファイル名がダメそう。

C:\work\bzrtest\msofficesvn>bzr checkout --lightweight http://msofficesvn.google
code.com/svn/trunk/
bzr: ERROR: [Errno 2] No such file or directory: 'C:/work/bzrtest/msofficesvn/tr
unk/msofficesvn_common/doc/design/.svn/text-base/wordsvn, excelsvn\xe8\xaa\xb2\x
e9\xa1\x8c.doc.svn-base'
C:\work\bzrtest>bzr branch --stacked http://msofficesvn.googlecode.com/svn/trunk
/
stacking support in bzr-svn is experimental.
bzr: ERROR: exceptions.UnicodeEncodeError: 'ascii' codec can't encode characters
 in position 53-54: ordinal not in range(128)

Traceback (most recent call last):
  File "bzrlib\commands.pyo", line 716, in exception_to_return_code
  File "bzrlib\commands.pyo", line 911, in run_bzr
  File "bzrlib\commands.pyo", line 547, in run_argv_aliases
  File "bzrlib\builtins.pyo", line 1100, in run
  File "C:/Program Files/Bazaar/plugins\svn\remote.py", line 80, in sprout
  File "bzrlib\bzrdir.pyo", line 1151, in sprout
  File "bzrlib\bzrdir.pyo", line 1481, in create_workingtree
  File "bzrlib\workingtree_4.pyo", line 1394, in initialize
  File "bzrlib\transform.pyo", line 2034, in build_tree
  File "bzrlib\transform.pyo", line 2126, in _build_tree
  File "bzrlib\transform.pyo", line 2179, in _create_files
  File "bzrlib\revisiontree.pyo", line 79, in iter_files_bytes
  File "bzrlib\repository.pyo", line 1550, in iter_files_bytes
  File "bzrlib\knit.pyo", line 1327, in get_record_stream
  File "bzrlib\knit.pyo", line 1432, in _get_remaining_record_stream
  File "bzrlib\knit.pyo", line 1953, in get_record_stream
  File "bzrlib\knit.pyo", line 1977, in _work
  File "C:/Program Files/Bazaar/plugins\svn\versionedfiles.py", line 85, in get_
record_stream
  File "C:/Program Files/Bazaar/plugins\svn\transport.py", line 411, in get_file


UnicodeEncodeError: 'ascii' codec can't encode characters in position 53-54: ord
inal not in range(128)

bzr 1.13 on python 2.5.2 (win32)
arguments: ['bzr', 'branch', '--stacked', 'http://msofficesvn.googlecode.com/svn
/trunk/']
encoding: 'cp932', fsenc: 'mbcs', lang: None
plugins:
  bzrtools             C:\Program Files\Bazaar\plugins\bzrtools [1.13]
  launchpad            C:\Program Files\Bazaar\plugins\launchpad [unknown]
  netrc_credential_store C:\Program Files\Bazaar\plugins\netrc_credential_store
[unknown]
  qbzr                 C:\Program Files\Bazaar\plugins\qbzr [0.9.8]
  svn                  C:\Program Files\Bazaar\plugins\svn [0.5.3]
*** Bazaar has encountered an internal error.
    Please report a bug at https://bugs.launchpad.net/bzr/+filebug
    including this traceback, and a description of what you
    were doing when the error occurred.

Mercurial 1.2.1 2バイト目に0x5c含む日本語ファイル名対応パッチ当て手順

1. Mercurialソースコードを取得

2.日本語ファイル名パッチを取得
http://bitbucket.org/witten/win32mbcs-patch/src/82a80bbc6400/win32mbcs-patch

3.Mercurialのビルド

4.Mercurial 1.2.1のファイル置換
hg.exe
library.zip

library.zipだけ置換すると以下のエラーが表示されるので、hg.exeの置換も必要。

C:\Documents and Settings\koki>hg
LoadLibrary(pythondll) failed指定されたモジュールが見つかりません。
C:\Program Files\Mercurial\PYTHON25.DLL

これらのファイルは以下においてある。
http://bitbucket.org/kokiya/hg-121/src/tip/bin/

[注記]
- changeset: 8266:52c5be55af82に対して、
http://bitbucket.org/witten/win32mbcs-patch/src/8ff1831639d4/win32mbcs-patch
のパッチを当ててみたが、うまくいかなかった。
2バイト目が0x5cを含む文字がファイル名に入っていると、hgコマンドでエラーとなった。

- library.zip中のwin32mbsc.pyc, util.pycを置き換えれば良さそうな気もするが、LHMelting v.1.62.5.26 で置き換えを試したが、以下のエラーが表示され置き換えはできなかった。

zip warning: local header not found for BaseHTTPServer.pyc
zip error: Zip file structure invalid (C:/Program Files/Mercurial/library.zip)

また、いったん解凍した.pycファイルを LHMeltingで、無圧縮でzipファイルにしてもhgは動作しなかった。

[参考]
http://witten-note.blogspot.com/2009/03/mercurial0x5cpatch.html

- bazaarでは可能だったライブラリzipファイルの展開しての利用も不可

bazaarでは可能だったlibrary.zipを展開しての使用はMercurialでは不可。
http://d.hatena.ne.jp/kokiya/20090425/1240684376

C:\Documents and Settings\koki>hg version
LoadLibrary(pythondll) failed指定されたモジュールが見つかりません。
C:\Program Files\Mercurial\PYTHON26.DLL