How can I use Beyond Compare 3 as the diff3-cmd for svn?
Asked Answered
A

5

10

I saw this posting which explained how to get BC3 working as the diff tool for Subversion... but what about using Beyond Compare 3 to do 3-way merge/compares?

Ascidian answered 22/6, 2009 at 18:20 Comment(0)
C
8

To do this, create a batch file called (for example) diff3wrap.bat, and setup your diff3-cmd in your SVN config to point at it.

The following diff3wrap.bat file will do the job. It creates a temporary filename for the merge output and deletes it after returning the merged contents back to SVN.

@ECHO OFF

SET DIFF3="C:\Program Files\BeyondCompare3\BComp.exe"

REM Subversion provides the paths we need as the last three parameters
REM These are parameters 9, 10, and 11.  
REM Suitable titles for these three panes in the merge tool are in parameters 4, 6 and 8 respectively.


REM But we have access to only nine parameters at a time, so we shift our nine-parameter window
REM twice to let us get to what we need, thus changing the effective positions of the various parameters.
REM
SHIFT
SHIFT
SET MYTITLE=%2
SET OLDTITLE=%4
SET YOURTITLE=%6
SET MINE=%7
SET OLDER=%8
SET YOURS=%9
SET OUTPUTFILE=%OLDER%_%RANDOM%.merge

REM Call BeyondCompare to perform the actual merge
REM Note we give it a temporary output file and echo the output back out for SVN to use as the merged file
%DIFF3% /lefttitle=%MYTITLE% /centertitle=%OLDTITLE% /righttitle=%YOURTITLE% /outputtitle="Merge Output" %MINE% %YOURS% %OLDER% %OUTPUTFILE% 

if NOT %errorlevel% == 0 goto :mergenotcomplete

REM Merge complete. Echo the output to stdout for SVN to pick up as the result, then throw away the temporary file

TYPE %OUTPUTFILE%
del /f /q %OUTPUTFILE%
exit 0

:mergenotcomplete
exit 1
Colpotomy answered 31/8, 2009 at 22:15 Comment(2)
Based on what the SVN Redbook said about this, this looks right... I'll accept the answer as soon as I get to check it.Ascidian
I just tested it and it works (once you replace the the set DIFF3 line with the correct installation path for your box).Available
D
4

I like liamf's batch file, but I think it could take a minor tweak:

I've added automerge and reviewconflicts to the command invocation, so that in case of a merge without conflicts it just closes without intervention - the UI will only pop-up to review conflicts.

Thus, the line in question becomes:

%DIFF3% /automerge /reviewconflicts /lefttitle=%MYTITLE% /centertitle=%OLDTITLE% /righttitle=%YOURTITLE% /outputtitle="Merge Output" %MINE% %YOURS% %OLDER% %OUTPUTFILE% 
Dinnie answered 27/1, 2010 at 17:43 Comment(1)
Nice improvement ... I have taken this into my standard BC3 merge script. Thanks!Colpotomy
B
1

I only have experience with BC3 and TFS, so take this with a grain of salt. The 3-way merge was the only feature I had problems with. More than once I had to copy and paste the changes by hand in BC3 to finish the merge.

Beeves answered 22/6, 2009 at 18:27 Comment(1)
I use BC3 through Tortoise on Windows. I can say that the decisions BC3 makes are consistently more accurate then Tortoise or the SVN cli itself. I also create custom profiles for certain file types/patterns that I want to override the defaults on.Haywoodhayyim
H
1

Here is a linux version of liamf's script that works with svn 1.6.

#!/bin/bash

MYTITLE=$4
OLDTITLE=$6
YOURTITLE=$8
MINE=$9
OLDER=${10}
YOURS=${11}
OUTPUTFILE=${MINE}.merge

/usr/bin/bcompare -solo -automerge -force -reviewconflicts -favorleft -lefttitle=$MYTITLE -centertitle=$OLDTITLE -righttitle=$YOURTITLE -outputtitle=$OUTPUTFILE $MINE $YOURS $OLDER $OUTPUTFILE

RESULT=$?

if [ $RESULT -eq 0 ] ; then
  cat $OUTPUTFILE
  exit 0
else
  exit 1
fi
Haywoodhayyim answered 15/3, 2012 at 19:48 Comment(0)
S
1

Here's a Cygwin bash script that works with Subversion 1.7 for both diff-cmd and diff3-cmd

#!/bin/bash
# Set path to BeyondCompare
bcomp=~/bin/bcomp;

function bcerrlvl () {
    echo -en "$1\t";

    case $1 in
          0) echo "Success";;
          1) echo "Binary same";;
          2) echo "Rules-based same";;
         11) echo "Binary differences";;
         12) echo "Similar";;
         13) echo "Rules-based differences";;
         14) echo "Conflicts detected";;
        100) echo "Error";;
        101) echo "Conflicts detected, merge output not saved";;
          *) echo "Error";;
    esac;

    return $1;
}

if [ "$1" = "-u" ];
then
    # paths
    left=$(cygpath --dos "$6");
    right=$(cygpath --dos "$7");

    # titles
    titleleft="$3";
    titleright="$5";

    # compare command
    $bcomp -title1="$titleleft" -title2="$titleright" "$left" "$right";

    if [ $? -gt 0 ];
    then
        bcerrlvl $?;
        exit $?;
    else
        exit 0;
    fi;
elif [ "$1" = "-E" ];
then
    # Get to the tenth and eleventh arguments
    shift; shift;

    # paths
    centre=$(cygpath --dos "$7");
    left=$(cygpath --dos "$8");
    right=$(cygpath --dos "$9");
    outext="_$(date +%s)-$RANDOM.merge";
    output="$(cygpath --dos "$8")_$outext";

    # titles
    titlecentre=$2;
    titleleft=$4;
    titleright=$6;
    titleoutput="Merge Output";

    # compare command
    $bcomp -title1="$titleleft" -title2="$titleright" -title3="$titlecentre" \
        -outputtitle="$titleoutput" -automerge -reviewconflicts \
        "$left" "$right" "$centre" "$output";

    if [ $? -eq 0 ];
    then
        outfile=$(cygpath --unix "$output");
        cat $outfile
        rm -f $outfile
        exit 0;
    else
        bcerrlvl $?;
        exit $?;
    fi;
fi;
Spectatress answered 12/7, 2012 at 2:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.