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.
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 map
file 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).
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";