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

How to change default diff tools

You can specify an external diff tool by modifying the file map, in “c:\program files\rational\ClearCase\lib\mgrs”

The WinMerge suggested by Paul actually modifies that file.

Each map line has 3 parts: the CC filetype, the CC action, and the application.

Find the section in the map file for text_file_delta file types. There you will find lines for CC actions compare, xcompare, merge, and xmerge which look like this:

text_file_delta   compare          ..\..\bin\cleardiff.exe
text_file_delta   xcompare         ..\..\bin\cleardiffmrg.exe
text_file_delta   merge            ..\..\bin\cleardiff.exe
text_file_delta   xmerge           ..\..\bin\cleardiffmrg.exe

You can replace them by the executable of your diff tool choice.


Or, a simple diff script

If you want to go full command-line on this (which I like 😉 ), a little ccperl can help:

#!/bin/perl
my ($file, $switches) = @ARGV;
$switches ||="-ubBw";

my ($element, $version, $pred) 
    = split(/;/,`cleartool describe -fmt '%En;%Vn;%PVn' $file`);

unless ($pred) { die "ctdiff: $file has no predecessor\n"; }

exec "mydiff $switches $element\@\@$pred $file";

Warning: extended pathname (@@\...) is only accessible in dynamic view (M:\..., not snapshot view (c:\...).

The script has nothing to do with the mapfile presented above:

  • that file defines ‘Type Merge Managers’.
  • This script allows you to run any merge manager on any file you want, without reading any map file to look for the right diff exe to use for a given file.

Here, you provide to the script both informations: the file (as a parameter) and the diff exe to run (within the script implementation: replace mydiff by whatever diff exe you want).


Or, improved diff script (works in static/snapshot views too)

Here is a version of this script which works for both snapshot and dynamic view.

For snapshot view, I use the chacmool’s suggestion: cleartool get.

Again, you can replace the diff command included in this script by the tool of your choosing.

#!/bin/perl
my ($file, $switches) = @ARGV;
$switches ||="-u";

my ($element, $version, $pred) 
    = split(/;/,`cleartool describe -fmt '%En;%Vn;%PVn' $file`);

unless ($pred) { die "ctdiff: $file has no predecessor\n"; }

# figure out if view is dynamic or snapshot
my $str1 = `cleartool lsview -long -cview`;
if($? == 0) { dodie("pred.pl must be executed within a clearcase view"); }
my @ary1 = grep(/Global path:/, split(/\n/, $str1));
if($str1 =~ /View attributes: snapshot/sm) { $is_snapshot = 1; }

my $predfile = "$element\@\@$pred";
$predfile =~ s/\'//g;#'
#printf("$predfile\n");
if ($is_snapshot) { 
  my $predtemp = "c:\\temp\\pred.txt";
  unlink($predtemp);
  my $cmd = "cleartool get -to $predtemp $predfile"; printf("$cmd\n");
  my $str2 = `$cmd`;
  $predfile = $predtemp;
}
sub dodie {
    my $message = $_[0];
    print($message . "\n");
    exit 1;
}

exec "diff $switches $predfile $file";

Leave a Comment