hgでファイルアクセスに失敗したときのエラーのエンコーディングがおかしい気がします

289 views
Skip to first unread message

Hiroyuki Hayashibara

unread,
Oct 27, 2016, 8:50:11 AM10/27/16
to mercurial-ja
はじめまして、もう結構ながくmercurialを愛用している林原と申します。

前々から気にはなっていたのですが、
Windowsでエクセルファイルを開いたままhgで更新をかけてしまったときなどの、

プロセスはファイルにアクセスできません。別のプロセスが使用中です。

というエラーが、HGENCODING=utf-8の時に正しく表示されていないようです。

ちょっと気になったので確認してみました。
Windows 10のTortoiseHG 3.9.2で確認しています。

コマンドラインで、HGENCODINGを設定していない状態では

hg update 20887
中止: プロセスはファイルにアクセスできません。別のプロセスが使用中です。

という表示になりますが、
set HGENCODING=utf-8
をした後で実行すると、

hg update 20887
荳ュ豁「: プロセスはファイルにアクセスできません。別のプロセスが使用中です。

となり、"中止"の部分だけがutf-8になり、後半のエラーはSJISのままになります。

結果的に、TortoiseHG上で文字化けし、謎のエラーになってしまいます。

これは対策は難しいものなのでしょうか?
もし、設定等で回避出来るのであれば、どなたか回避策を教えてもらえると助かります。


仕事ではgitも使っていますが、個人的にはやはりhgが好きです。
ただ、やはり日本語まわりが少々怪しいのが、人にすすめにくい理由になってしまうのが少し残念です。

ちなみに、個人的にhg-fixutf8をhg 3.9系に無理矢理対応させてみましたので、よろしかったら使用してみてください。
https://bitbucket.org/aqrs/hg-fixutf8

あまりhgの仕組みに詳しくない状況で、手探りで修正したのでなにか問題があるかもしれませんが、
現状手元では問題なく使用できています。


Yuya Nishihara

unread,
Oct 27, 2016, 9:25:23 AM10/27/16
to mercur...@googlegroups.com, Hiroyuki Hayashibara
On Thu, 27 Oct 2016 05:38:51 -0700 (PDT), Hiroyuki Hayashibara wrote:
> コマンドラインで、HGENCODINGを設定していない状態では
>
> hg update 20887
> 中止: プロセスはファイルにアクセスできません。別のプロセスが使用中です。
>
> という表示になりますが、
> set HGENCODING=utf-8
> をした後で実行すると、
>
> hg update 20887
> 荳ュ豁「: プロセスはファイルにアクセスできません。別のプロセスが使用中です。
>
> となり、"中止"の部分だけがutf-8になり、後半のエラーはSJISのままになります。

後半は C のラインタイムから来るメッセージです。 Mercurial が管理していない
部分ですので、何もしないと化けます。やっつけられなくはないと思いますが、
できればやりたくないですね。

Katsunori FUJIWARA

unread,
Oct 27, 2016, 11:07:57 AM10/27/16
to mercurial-ja
藤原です。

書いている間に、西原さんから回答が投函されてしまいましたが、折角な
ので投函しておきます(笑)

2016年10月27日 21:38 Hiroyuki Hayashibara <aq...@aqrs.jp>:

> 前々から気にはなっていたのですが、
> Windowsでエクセルファイルを開いたままhgで更新をかけてしまったときなどの、
>
> プロセスはファイルにアクセスできません。別のプロセスが使用中です。
>
> というエラーが、HGENCODING=utf-8の時に正しく表示されていないようです。
>
> ちょっと気になったので確認してみました。
> Windows 10のTortoiseHG 3.9.2で確認しています。
>
> コマンドラインで、HGENCODINGを設定していない状態では
>
> hg update 20887
> 中止: プロセスはファイルにアクセスできません。別のプロセスが使用中です。
>
> という表示になりますが、
> set HGENCODING=utf-8
> をした後で実行すると、
>
> hg update 20887
> 荳ュ豁「: プロセスはファイルにアクセスできません。別のプロセスが使用中です。
>
> となり、"中止"の部分だけがutf-8になり、後半のエラーはSJISのままになります。
>
> 結果的に、TortoiseHG上で文字化けし、謎のエラーになってしまいます。

