WinMergeをSubversionのdiffとして使用する – てんぷらメモの方法でSubversionの外部DIFFツールにWinMergeを設定したけど上手くいかなかった。WinMergeに渡される比較用の一時ファイル(tmpfile.tmp)が存在しない為にWinMergeのファイル選択のダイアログが表示されてしまう。
色々と検索ワードを変えて調べてみたが解決せず。ふと”subversion diff tempfile.tmp”で検索したらドンピシャリ。Subversion r12がヒット。2ちゃんねるの過去ログでしょうか。
138デフォルトの名無しさんsage2009/12/02(水) 01:52:09
ttp://terai.xrea.jp/Subversion/WinMerge.html
このページを参考にWinMergeをSubversionのdiffとして使用する設定を行ったのですが
svn diff test.txt
はうまくいきますが
svn diff -r 100 test.txt
はWinMergeのファイル指定のダイアログが表示されうまくいきません。
どうもリビジョン100のファイルが取得できないようです。
どなたか原因がわかる方いらっしゃいませんか?
140デフォルトの名無しさんsage2009/12/02(水) 02:25:53
svn diff -r 100 test.txt .
じゃないの?
143デフォルトの名無しさんsage2009/12/02(水) 23:04:26
>>140
ダメでした。
“svn diff -r 100:101 test.txt”もダメです。
コマンドラインでは成功します。
ただ最新版がr102の場合、
“svn diff -r 102 test.txt”なら成功します。
ルーターのLEDが点滅しているので取りにはいっているようです。
考えられる原因は「OSがVista、ノートンを使っている」くらいでしょうか。
144デフォルトの名無しさんsage2009/12/03(木) 10:10:05
それぞれのバージョンは?
145デフォルトの名無しさんsage2009/12/03(木) 23:00:08
>>144
バッチファイルの
START “WinMerge” /B
を削除するとうまくいきました。
どうもこれがあると比較用のtempfile.tmpが消えてしまうようです。
ちなみにsvnクライアントのバージョンは1.6.6です。
サーバーはわかりません。
138さんは神ですね。
手順をまとめると…
以下のようなバッチファイルを作成して、そのパスを%APPDATA%\Subversion\configファイルのhelpersセクション→diff-cmdキーに設定する。
@ECHO OFF
[WinMergeU.exeのパス] /e /s /ub /dl %3 /dr %5 %6 %7
というわけでした。
こちらでは初めまして。
某中学校(隠す気ないw)でカキコしている葉月です。
てんぷらさんのメモは――
EclipseでJavaしていた頃、よくお世話になっていました。
Swing系のマニアックアプリの宝庫なのは知っていましたが、
まさかWinMargeを使ったテクニックまで載せていたとは!
今も作業してまして、デバックのローカルウィンドウに表示
されているコレクションクラスの中身を駄ツールで解析して
CSVファイルに出力した後、部分的にWinMargeで比較してい
ます。
WinMargeがあると自分で作る気力は起きませんが――
.NET系にあるListクラスのFindIdメソッドを使って、diff系のソフトを作るのに役立つこと
に気づきました。
(似たような機能のあるクラスは作りました)
あにすさんなら、もっと効率のいいやり方を知ってそうですね。
暇していたもので長々と失礼しました。
>葉月さん
いやー、diffのアルゴリズムなんてさっぱりですよ。
そんな大それた代物じゃないですよ。
アルゴリズムなんて言葉は――
あにすさんぐらいのレベルが使っていい言葉で、
私には10年早いです(笑)
経緯を説明します。
元々、あるサイトを見るのがめんどいのでクローラを作りました。
私の待ち時間とクローラするサイトの負担を減らしたかったので、
そのサイトでクローラしたID(履歴ID)を保存し、
次回にクローラするID(今回取得したID)と比較したくなりました。
その時にFindIndexメソッドのことを知りました。
ここから改造は必要ですが、
あにすさんがやっていることに比べれば、
かなりレベルは落ちますね。
>>データ(List)の中身
>今回取得したID
171300
171301
171302
109134 ←ここから先は見ている
110129
138366
126098
171299
>履歴ID
109134
110129
138366
126098
171299
171295
171294
171293
171292
171291
>>イメージの部分的なサンプルです。
private void Hoge
{
int iVal = 0;
for (int i = 0; i < this.今回取得したID.Length; i++)
{
iVal = this.今回取得したID.FindIndex(値, this.IsIdCheck);
Console.WriteLine(iVal);
//↑3、4、5、6、7を表示
}
}
private bool IsIdCheck(string strId)
{
if (this.履歴ID.Contains(strId))
{
return true;
}
return false;
}
すいません、サンプルを間違えました。
>誤
iVal = this.今回取得したID.FindIndex(値, this.IsIdCheck);
>正
iVal = this.今回取得したID.FindIndex(i, this.IsIdCheck);
>葉月さん
ちょっと遊んでみました。
foreach (var id in from id in 今回取得したID
where 履歴ID.Contains(id)
select 今回取得したID.IndexOf(id)) {
Console.WriteLine(id);
}
用途に合うかわかりませんが、こんなソフトもありますよ。
DiffBrowser ~ ウェブページの更新内容取得ソフト
http://www010.upp.so-net.ne.jp/suede/diffbrowser.html
さすが、あにすさんです!
Linqで照合するやり方は、思いつきませんでした。
idを別にコレクションや配列で受ければ、
用途に合いそうですね。
次回はDiffソフトでいきますか?(笑)
↑念のため冗談です。
>DiffBrowser ~ ウェブページの更新内容取得ソフト
ご紹介ありがとうございます。こんなソフトあるんですね。
今回の用途には使えませんが、他で使う機会はありそうです。