1. Toshi MARUYAMA
  2. thg-2.1.x-and-1.x-shellext

Wiki

Clone wiki

thg-2.1.x-and-1.x-shellext / Home.ja

[廃止] TortoiseHg Windows シェル拡張 Unicode化

廃止

2011年11月リリースのTortoiseHg 2.2でシェル拡張のUnicode化が本家に取り込まれました。 fixutf8拡張のための新しいリポジトリは、https://bitbucket.org/marutosi/tortoisehg です。

概要

TortoiseHgのWindowsシェル拡張は、エクスプローラでのアイコン表示(アイコンオーバーレイ)と 右クリックメニューの機能を提供します。

2011年08月現在の、2.1.xでは、SJISダメ文字問題とutf-8でのASCII以外は全くダメという問題があります。 このリポジトリでは、これらの問題を解決したdllを配布します。

2011年08月09日に、SJISダメ文字問題対応目的のC++のUnicode化が、 本家のdefault名前付きブランチ(unstable)に取り込まれました。

Mercurial-ja google groupへの ポスト

このwikiは、「ロジック」と「インストール」の部分だけしか英語と日本語の同期は取っていません。 それ以外の部分は日本語独自の内容です。

Logic:ロジック

architectureの図に書かれているように、 .hg/dirstate と .hg/thgstatus のエンコードは以下のようになります。

  1. FixUtf8 extension が有効の場合、UTF-8.
  2. FixUtf8 extension が有効でない場合、CP_ACP(日本語WindowsではCP932≒SJIS)

win32mbcs拡張はエンコードは変わらずSJISです。

dllのエンコード判断ロジック

  1. UTF-8が不正で無い場合、UTF-8。
    環境変数 THG_SHELLEXT_UTF8 を追加し、 false or no を値にすることで、これをスキップできます。
  2. UTF-8が不正な場合、CP_ACP(日本語WindowsではCP932≒SJIS)

日本語の1文字はSJISで2バイト、UTF-8で3バイトなので、SJISをUTF-8と誤判断する可能性は 低いかと思います。 仮にdllで誤判断されても、dllではMercurialの操作は一切しないため、影響ありません。

インストール

ダウンロード

英語の ダウンロード から、dllをダウンロードして下さい。

dllの入れ替え

32ビット

  1. "C:\Program Files\TortoiseHg"にあるTHgShellx86.dllを別の名前に変える(e.g. THgShell-01.dll)
  2. ダウンロードしたdllを"C:\Program Files\TortoiseHg\THgShellx86.dll"として置く
  3. (オプション) 必要に応じて、環境変数 THG_SHELLEXT_UTF8 を追加し、 false or no を値として設定してください。 詳しくは Logic:ロジック を参照してください。
  4. ログアウト
  5. ログイン

64ビットでは"C:\Program Files\Common Files\TortoiseHg\ThgShellx64.dll"として下さい。

ログアウト・ログインの代わりにタスクマネージャでexplorer.exeを停止し新たに立ち上げる方法もあります。

詳しくは、 README.txt をご覧ください。

経緯

2010/08現在、日本語Windowsにおいて、Mercurial本体とTortoiseHgのPython部分については、 win32mbcs extensionを有効にすることによって、0x5cいわゆるダメ文字が含まれるファイルとフォルダを 扱うことができます。

英語のアーキテクチャ の図のように、アイコンオーバレイとメニューの表示はC++で書かれたDLLにて行っています。 std::stringというC++のシングルバイト用のクラスを使っており、これが原因で0x5cが破壊されています。

TortoiseHg 日本語情報

WindowsのC/C++にはTCHARという型があります。それに置き換えるというのも1つの考え方です。

New C++ Shell Extension Plan

std::stringというクラスを使っている以上、std::wstringの方が良いと考えるのも自然です。 しかし、これは相等の労力が必要です。

Issue 672 のコメント

