svnX
2006/09/10 17:16
OSXでのSubversionの利用に関するエントリーを既にいくつか上げているが、これといった決定打がなかなか見つけられない。
とりわけWeb系(というかPHP)の開発で「これは使えるかも」と思えた環境は "ZendStudio", "skEdit", "TextMate" そして "Xcode" あたりだが、それぞれの環境に少しずつ問題があり、常用には至っていない。
PathFinderやJedit Xへの思い入れが強いことも、新しい環境(とりわけIDE)への移行を踏みとどまらせている。
Mac版TortoiseSVNとも言える "SCPlugin" はなかなかの優れものだったが(TortoiseSVNと比較すると未成熟は部分があったが)、PathFinder 4.xと併用したときの相性がすこぶる悪く、能率わるきことこの上なかった。かくなる事情から、Subversion操作は原則的にターミナルから、せいぜい補助的にAppleScriptによるサポートツールが併用出来ていた程度だった。
「Subversionまわりの開発フローを効率化したい」という願いはかねてからあった。言わば、GUIによる「ツールキットアプローチ」と言ったところか。そこで、最近試しにsvnXというツールを使い始めた。
コンテクストメニューとして実装されているSCPluginは、UI面から見ればスマートである一方で、システムに対してデリケートな一面があるのに対し、svnXは普通のアプリケーションである故に気軽に利用出来る。純粋なCocoaアプリなので、Java VMで動くツール特有の違和感もない。
以前から知っていたツールではあるけど、改めて使ってみると出来は悪くなくて、このままぼくの開発フローに定着させられそうな見込みだ。
開発中一番よく開くであろうウィンドウ「ワーキングコピーインスペクタ」には、常時 "svn status" の状態が表示される。
インスペクタのツールバーに表示される "FileMerge" ボタンは、 "svn diff" をグラフィカルに表示するオススメ機能。便利ではあるが、デフォルトではツールバー上に表示されていないボタンであり、かつツールバー以外から実行出来ない機能である為、これを利用する為にはインスペクタのツールバーをカスタマイズする必要がある。(ツールバー上で右クリック)
このFileMergeボタンから呼出されるのは、Apple純正の同名コマンド。(Xcode Toolsに含まれている)
このAppleのFileMergeコマンドだが、グラフィカルな、素晴らしく分かりやすいテキスト差分を表示する反面、ShiftJISテキストにのみ対応というしょーもない仕様となっており(UTF-8等のテキストを強引に食わせると、なんと落ちてしまう)、大変惜しくはあるが、そのままでは全く使い物にならない。
この件への対応ではヘチマ_BLOGさんのTIPSが有名だが、svnXと併用する今回のケースでは、残念ながらそのまま適用出来ない。FileMerge側ではなく、svnX側をハックする必要がある為だ。
前置きがとても長くなってしまったが、その改造ネタが今回の本題。
svnXの実体であるsvnX.appパッケージを開くと、 "Contents/Resources/" の中に怪しげなシェルスクリプトがたくさん見つかるが、その中に "svndiff.sh" なるスクリプトがある。
これぞ、ツールバー上のFileMergeボタンを押した時に、FileMergeコマンドを実行する為のスクリプト。こいつに、以下のパッチを当てよう。(対象となるsvnXのバージョンは0.9.8)
72a73,80 > > # -- 2006/9/9 tkoishi@b-shock.co.jp -- > /usr/local/bin/nkf -sLu "$firstFile" > "/tmp/svnx-opendiff_$$.tmp.nkf" > /usr/local/bin/nkf -sLu "$secondFile" > "/tmp/svnx-opendiff2_$$.tmp.nkf" > firstFile="/tmp/svnx-opendiff_$$.tmp.nkf" > secondFile="/tmp/svnx-opendiff2_$$.tmp.nkf" > # ---------- >
ご覧頂けばおわかりと思うが、FileMergeにテキストファイルを渡す前にnkfを通して、ShiftJISコード・LF改行に変換したテンポラリファイルを生成している。
/usr/local/bin/nkfを呼んではいるが、iconvコマンド等でも代用出来るかも。参考にさせて頂いたヘチマ_BLOGさんのエントリでは、PHPのmb_convert_encoding関数を使った例を紹介している。
以下、ぼくのMacBookで実際に利用しているところ。
FileMergeの威力がおわかり頂けるだろうか。

