How to use ediff (emacs diff) as a diff/merge tool in Windows ClearCase


I'm forced to use ClearCase (Windows version) at work, and I want to use emacs ediff as a diff and merge tool. The problem with the ClearCase map file is that it requires .exe files – I've tried to specify a batch file calling ediff and it didn't work.

I don't want to write a C/C++ program (it's been more than 10 years since I've coded anything in C for Win32) that will call ediff with the proper arguments. Is there a simpler way?

See also:

Any way to use a custom diff tool with cleartool/clearcase?

Best Solution

As mentioned in this SO question, the map file allows you to call an external diff tool.

For Windows, you should try first to call emacs in ediff mode:

   emacs --eval "(ediff-files \"file_1\" \"file_2\")" 


   xemacs -eval "(ediff-files \"file_1\" \"file_2\")" 

(should invoke a new instance of XEmacs ediff)

If this works, you may write a .bat file called by the map file, and building the appropriate "emacs ediff" command line.

Something along the lines of:

@echo off
set local
if !%XEMACS_PATH%!==!! SET
set FILE1=%~1
set FILE2=%~2
REM * Bad habit - working on administrative shares.. Why is $->$$ not needed?
REM * Escaping backslash..
SET FILE1=%FILE1:\=\\%
SET FILE2=%FILE2:\=\\%

"%XEMACS_PATH:"=%\gnudoit.exe" "(ediff \"%FILE1%\" \"%FILE2%\")" 

If map file is not at ease with calling a .bat file, simply generate an .exe from your .bat.

I have done some tests and it turns out:

  • "compare with previous version" actually calls:

    cleartool diff -graphical -pred myFile

  • calling the .bat through a cmd.exe call does not work

    c:\Program Files\Rational\ClearCase\lib\mgrs\map

    text_file_delta xcompare "c:\WINDOWS\system32\cmd.exe /c c:\cc\test.bat"

    cleartool: Error: Operation "xcompare" unavailable for manager "text_file_delta" (Operation pathname was: "C:\Program Files\Rational\ClearCase\lib\mgrs\"c:\WINDOWS\system32\cmd.exe /c c:\cc\test.bat"")

  • transforming the .bat in .exe does work

  • arg2 (%2) and arg4 (%4) are what you are looking for, with arg5 (%5) the name of the temporary file created for the content of the previous version (for snapshot view which can not access extended path name)

So the following bat (transformed in exe) works from the command-line only (not from the ClearCase Explorer: DrWatson):

"C:\Program Files\WinMerge\WinMergeU.exe" %4 %5

You should be able to adapt it to Xemacs, but Alex's suggestion (working with Clearcase from Emacs) might be another more practical solution.