7

TortoiseSVN (así como other Tortoise clients) incluyen un script a diff archivos de cuaderno en Mathematica. La funcionalidad de Diff para Mathematica se implementa en el paquete AuthorTools (quizás hay algo mejor?)¿Es posible invocar la funcionalidad diff de Mathematica desde la línea de comando?

La secuencia de comandos funciona actualmente al crear un pequeño archivo de cuaderno en el directorio temporal y abrirlo en la interfaz. La computadora portátil tiene un botón grande que hará la diferencia y tiene los nombres de los archivos a diferir codificados.

Una desventaja es que el portátil con el código diff se dejará en el directorio temporal y no se limpiará. También parece innecesario tener un cuaderno auxiliar abierto cada vez que hacemos una diferencia.

¿Es posible iniciar la funcionalidad de diferenciación desde la línea de comandos para evitar pasar por el portátil temporal? ¿O hay alguna otra forma robusta para mejorar este proceso y evitar ensuciar la carpeta temporal con los cuadernos auxiliares?

¡Cualquier sugerencia para mejorar la experiencia diferente es bienvenida!

Tenga en cuenta que dado que TortoiseSVN es un programa de Windows, estoy interesado principalmente en soluciones basadas en Windows.


Aquí hay un cuaderno de ejemplos que genera la secuencia de comandos. Me doy cuenta de que necesita una limpieza, pero la última vez que lo revisé también funcionó en la versión 5 (!), Así que no quería tocarlo innecesariamente (sin mejorar visiblemente algo).

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

Reputación interesante: http://i.stack.imgur.com/2ze1M.png –

+0

El control de versiones de un portátil Mma no es fácil. Normalmente sigo los consejos dados por Michael Pilat en [esta pregunta] (http://stackoverflow.com/q/2816628/421225). Es decir. apague la memoria caché y el historial, luego use una diferencia estándar basada en texto. – Simon

+0

@Simon 'NotebookDiff' parece funcionar bien, ¿tuviste problemas con eso? – Szabolcs

Respuesta

4

Aquí está un ejemplo sencillo de producir el cuaderno diff utilizando un script de Mathematica.

Guardar los siguientes como 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[] 

Entonces llaman desde la línea de comandos usando MathematicaScript -script diff.m "one.nb" "two.nb". Esto funciona en mi sistema (Ubuntu 11.10, Mathematica 8.0.1) y debe ser independiente de la plataforma. Si está utilizando una versión de Mathematica anterior a la v8, entonces deberá usar MathKernel -noprompt -run < diff.m en lugar de MathematicaScript y se usarán los valores predeterminados para {f1, f2}.

+0

En realidad, esto no parece funcionar en la versión 7. En ambas versiones, si 'NotebookDiff' recibe objetos de cuaderno, entonces llama a' 'AuthorTools'NotebookDiff'Private'notebookDiff''. Si se le dan expresiones con el encabezado 'Notebook' usa' NotebookPut' en ellas, luego llama a 'NotebookDiff' nuevamente. De lo contrario, intenta usar '' AuthorTools'NotebookDiff'Private'NotebookDiffFiles'', que funciona con la versión 8 pero no con la versión 7 ... No estoy seguro de por qué. – Simon

+1

La principal diferencia en comparación con la versión original a la que me he vinculado es que envuelve llamar al Front End con un script. Cuando finaliza el Front End, el script elimina el archivo. Esto también es posible a partir de la versión original de VBScript.Sin embargo, simplemente no funcionará en Windows porque generalmente solo se permite ejecutar una única instancia del Front End: si el Front End recién iniciado detecta uno ya en ejecución, solo pasa el notebook para abrirlo y sale . (De hecho, me parece bastante molesto que esto no ocurra en Linux.) – Szabolcs

+1

@Szabolcs: Pensé que la principal diferencia era que no era necesario presionar el botón "Comparar portátiles". En cuanto al problema que mencionaste debido a que Windows no permite más de una instancia de frontend, quizás elimines el archivo enganchándote en 'FrontEndEventActions'. Por ejemplo: 'SetOptions [$ FrontEndSession, FrontEndEventActions -> {" WindowClose ":> (DeleteFile [" diff.file "]; SetOptions [$ FrontEndSession, FrontEndEventActions -> Automatic])}]'. Esto necesitaría un poco de fineza ... ¡tal vez estés mejor con tu guión actual! – Simon

Cuestiones relacionadas