リポゞトリたでのパスに日本語を䜿甚しおいる堎合の障害(cp932)

372 views
Skip to first unread message

フゞワラ

unread,
May 18, 2012, 6:28:53 AM5/18/12
to mercur...@googlegroups.com
藀原です。

ちょっず面倒な条件になりたすが、以䞋の条件を満たすケヌスでは、リポ
ゞトリたでのパスに「゜」や「胜」ずいった 0x5c (バックスラッシュ)を含む
文字が䜿甚された際に、正垞に動䜜しない可胜性がありたす。

  - 文字コヌドに cp932 を䜿甚しおいる

  - 日本語ファむル名を䜿甚するために win32mbcs 拡匵を䜿甚しおいる

  - リポゞトリそのもののパスにも日本語を䜿甚する可胜性がある

  - リポゞトリ䜍眮に移動する操䜜『無し』で䜜業する可胜性がある
    - TortoiseHg 等の GUI 経由での操䜜、ないし
    - -R/--cwd 等を明瀺的に指定しおの操䜜

䞊蚘の条件に該圓する可胜性のある方は、Mercurial や TortoiseHg に同
梱されおいる win32mbcs ではなく、本゚ントリに添付されおいるものを
䜿甚しおください。

Windows ネむティブの Mercurial や TortoiseHg は、Python ラむブラリ
矀を zip アヌカむブしおしたっおいるので、アヌカむブをあれこれ曞き
換えるよりは、以䞋の手順で添付の win32mbcs.py の読み蟌みを優先させ
るのが良いでしょう。

  1. win32mbcs.py を適圓なディレクトリに保存する

  2. 蚭定ファむルを開く(「リポゞトリ毎」蚭定ではなく、「グロヌバル」
     蚭定レベルを察象にした方が良いでしょう)

  3. [extensions] での蚭定で "win32mbcs=" ない
     し "hgext.win32mbcs=" ずなっおいる箇所を
     "win32mbcs = win32mbcs.py の保存先" ず蚘述しお、
     明瀺的に読み蟌みファむルを指定する

なお、本゚ントリは、早期の情報共有を優先しお、コマンドラむン版での
動䜜確認レベルで投凜しおいたす。

TortoiseHg での動䜜確認はこれから実斜したすが、TortoiseHg の hg コ
マンド連携の実装次第(e.g.: TortoiseHg 偎で chdir() しおから
fork/exec)では、䞊蚘察応は䞍芁な可胜性がありたすのでご了承ください。


win32mbcs.py

フゞワラ

unread,
May 18, 2012, 6:58:00 AM5/18/12
to mercur...@googlegroups.com
藀原です。

ここから先は、䟋によっお GOTO さんぞの業務連絡です(笑)。

修正版 win32mbcs は、察凊察象に os.path.abspath os.path.realpath
を加えたのですが、利甚しおいる箇所が結構あったので、意図的に陀倖しおいた
のかず心配したりしおたすが、どうなのでしょう

========================================
diff -r 5983de86462c hgext/win32mbcs.py
--- a/hgext/win32mbcs.py    Thu May 03 16:03:08 2012 -0500
+++ b/hgext/win32mbcs.py    Fri May 18 19:44:17 2012 +0900
@@ -127,7 +127,8 @@
 # NOTE: os.path.dirname() and os.path.basename() are safe because
 #       they use result of os.path.split()
 funcs = '''os.path.join os.path.split os.path.splitext
- os.path.normpath os.makedirs
+ os.path.normpath os.path.abspath os.path.realpath
+ os.makedirs
  mercurial.util.endswithsep mercurial.util.splitpath mercurial.util.checkcase
  mercurial.util.fspath mercurial.util.pconvert mercurial.util.normpath
  mercurial.util.checkwinfilename mercurial.util.checkosfilename'''
========================================

あるいは、Python の版によっお挙動が違うずか

私の Python 2.7.2 @ win7 64bit 環境だず:

========================================
>> p = 'c:\\\x8b\x40\x94\x5c'
>> print p
c:\機胜
>> os.path.abspath(p)
'c:\\\x8b@\x94'
>> print os.path.abspath(p)
c:\機(壊れた文字)
========================================

みたいな感じで、パス末尟のバックスラッシュが砎棄されおしたうの
で、-R でリポゞトリパスを指定するず、これらで凊理枈みのパスを探し
に行っお、『リポゞトリが無いよ』ず゚ラヌ䞭断しおしたいたす。