件のメッセージは、以下のように、提供元/符号化方式の異なるバイト列
が結合されることで、文字化けしています。

文字列 提供元 符号化 設定元
=============== ===================== ====== ======================
"中止" hg コマンド utf-8 HGENCODING=utf-8
"プロセスは~" Windows C ランタイム cp932 OSの「地域と言語」設定
=============== ===================== ====== ======================


> これは対策は難しいものなのでしょうか?
> もし、設定等で回避出来るのであれば、どなたか回避策を教えてもらえ
> ると助かります。

以下、実装を弄らないで済ませる方向限定の話です。

Windows の符号化/国際化周りの話では、概ね以下の2つの手段が話題に
上りますが、本件のようなケースに関しては、役に立ちそうにはありませ
ん。

- システムコードページ設定で対応

言語と符号化方式の紐付けが固定 (例: 「英語(米国)」は cp437)
なので、utf-8 (cp65001) の指定はできない

- コマンドプロンプトでの chcp で対応

chcp は、あくまで「コマンドプロンプトでの表示に関する符号化方
式設定」に過ぎないので、Windows C ランタイムが生成するメッセー
ジには影響を与えない


> 仕事ではgitも使っていますが、個人的にはやはりhgが好きです。
> ただ、やはり日本語まわりが少々怪しいのが、人にすすめにくい理由になってしまうのが少し残念です。
>

日本語ファイル名周りの対応は、ついつい作業が後回しになってしまって
いて申し訳ない限りです…… orz

https://www.mercurial-scm.org/wiki/WindowsUTF8Plan


> ちなみに、個人的にhg-fixutf8をhg 3.9系に無理矢理対応させてみましたので、よろしかったら使用してみてください。
> https://bitbucket.org/aqrs/hg-fixutf8
>
> あまりhgの仕組みに詳しくない状況で、手探りで修正したのでなにか問題があるかもしれませんが、
> 現状手元では問題なく使用できています。
>
>
> --
> from Mercurial 日本語コミュニティ <mercur...@googlegroups.com>
> ※ ヘルプ表示は http://groups.google.com/group/mercurial-ja?hl=ja
> ---
> このメールは Google グループのグループ「mercurial-ja」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには mercurial-ja...@googlegroups.com
> にメールを送信してください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
----------------------------------------------------------------------
FUJIWARA Katsunori(flying...@gmail.com)

Hiroyuki Hayashibara

unread,
Oct 28, 2016, 8:22:43 AM10/28/16
to mercurial-ja
西原さん、藤原さんありがとうございました。

設定どうこうで回避できる問題ではないという事がわかっただけでも助かりました。

折角のオープンソースですから、これを機会にmercurialのソースの中身をみてみようと思います。

それでは失礼いたします。

Hiroyuki Hayashibara

unread,
Oct 28, 2016, 10:12:38 AM10/28/16
to mercurial-ja
その後試行錯誤した結果、
汚いですが自分のローカル処理限定と割り切れば動かす事が出来ました。

--- C:/Build/Python27/Lib/site-packages/mercurial/dispatch.py    Fri Oct 28 23:00:07 2016
+++ C:/Build/Python27/Lib/site-packages/mercurial/dispatch.py    Fri Oct 28 22:59:36 2016
@@ -324,3 +324,3 @@
         else:
-            ui.warn(_("abort: %s\n") % inst.strerror)
+            ui.warn(_("abort: %s\n") % encoding.tolocal( unicode( inst.strerror, 'shift-jis' ) ) )
     except KeyboardInterrupt:

コマンドラインでは動いている感じですので、
TortoiseHgのビルドに挑戦してみたいと思います。

情報頂きありがとうございました。

Reply all
Reply to author
Forward
0 new messages