Cambiar la herramienta de diferenciación SVN pnetworkingeterminada

Siguiendo un blog, creé un file por lotes, wm.bat:

"d:\svnroot\external\winmerge\WinMerge.exe" /B /WAIT "d:\svnroot\external\winmerge\WinMergeU.exe" /e /ub /dl %3 /dr %5 %6 %7 

E intenté llamar

 svn diff | wm 

pero eso no funcionó. Entonces, ¿cómo puedo integrar WinMerge o una utilidad similar con svn diff ?

Ampliando la respuesta de David a continuación, cambiar el valor pnetworkingeterminado para Windows requiere editar el file de configuration ubicado en (para Windows XP)

 C:\Documents and Settings\%USERNAME%\Application Data\Subversion\config 

o (Windows Vista)

 C:\Users\%USERNAME%\AppData\Roaming\Subversion\config 

Ok, mirando la publicación original del blog , esto es lo que quieres:

 svn diff --diff-cmd wm [optional-filename] 

Si quiere ver qué está pasando realmente aquí (es decir, qué tipo de parameters pasa el svn diff al nominado diff-cmd ), puede usar svn diff --diff-cmd echo y ver lo que dice:

 [~/src/gosmore-dev]$ svn diff --diff-cmd echo Index: gosmore.cpp =================================================================== -u -L gosmore.cpp (revision 13753) -L gosmore.cpp (working copy) .svn/text-base/gosmore.cpp.svn-base gosmore.cpp 

Algunas citas se eliminaron anteriormente, pero básicamente se puede ver que svn diff pasará

 -u -L "<left-label>" -L "<right-label>" <left-file> <right-file> 

a su file por lotes. El file por lotes que tiene se usa para convertir estos commands en el formatting que WinMerge entiende.

Más detalles y ejemplos sobre cómo funciona todo esto se proporcionan en el libro svn .

Para hacer que su file por lotes sea el pnetworkingeterminado para svn diff , necesita agregar la siguiente línea en la sección [helpers] en su file local de configuration de subversión ( ~/.subversion/config en Linux, no estoy seguro de dónde está el file de configuration ubicado en Windows) (ver esta pregunta anterior )

 diff-cmd=wm.bat 

Mira este enlace:

http://blog.tplus1.com/index.php/2007/08/29/how-to-use-vimdiff-as-the-subversion-diff-tool/

Aquí hay una copy de la conveniencia de SOer:

Obtenga este script diffwrap.sh y guárdelo en cualquier lugar. Guardé el mío en mi directory $ HOME / bin. ¡Asegúrate de hacerlo ejecutable! Lo estoy mostrando a continuación:

 #!/bin/sh # Configure your favorite diff program here. DIFF="/usr/bin/vimdiff" # Subversion provides the paths we need as the sixth and seventh # parameters. LEFT="$6" RIGHT="$7" # Call the diff command (change the following line to make sense for # your merge program). "$DIFF" "$LEFT" "$RIGHT" # Return an errorcode of 0 if no differences were detected, 1 if some were. # Any other errorcode will be treated as fatal. 

Luego, cambie su file $HOME/.subversion/config para apuntar a ese script:

 [helpers] diff-cmd = /home/matt/bin/diffwrap.sh 

¡Entonces ve a diff un file!

Cuando use Cygwin y SVN 1.7 con WinMerge, use este file de process por lotes como la herramienta externa de diferencias. Tuve que adaptar http://manual.winmerge.org/CommandLine.html para trabajar con las routes de Cygwin.

En .subversion\config :

 [helpers] diff-cmd = C:\path\to\winmergesvndiff.bat 

Contenido de winmergesvndiff.bat

 @echo off set left=%6 set right=%7 REM Repeat these two lines for all drives set left=%left:/cygdrive/c/=c:/% set right=%right:/cygdrive/c/=c:/% REM Path to WinMerge may vary start "WinMerge" /B "C:\program files (x86)\winmerge\WinMergeU.exe" /e /s /ub /dl %3 /dr %5 %left% %right% 

Después de crear un file por lotes que contiene una llamada a su progtwig de fusión favorito, puede configurar Subversion para que siempre use su file por lotes en Windows (sin requerir el argumento –diff-cmd en cada uso) modificando la línea

 # diff-cmd = diff_program (diff, gdiff, etc.) 

