7

TortoiseSVN(ならびにother Tortoise clients)は、Mathematicaのscript~diffノートブックファイルを含みます。 Mathematicaの差分機能はAuthorToolsパッケージに実装されています(もっと良いことがありますか?)Mathematicaのdiff機能をコマンドラインから呼び出すことは可能ですか?

スクリプトは現在、tempディレクトリに小さなノートブックファイルを作成し、フロントエンドで開くことで動作します。ノートブックには大きなボタンがあり、これはdiffを実行し、ファイル名はdiffedにハードコードされています。

不利な点は、差分コードを持つノートブックが一時ディレクトリに残され、クリーンアップされないことです。 diffを実行するたびに補助ノートブックを開く必要もないようです。

一時的なノートブックを通過しないように、コマンドラインからdiff機能を起動することはできますか?または、このプロセスを改善し、補助ノートブックで一時フォルダを浪費することを避けるために他の堅牢な方法がありますか?

diffingエクスペリエンスを改善するための任意の提案を歓迎します!

TortoiseSVNはWindowsプログラムなので、主にWindowsベースのソリューションに興味があります。


ここでは、スクリプトが生成するノートブックの例を示します。私はそれがクリーンアップを必要としていることを認識していますが、前回チェックしたバージョンはバージョン5でも動作していましたので、何かを視覚的に改善することなく不必要に触れたくありませんでした。

Notebook[{ 
    Cell[BoxData[ButtonBox["\<\"Compare Notebooks\"\>", 
     ButtonFrame->"DialogBox", Active->True, ButtonEvaluator->Automatic, 
     ButtonFunction:>(Needs["AuthorTools`"]; NotebookPut[Symbol["NotebookDiff"]["one.nb", "two.nb"]]) 
    ]], NotebookDefault] }, 
    Saveable->False, Editable->False, Selectable->False, WindowToolbars->{}, 
    WindowFrame->ModelessDialog, WindowElements->{}, 
    WindowFrameElements->CloseBox, WindowTitle->"Diff", 
    ShowCellBracket->False, WindowSize->{Fit,Fit} 
] 
+2

興味深い評判:http://i.stack.imgur.com/2ze1M.png –

+0

Mmaノートのバージョン管理は容易ではありません。私は通常、[この質問](http://stackoverflow.com/q/2816628/421225)のマイケルピラートの助言に従っています。私。キャッシュと履歴をオフにしてから、標準のテキストベースのdiffを使用します。 – Simon

+0

@Simon 'NotebookDiff'はうまくいくようですが、問題はありましたか? – Szabolcs

答えて

4

ここでは、Mathematicaスクリプトを使用してノートブック差分を生成する簡単な例を示します。

保存diff.m

Needs["AuthorTools`"] 
If[Length[$ScriptCommandLine]>=3, 
    {f1, f2} = $ScriptCommandLine[[{2,3}]], 
    {f1, f2} = {"one.nb", "two.nb"}] 
diff = FileNameJoin[{$TemporaryDirectory, "diff.nb"}] 
Put[NotebookDiff[f1, f2], diff] 
Run["Mathematica " <> diff] 
DeleteFile[diff] 
Exit[] 

その後MathematicaScript -script diff.m "one.nb" "two.nb"を使用して、コマンドラインから呼び出して、次の。これは私のシステム(Ubuntu 11.10、Mathematica 8.0.1)で動作し、プラットフォームに依存しないはずです。 v8より古いバージョンのMathematicaを使用している場合、MathematicaScriptの代わりにMathKernel -noprompt -run < diff.mを使用し、{f1, f2}のデフォルト値が使用されます。

+0

実際、これはバージョン7では動作しないようです。どちらのバージョンでも、NotebookDiffにノートブックオブジェクトが与えられている場合、 '' AuthorTools'NotebookDiff'Private'notebookDiff''が呼び出されます。与えられた式が 'Notebook'であれば' NotebookPut'を使い、 'NotebookDiff'をもう一度呼び出します。それ以外の場合、バージョン8では動作しますが、バージョン7では動作しない '' AuthorTools'NotebookDiff'Private'NotebookDiffFiles''を使用しようとします...なぜそれがわかりません。 – Simon

+1

私がリンクしている元のバージョンとの主な違いは、フロントエンドをスクリプトでラップすることです。フロントエンドが終了すると、スクリプトによってファイルが削除されます。これは元のVBScriptバージョンからも可能です。ただし、通常はフロントエンドのインスタンスが1つだけしか実行できないため、Windows上では機能しません。新しく起動したフロントエンドが既に実行中のフロントエンドを検出した場合、開くべきノートブックを渡して終了します。 (実際には、これはLinuxでこれが起こらないのはかなり面倒です。) – Szabolcs

+1

@Szabolcs:主な違いは、「ノートブックを比較」ボタンを押す必要がないと思ったことです。あなたが複数のフロントエンドインスタンスを許可していないWindowsのために言及した問題に関しては、おそらくあなたは 'FrontEndEventActions'にフックすることによってファイルを削除します。例: 'SetOptions [$ FrontEndSession、FrontEndEventActions - > {" WindowClose ":>(DeleteFile [" diff.file "]; SetOptions [$ FrontEndSession、FrontEndEventActions - > Automatic])}]'。これはいくつかの虚偽を必要とするだろう...多分あなたはあなたの現在のスクリプトで良いです! – Simon

関連する問題