Change default SVN diffing tool

前端 未结 10 2216
无人及你
无人及你 2020-12-14 19:55

Following a blog, I created a batch file, wm.bat:

\"d:\\svnroot\\external\\winmerge\\WinMerge.exe\" /B /WAIT \"d:\\svnroot\\external\\winmerge\\WinMergeU.exe         


        
相关标签:
10条回答
  • 2020-12-14 20:19

    For Mac::

    open this file : ~/.subversion/config

    find and uncomment line containing : diff-cmd ( by removing # from start )

    in front of diff-cmd, give the name of the diff tool, like in my case i was using araxis merge diff tool, so it looked like this :

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

    After this whenever you will run svn diff on terminal, if will show difference of the files in that tool

    make sure there is no space before and after diff-cmd word.

    0 讨论(0)
  • 2020-12-14 20:21

    Ok, looking at the original blog post, this is what you want:

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

    If you want to see what is actually happening here (i.e. what sort of parameters the svn diff passes to the nominated diff-cmd), you can just use svn diff --diff-cmd echo and see what it says:

    [~/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
    

    Some quotes were removed above, but basically you can see that svn diff will pass

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

    to your batch file. The batch file you have is used to turn these commands into the format that WinMerge understands.

    More details and examples on how this all works are provided in the svn book.

    To make your batch file the default for svn diff, you need to add the following line in the [helpers] section in your local subversion config file (~/.subversion/config in Linux, I'm not sure where the config file is located in Windows) (see this earlier SO question)

    diff-cmd=wm.bat
    
    0 讨论(0)
  • 2020-12-14 20:21

    I had 3 issues with the simple .bat file, especially when the revision didn't match the one in the working directory:

    • svn may write the files to be compared to a temp directory - then delete them before WinMerge has a chance to look at them
    • svn may pick up the file from an .svn\pristine subdirectory, where its filename is a long string of hex digits
    • WinMerge bases its syntax highlighting on the file extensions and when svn uses a temp file, it has no extension

    So I ended up wrapping a little PowerShell into the .bat file to work around these issues:

    ;@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
    

    Thanks to Walid Toumi for the wrapper.

    0 讨论(0)
  • 2020-12-14 20:33

    When using Cygwin and SVN 1.7 with WinMerge, use this batch file as the external diff tool. I had to adapt http://manual.winmerge.org/CommandLine.html to work with Cygwin paths.

    In .subversion\config:

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

    Contents of 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%
    
    0 讨论(0)
提交回复
热议问题