en el file C: \ Documents and Settings \ username \ Application Data \ Subversion \ config. Esta línea debe cambiarse para apuntar a su file por lotes. Por ejemplo:

 diff-cmd = c:\bin\wm.bat 

Necesita convertir la ruta al estilo de Windows:

 #!/bin/sh LEFT="$6" RIGHT="$7" RRIGHT=`cygpath.exe -pw $RIGHT` LLEFT=`cygpath.exe -pw $LEFT` /cygdrive/c/Program\ Files\ \(x86\)/WinMerge/WinMergeU.exe /e /s /ub /dl %3 /dr %5 $LLEFT $RRIGHT 

Para Mac::

abra este file: ~ / .subversion / config

search y descomentar la línea que contiene: diff-cmd (eliminando # del inicio)

Delante de diff-cmd, den el nombre de la herramienta diff, como en mi caso estaba usando la herramienta diff de araxis fusion, por lo que se veía así:

diff-cmd = / Aplicaciones / Araxis Merge.app/Contents/Utilities/araxissvndiff

Después de esto siempre que ejecute svn diff en la terminal, si mostrará la diferencia de los files en esa herramienta

asegúrese de que no haya espacio antes y después de la palabra diff-cmd.

Meld funciona muy bien para mí. Después de la installation, fui al file de configuration de Subversion , descomente la línea diff-cmd y la establezca en la ruta cuando meld.exe esté. En mi caso:

 [helpers] ### ... ### Set diff-cmd to the absolute path of your 'diff' program. ### This will override the compile-time default, which is to use ### Subversion's internal diff implementation. diff-cmd = D:\SOFT\Meld\meld\meld.exe 

Usando Cygwin , Subversion (versión de Cygwin) y WinDiff requiere cierto cuidado para lidiar con la intolerancia de las barras diagonales. Utilizo el siguiente script Bash , instalado a través de la configuration diff-cmd de svn, para get los resultados deseados con 'svn diff':

 arg1=$(echo $6 | sed 's/\//\\/g' | sed 's/\\cygdrive\\c/c:/') arg2=$(echo $7 | sed 's/\//\\/g' | sed 's/\\cygdrive\\c/c:/') cmd /c windiff.exe $arg1 $arg2 

Tuve 3 problemas con el file .bat simple, especialmente cuando la revisión no coincidía con la del directory de trabajo:

  • svn puede escribir los files para compararlos con un directory temporal y luego eliminarlos antes de que WinMerge pueda verlos
  • svn puede recoger el file de un subdirectory .svn \ pristine, donde su nombre de file es una larga cadena de dígitos hexadecimales
  • WinMerge basa su resaltado de syntax en las extensiones de file y cuando svn usa un file temporal, no tiene extensión

Así que terminé envolviendo un poco de PowerShell en el file .bat para solucionar estos problemas:

 ;@echo off ;set leftdesc=%~3 ;set rightdesc=%~5 ;set leftfile=%~6 ;set rightfile=%~7 ;Findstr -rbv ; %0 | powershell -c - ;goto:sCode &{ $leftExt, $rightExt = ($env:leftdesc, $env:rightdesc) -replace '.*([.]\w+).*','$1' if ($env:leftfile.EndsWith($leftExt)){ $leftFile = $env:leftfile }else{ $leftFile = Join-Path $env:temp ((Split-Path $env:leftfile -Leaf) + $leftExt) Copy-Item $env:leftfile $leftFile -Force } if ($env:rightfile.EndsWith($rightExt)){ $rightFile = $env:rightfile }else{ $rightFile = Join-Path $env:temp ((Split-Path $env:rightfile -Leaf) + $rightExt) Copy-Item $env:rightfile $rightFile -Force } $descriptions = '/dl "' + $env:leftdesc + '" /dr "' + $env:rightdesc + '"' $fileNames = '"' + $leftFile + '" "' + $rightFile + '"' start 'C:\Program Files (x86)\WinMerge\WinMergeU.exe' ('/e /u ' +$descriptions + ' ' + $fileNames) } ;:sCode ;goto :eof 

Gracias a Walid Toumi por el envoltorio.