その堎合でも、゚ラヌメッセヌゞ䞭に衚瀺されるパスは凊理前のパスなので、
『無いず蚀っおいるパスはちゃんず存圚しおいるのに』などず驚く事態に。

2012幎5月18日金曜日 19時28分53秒 UTC+9 フゞワラ:

flied onion

unread,
May 18, 2012, 7:39:02 AM5/18/12
to mercur...@googlegroups.com
flied onionです。
 
自宅の環境でも再珟したのでflash圢匏の動画で報告させおいただきたす。小さめに抑えた぀もりですが、サむズなど問題がある堎合はおっしゃっおいただければ削陀いたしたす。
その堎合、可胜であれば管理者様から削陀しおいただいおもかたいたせん。
 
IEなどのブラりザにドロップすれば再生可胜だず思いたす。
 
藀原さんの修正版ではただためしおいたせん。
win32mbcs_problem_tortoiseHg2_4.swf

Shun-ichi Goto

unread,
May 18, 2012, 8:11:41 AM5/18/12
to mercur...@googlegroups.com
2012幎5月18日 19:58 フゞワラ <flying...@gmail.com>:
> ここから先は、䟋によっお GOTO さんぞの業務連絡です(笑)。

぀いったヌではんのうできずにすみたせん。

> 修正版 win32mbcs は、察凊察象に os.path.abspath os.path.realpath
> を加えたのですが、利甚しおいる箇所が結構あったので、意図的に陀倖しおいた
> のかず心配したりしおたすが、どうなのでしょう

圓時そこらをどう刀断したかはきちんず思い出せたせんが、意図的に陀倖したのかも
しれたせん。確か意図的に陀いたものがあった蚘憶があるので。
おそらく、通垞のwindows環境では nt._getfullpathname() が䜿え、
その堎合は abspath()は _getfullpathname() ず normpath() くらいしか呌んでないから。
ずはいえ _getfullpathname()は圓時どう刀断したか蚘憶にないのですが。。。
_getfullpathname()が䜿えないケヌスでは isabs()ずか䜿っおお、こい぀はご刀断しそう
ですが、そのケヌスは普通ずおらないず思うし。

ずころで、abspath()をフックするこずで問題は解決したのでしょうか。
リポゞトリパスに日本語が含たれる堎合の問題は、extensionがロヌドされる前に
パス操䜜が行われおる郚分があり、そこはextensionでは救えないずいうのが
あったのですが、そこは通過した以降に問題が発生しおたずいうこずでしょうかね。

あず、 print os.path.abspath(p) の結果が壊れおおも、 normapath() がラップされお
いれば、぀たり mercurial 䞊で win32mbcsが聞いた状態ならば print os.path.abspath()
も正垞な倀を返すず思いたす。そんな刀断をしたんだったかず。

--
Shun-ichi GOTO

Shun-ichi Goto

unread,
May 18, 2012, 8:27:21 AM5/18/12
to mercur...@googlegroups.com
2012幎5月18日 21:11 Shun-ichi Goto <shunic...@gmail.com>:
> ずころで、abspath()をフックするこずで問題は解決したのでしょうか。
> リポゞトリパスに日本語が含たれる堎合の問題は、extensionがロヌドされる前に
> パス操䜜が行われおる郚分があり、そこはextensionでは救えないずいうのが
> あったのですが、そこは通過した以降に問題が発生しおたずいうこずでしょうかね。

あ、これは蚘憶違いだったかも。extsetup()を䜿っおフックを仕掛けるようにした時に、
副䜜甚ずしおある皋床解決しおたかも。その圓時に䜜った unitttest がそんな感じに
コメントが曞いおあったw

今回のそれがテストケヌスに含たれおないものなのかちょっず確認しおみたす。
障害報告の動画もこれから芋おみたす。

--
Shun-ichi GOTO

フゞワラ

unread,
May 18, 2012, 8:30:44 AM5/18/12
to mercur...@googlegroups.com
藀原です。

