difftool: Check all return codes from compare()
authorDavid Aguilar <davvid@gmail.com>
Wed, 25 Jul 2012 03:14:23 +0000 (20:14 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Jul 2012 16:41:54 +0000 (09:41 -0700)
Handle the case where compare() is unable to read its inputs.
Emit a warning so that the user knows that something went wrong.

We may later want to restructure the code so that we can inhibit
tempdir cleanup when this condition is reached.

Signed-off-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-difftool.perl
index 30574801be36d83cb77bed6423a16a5f634ace4b..92f4907bbc1ba4886a5cfcf59b760457a9191a1f 100755 (executable)
@@ -370,7 +370,16 @@ sub dir_diff
        # external tool did not replace the original link with a file.
        for my $file (@worktree) {
                next if $symlinks && -l "$b/$file";
-               if (-f "$b/$file" && compare("$b/$file", "$workdir/$file")) {
+               next if ! -f "$b/$file";
+
+               my $diff = compare("$b/$file", "$workdir/$file");
+               if ($diff == 0) {
+                       next;
+               } elsif ($diff == -1) {
+                       my $errmsg = "warning: Could not compare ";
+                       $errmsg += "'$b/$file' with '$workdir/$file'\n";
+                       warn $errmsg;
+               } elsif ($diff == 1) {
                        copy("$b/$file", "$workdir/$file") or die $!;
                        my $mode = stat("$b/$file")->mode;
                        chmod($mode, "$workdir/$file") or die $!;