fixutf8 拡張が SetConsoleOutputCP を使ってcpを変更することで
utf-8を表示しようとしているのですが、WriteConsleWを使って直接
Unicode文字列を出力したほうが綺麗なんじゃないかと思って、branch を
作ってみました。
http://bitbucket.org/methane/hg-fixutf8-jp/
私は普段 Linux で bzr を使っているので、あまり Windows で hg を使う
ことがありません。軽くテストはしたのですが、まだ pull request を出すほど
自信がありません。
fixutf8 ユーザーの方がおられましたら、 cp932の範囲内の文字と範囲外の
文字が混じったファイル名を add したりlog -v したりして問題がおきないか
試してみていただけないでしょうか?
問題が無いようでしたら pull request を出します。
--
Naoki INADA <songof...@gmail.com>
かなり根本的な問題でした。
hg-fixutf8 は mercurial.dispatch._dispatch を wrap しているんですが、
extension が load されるのって _dispatch の中なんですよね・・・
wrapするのが間に合わなくて、cp932のパスでリポジトリのディレクトリが指定されてしまい、
その後 utf-8 に wrap したバージョンの os.path.exists() してもそんなディレクトリ無いって
なってしまってます。
# 前の mercurial は extnsion の読み込みがもっと手前だったんだろうか・・・
とりあえず、wrap済み関数が入力をutf-8でのdecodeに失敗したときはmbcsでdecodeする
ようにしてみました。
もともと強引なhg-fixutf8がさらに凶暴になりましたが(汗
またpullして試してみてください。
>> やっぱり bzr の方が素性が良い(ファイル名をUnicodeとして扱っている)から日本語対応楽だなぁ・・・
>
> さすがにこれから HG が大幅な設計変更をすることは考えにくいですよね・・・。
> HG は使いやすくていいんですけどねぇ。
bzrもコマンド体系はhgやsvnと似ていて使いやすいですよ。(というかgitが特殊すぎ)
現時点では、GUI等の周辺ツールがパスをUnicodeとして扱ってない部分があったりしてパッチを
送りつけまくっている状況です。でもbzr本体で修正が必要な場合はきちんと本体が修正してくれるので、
hgよりも場当たり的じゃない本質的な修正ができるし、パッチの作りがい・送りがいがあります(笑)
bzrはgitやhgに比べて出遅れていた感があり、PythonのDVCS選定でもhgに負けてしまいましたが、
UbuntuのCanonicalがバックについてることもあってかなりの速度で開発が進んでいます。
あと一年も待たないうちに、胸を張って一般人にお勧めできる状態になるかなーと期待しています。
--
Naoki INADA <songof...@gmail.com>
> File "C:\work\hg-fixutf8-jp\fixutf8.py", line 126, in utf8wrapper
> return fromunicode(orig(*tounicode(args), **kargs))
> File "ntpath.pyc", line 286, in isfile
> AttributeError: 'function' object has no attribute 'S_ISREG'
os.path.stat がモジュールなのに関数と間違えてwrapしてしまっていたのを
修正しました。お手すきの時にまたpullして試してみてください。
でも、こちらでは出ないエラーがなぜ出るんだろう・・・
set LANG=ja しても日本語のメッセージでないし・・・
easy_install したのが間違いだったかな?
> それは楽しみです。bzr の開発力はすごいのはどこかで耳にした気がします。
> bzr は(サイトのレスポンスが悪いけど) 良く出来てる Launchpad がありますしね。
> 最近は異なるリポジトリでも透過的に扱えるツールの開発も進んでいることもあって、
> そのあたりにちょっと期待しています。
Launchpad は、wikiがないのが残念すぎるんですが、その代わりにリポジトリの容量制限が
無かったり、pushするときに(条件がそろえば)勝手に関連リポジトリを探し出して履歴を共有する
形式にしてくれたり、merge requestに対してdiffが見えてコメントが付けられたり、
リポジトリから po ファイルを取り出してWeb上で翻訳できたり、他のプロジェクトから同じ単語を探して
きて翻訳語を提案してくれたり、良い所がいっぱいあります。
bzr はもうすぐ 2.0 が出て、新しい標準のリポジトリフォーマットがデフォルトになるので、
2.0以上が一般的に使われるような状況になったら是非試してみてください。
現時点では、リポジトリフォーマットが乱立していてその互換性問題があるので初心者を
寄せ付けません(笑)
--
Naoki INADA <songof...@gmail.com>
> # hg-fixutf8 は使ってますが、hg-fixutf8-jp はまだ手を出していないです
mercurial のバージョンは幾つでしょうか?
古いバージョンのmercurialで、cp932のファイル名しか使わないのであれば、
オリジナルの hg-fixutf8 でも大丈夫だと思います。
>> ためしに os.path.realpath と os.paht.relpath を wrap するようにしてみました。
>> こちらの手元では init に成功したのですが、試してみていただけますか?
>
> os.paht.relpath ってなにものでしょうか?
> みあたらないですが。
間違えました、 os.path.relpath です。
Python 2.6 から導入された関数ですね。Python 2.5 だと wrap しないように修正しないと。。。
--
Naoki INADA <songof...@gmail.com>
mercurialは可能な限りcrew (+俺パッチ)です。
日本語以外はまず使わない(えない)です。
でもfixutf8-jpの変更内容も目を通してみます。
>>> ためしに os.path.realpath と os.paht.relpath を wrap するようにしてみました。
>>> こちらの手元では init に成功したのですが、試してみていただけますか?
>>
>> os.paht.relpath ってなにものでしょうか?
>> みあたらないですが。
>
> 間違えました、 os.path.relpath です。
そうだとは思って2.5のlibは探ましたが、2.6からでしたか。
どんどん疎くなってる自分...
> Python 2.6 から導入された関数ですね。Python 2.5 だと wrap しないように修正しないと。。。
wrapnames()にてhasattr()してからwrapしてるのでいまのままで大丈夫ですね。
それはともかく、os.path.relpath()ってどこかで使ってましたか?
それとも単に今後の安全のために入れておいたということでしょうか。
同様のことをしている win32mbcs にもかかわる話でもあるので少々気になります。
--
Shun-ichi GOTO
お、良かった。
> それはともかく、os.path.relpath()ってどこかで使ってましたか?
> それとも単に今後の安全のために入れておいたということでしょうか。
> 同様のことをしている win32mbcs にもかかわる話でもあるので少々気になります。
いいえ、使っているかどうか調べていません。
もともと、fix-utf8がmercurial1.3で動かない理由の一つがmercurialがos.path.realpath()を
使っていることだと判明して、それを直すときに名前が近いrelpathもついでにwrapして
おいただけです。
その後 os.path の中身を列挙してできる限りの関数をwrapしました。
でも、拡張のロード順の変更とかあって今の方式ではwrapするのが手遅れっぽいので、
hg起動時にhookをかけるようなhg本体へのpatchという形の方がいい気がします。
--
Naoki INADA <songof...@gmail.com>
ていうか、 mercurial.win32 って、Wじゃない CreateFile やら CreateHardLink やら
使ってるんだなぁ・・・。
やっぱり fix-utf8 みたいに拡張モジュールの形ではなくて、mercurialのforkを作って
Unicode対応にしないときちんとした対応は無理そうです。
# bzr-hg に push 機能を追加するほうが早そうだ・・・
> ちなみに、稲田さん/コダマさん/ゴトウさんは、
> win ネイティブの Python 環境で hg している、ってことで合ってます?
はい。
Pythonはposixに依存しないAPIをたくさん持っていて、cygwinのようなposix互換レイヤが
無くても簡単にクロスプラットフォームなプログラムがかけるので便利ですよ。
--
Naoki INADA <songof...@gmail.com>