2014-01-29

git-encwrapper再び

git-encwrapper のバグを修正しました。

git-encwrapper は、gitのencoding属性(.gitattributesで指定)を活用してgit diffの出力の文字コードを統一したり、git applyの入力の文字コードを統一されたものから元に戻したりするgitラッパーです。

ところがCygwinを64bit版にしたときになぜかgit-encwrapperが動かなくなってしまいました。
原因を突き止めるのが面倒だったので、elisp側でなんとかするコードを書きました。

今日 magit.el を開発最新版へ更新したら、案の定上のelispは使えなくなってしまいました。
magit.elの中をざっと見てみたのですが、プロセスを呼び出すところ(つまり、フックすべきところ)が沢山あり、
修正は大変そうでした。

なので、再びgit-encwrapperを復活させることにしました。

調査した結果、次の二つの問題が見つかりました。

  • -cオプションを使っているとgitコマンド名を誤認識する不具合
  • NULLポインタの判定ミス

前者は「git -c diff.submodule=short diff」のようなコマンドラインへの対応です。
ハイフンで始まらない一番最初のコマンドライン引数をコマンド名として扱っていたので、
「diff」ではなく「diff.submodule=short」がコマンド名だと認識されていました。

後者は単純なミスで、if(p)と書くべきところをif(*p)と書いていたというものです。
おそらくこれによって動いたり動かなかったりしていた模様です。

これらを修正したところ、おおむね正常に動いているようです。