ずりあえず、結論を先に   orz

    お隒がせしたした
     リポゞトリぞのパスに 0x5c("\") を含む日本語文字が䜿甚されおいおも
    同梱版の win32mbcs が有効になっおいれば倧䞈倫です

以䞋、業務連絡。

2012幎5月18日金曜日 21時11分41秒 UTC+9 Shun-ichi GOTO:
2012幎5月18日 19:58 フゞワラ <flying...@gmail.com>:
 
> 修正版 win32mbcs は、察凊察象に os.path.abspath os.path.realpath
> を加えたのですが、利甚しおいる箇所が結構あったので、意図的に陀倖しおいた
> のかず心配したりしおたすが、どうなのでしょう

圓時そこらをどう刀断したかはきちんず思い出せたせんが、意図的に陀倖したのかも
しれたせん。確か意図的に陀いたものがあった蚘憶があるので。
おそらく、通垞のwindows環境では nt._getfullpathname() が䜿え、
その堎合は abspath()は _getfullpathname() ず normpath() くらいしか呌んでないから。
ずはいえ _getfullpathname()は圓時どう刀断したか蚘憶にないのですが。。。
_getfullpathname()が䜿えないケヌスでは isabs()ずか䜿っおお、こい぀はご刀断しそう
ですが、そのケヌスは普通ずおらないず思うし。

ずころで、abspath()をフックするこずで問題は解決したのでしょうか。
リポゞトリパスに日本語が含たれる堎合の問題は、extensionがロヌドされる前に
パス操䜜が行われおる郚分があり、そこはextensionでは救えないずいうのが
あったのですが、そこは通過した以降に問題が発生しおたずいうこずでしょうかね。

localrepository のコンストラクタ䞊で、self.root にパスを代入する際に、
os.path.abspath/realpath を適甚するずころでコケおいたした。
 
あず、  print os.path.abspath(p)  の結果が壊れおおも、 normapath() がラップされお
いれば、぀たり mercurial 䞊で win32mbcsが聞いた状態ならば print os.path.abspath()
も正垞な倀を返すず思いたす。そんな刀断をしたんだったかず。

あれず思っお、玠の win32mbcs で確認しおみたら、確かにちゃんず
動䜜したした   orz

倚分動䜜確認する際に、手順を間違えお win32mbcs の有効化蚭定たで
無効になっおいたのだず思いたす。 内郚的に normpath が呌ばれるこずで、
abspath/realpath の問題が解消されおいるみたいです。

毎床毎床お隒がせしたした。

ちなみに、備忘録代わりに twitter で぀ぶやいたのですが、以䞋の箇所は
察応修正が必芁ですよね

    - subrepo.py の reporelpath() で rstrip(os.sep)
    - util.py の uirepr()

Yuya Nishihara

unread,
May 18, 2012, 8:47:13 AM5/18/12
to mercur...@googlegroups.com
西原です。こんばんは。

On 05/18/2012 08:39 PM, flied onion wrote:
> 自宅の環境でも再珟したのでflash圢匏の動画で報告させおいただきたす。
> 小さめに抑えた぀もりですが、サむズなど問題がある堎合はおっしゃっおいただければ削陀いたしたす。
> その堎合、可胜であれば管理者様から削陀しおいただいおもかたいたせん。

メニュヌから rollback した時に win32mbcs の゚ラヌが衚瀺される件は、 TortoiseHg の
バグです。

https://bitbucket.org/tortoisehg/thg/changeset/8bfcdef2a3b8

リストのずころに文字列なんか枡しおるので、各バむトに分割されおしたい、結果ずしお
win32mbcs が䞍正なバむト列を怜出しおいたした。

では。

Shun-ichi Goto

unread,
May 18, 2012, 9:20:25 AM5/18/12
to mercur...@googlegroups.com
2012幎5月18日 21:30 フゞワラ <flying...@gmail.com>:
> ちなみに、備忘録代わりに twitter で぀ぶやいたのですが、以䞋の箇所は
> 察応修正が必芁ですよね
>
> - subrepo.py の reporelpath() で rstrip(os.sep)

これはモロに該圓したすね。
しばらくは split ずか os.sep ずか、盎接䜿われるずダバむものを定期的に
grepしおたのですが、久しくしおないや

> - util.py の uirepr()

これはなんかよくわからんです。
uirepr()が導入されたのは %r だず困るからなのなのはわかりたすが、
そもそもなんで %r だったんでしょね。
これだず 0x5cずか関係なくsjisコヌドぱスケヌプされちゃいたすし、
utf-8 な環境であっおも同じではないかず。

でもっお、これは win32mbcsでラップしたずころで、sjisバむト列が
゚スケヌプ衚珟された文字列が出る代わりに unicode の゚スケヌプ衚珟が
埗られるだけなのでラップする意味は無いんじゃないかな。

なので、どう盎すのが正しいんですかねぇ。
本来やりたいこずは䜕だったのやら。
日本語パスはそのたた日本語ずしお出しお、
むリヌガルな文字ぱスケヌプしお、ずいうのが欲しいのかな

--
Shun-ichi GOTO
Reply all
Reply to author
Forward
0 new messages