svnX

OSXでのSubversionの利用に関するエントリーを既にいくつか上げているが、これといった決定打がなかなか見つけられない。
とりわけWeb系(というかPHP)の開発で「これは使えるかも」と思えた環境は "ZendStudio", "skEdit", "TextMate" そして "Xcode" あたりだが、それぞれの環境に少しずつ問題があり、常用には至っていない。

PathFinderJedit 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の威力がおわかり頂けるだろうか。

トラックバック

コメント

FYIです。
0.9.12 だと、行が変わりますが、同じ手が通じます。

$ diff svndiff.sh.ORG svndiff.sh
79a80,85
> # -- 2007/9/10
> /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"
> # ----------

nobuさんコメントありがとうございます。
MacのSubversion対応は、相変わらず悩ましい問題です。作業効率を少しでも改善しようと、このエントリみたいにsvnXを改造したり、AppleScriptをいじってみたりしていますが、なかなか決め手がありません。
WinにはTortoiseがあって、コマンドラインクライアントが不要なほどの完成度ですが。

先日、PathFinderがSubversion対応しました。Tortoiseと比べるとまだまだですが、対応が始まったことを素直に喜んで、今後に期待したいと思います。
個人的にはSCPluginの使い勝手がが最高だったのだけど、PathFinderとはとても相性が悪いし。


コメントはすぐには反映しません。
ほぼ毎日チェックしていますが、翌日以降の反映となることもあります。

Twitter