7

TortoiseSVN (nonché other Tortoise clients) includono un file script a diff in Mathematica. funzionalità Diff per Mathematica è implementata nel pacchetto AuthorTools (forse c'è qualcosa di meglio?)È possibile richiamare la funzionalità diff di Mathematica dalla riga di comando?

Lo script attualmente lavora con la creazione di un piccolo file notebook nella directory temp, e la sua apertura nel front-end. Il notebook ha un grande pulsante che farà il diff e ha i nomi dei file da diffondere hard coded.

Uno svantaggio è che il notebook con il codice diff verrà lasciato nella directory temp e non verrà ripulito. Sembra anche inutile avere un quaderno ausiliario aperto ogni volta che facciamo una diff.

È possibile avviare la funzionalità diff dalla riga di comando per evitare di passare attraverso il blocco appunti temporaneo? O c'è altro robusto modo per migliorare questo processo ed evitare di sporcare la cartella temporanea con notebook ausiliari?

Eventuali suggerimenti per migliorare l'esperienza di diffusione sono i benvenuti!

Si noti che poiché TortoiseSVN è un programma per Windows, sono principalmente interessato alle soluzioni basate su Windows.


Ecco un notebook ad esempio che lo script genera. Mi rendo conto che ha bisogno di pulizia, ma l'ultima volta che ho controllato ha funzionato anche nella versione 5 (!), Quindi non volevo toccarlo inutilmente (senza migliorare visibilmente qualcosa).

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

Reputazione interessante: http://i.stack.imgur.com/2ze1M.png –

+0

Il controllo della versione di un notebook Mma non è semplice. Di solito seguo il consiglio dato da Michael Pilat in [questa domanda] (http://stackoverflow.com/q/2816628/421225). Cioè disattivare la cache e la cronologia, quindi utilizzare una diff standard basata sul testo. – Simon

+0

@Simon 'NotebookDiff' sembra funzionare bene, hai avuto problemi con esso? – Szabolcs

risposta

4

Ecco un semplice esempio di produzione del notebook diff utilizzando uno script Mathematica.

Salva il seguente come 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[] 

Poi lo chiamano dalla riga di comando utilizzando MathematicaScript -script diff.m "one.nb" "two.nb". Funziona sul mio sistema (Ubuntu 11.10, Mathematica 8.0.1) e dovrebbe essere indipendente dalla piattaforma. Se si utilizza una versione di Mathematica precedente alla v8, sarà necessario utilizzare MathKernel -noprompt -run < diff.m anziché MathematicaScript e verranno utilizzati i valori predefiniti per {f1, f2}.

+0

In realtà, questo non sembra funzionare sulla versione 7. In entrambe le versioni, se 'NotebookDiff' riceve gli oggetti notebook, allora chiama' 'AuthorTools'NotebookDiff'Private'notebookDiff''. Se date espressioni con head 'Notebook' usa' NotebookPut' su di esse, quindi chiama 'NotebookDiff' di nuovo. Altrimenti, prova ad usare '' AuthorTools'NotebookDiff'Private'NotebookDiffFiles'', che funziona con la versione 8 ma non con la versione 7 ... Non sono sicuro del perché. – Simon

+1

La differenza principale rispetto alla versione originale a cui mi sono collegato è che si effettua il wrap chiamando il front-end da uno script. Al termine del Front End, lo script cancella il file. Questo è possibile anche dalla versione VBScript originale.Tuttavia, semplicemente non funzionerà su Windows perché in genere è consentita l'esecuzione solo di una singola istanza del Front End: se il Front End appena avviato ne rileva uno già in esecuzione, passa semplicemente il notebook per aprirlo ed esce . (In realtà trovo abbastanza fastidioso che ciò non avvenga su Linux.) – Szabolcs

+1

@Szabolcs: ho pensato che la differenza principale era che non era necessario premere il pulsante "Confronta notebook". Per quanto riguarda il problema che hai menzionato a causa del fatto che Windows non consente più di un'istanza di frontend, potresti eliminare il file agganciando "FrontEndEventActions". Ad esempio: 'SetOptions [$ FrontEndSession, FrontEndEventActions -> {" WindowClose ":> (DeleteFile [" diff.file "]; SetOptions [$ FrontEndSession, FrontEndEventActions -> Automatic])}]'. Questo avrebbe bisogno di qualche rifinitura ... forse stai meglio con la tua sceneggiatura attuale! – Simon