ひょっとしてすでにやっている人がいるかもしれないと思い、bitbucketでのforkを眺めていた所、 Mercurial-jaでの投稿でのTinyfish氏のWideChar化を見つけた、という経緯です。

TortoiseHg Windowsシェル拡張UNICODE化の紹介

2010-09-15現在、以下の理由により本家には取り込まれず、このようなフォークという形になりました。

  • TortoiseHgのPyGTKからPyQt版への移行に伴い、Python部分は、ほぼスクラッチから作り直した
  • C++部分も大幅に変えることに「ためらい」がある
  • CP_ACPの文字列のUTF-8の誤判断は防ぎきれない

詳細な経緯については英語のこちら をご覧下さい。

TODO

Windowsシェル拡張

理想は本家に取り込まれることなのですが・・・

ファイル名にUnicodeを使うかどうかは議論があると思いますが、 簡単に考えを書いておこうと思います。

  • FATのロングファイルネーム(8.3形式でないファイル名)とNTFSはUTF-16で保存されているそうだ
    しかし、UTF-16でもなくUCS-2であるという話も
    http://jp.rubyist.net/magazine/?0025-Ruby19_m17n#f07
  • UnicodeにあってSJISに無い文字が使えないことは問題では無いか?(ハングルなど)
  • Windowsシェル拡張を他のプラットフォーム(Linuxなど)で動かすことは考えられない
  • C++でSJISのためだけに特別な処理を追加するのは如何なものか?
  • Gtk+で行っているような内部コードUTF-8もまた・・・
  • FixUtf8を使う使わないにせよ、Mercurial本体とは完全に独立しているC++ということを考えても、 WideCharは避けられないのでは?
    wchar_tのサイズはコンパイラによって違うが、Microsoftのコンパイラが前提だから2バイト止むなし。 UTF-16のサロゲートペアを考えても・・・

PyQt版のリリース前後にリポジトリか名前付きブランチが分かれると思うので、 それ以降に取り込まれると良いのですが・・・

TortoiseHg本家から2011年3月にリリースされる予定のPyQt版(Ver.2.0になる予定)の シェル拡張は正式リリースまで変更される可能性は低いです。 2010年12月現在、ベータ版の Ver.1.9 がアップロードされています。

http://bitbucket.org/tortoisehg/thg/downloads

TortoiseHg 1.1.x PyGtk用のシェル拡張

以下のコミットによって、TortoiseHgのdefaultブランチはPyQt専用になっています。

changeset:   8345:e04a5c974d53
user:        Steve Borho
date:        Sun Aug 29 22:56:39 2010 -0500
files:       tortoisehg/util/menuthg.py win32/shellext/CShellExtCMenu.cpp
description:
cmenu: update default promoted items, Python menu list


changeset:   8341:812e04b335c3
user:        Steve Borho
date:        Sun Aug 29 22:04:07 2010 -0500
files:       win32/shellext/CShellExtCMenu.cpp
description:
cmenu: update shell context menu for thg commands

* Rename Repository Explorer to Workbench
* drop Datamine, Recovery, Shelve
* keep log for file history (though it does not yet work)

これより前のリビジョンからブランチを作って、PyGtk用のdllを用意しました。

アイコンオーバーレイとメニュー表示は正常に動作すると思います。 しかし、2010-11-19現在、TortoiseHgのPyGTKの画面であるhgtk.exeが、 エクスプローラメニューからの動作に対応していないため、 「追加」などは、SJISダメ文字とUTF-8は正常に動作しません。

TortoiseHg 2.x のPython

TortoiseHg PyQt版 Windows Python部分の諸問題 に分けました。

Python/C++ 共通のエンコード指定の設定ファイル

英語のアーキテクチャ の図に書いたように、こんな感じのファイルが必要では無いでしょうか?

.thgfsencode

fsencode=utf-8
assuming=true
assuming_order = utf-8, cp1251

blank.png

Updated