]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 784352: Show a warning when interdiff reports errors
authorByron Jones <bjones@mozilla.com>
Thu, 7 Feb 2013 07:03:00 +0000 (15:03 +0800)
committerByron Jones <bjones@mozilla.com>
Thu, 7 Feb 2013 07:03:00 +0000 (15:03 +0800)
r=dkl, a=LpSolit

Bugzilla/Attachment/PatchReader.pm
template/en/default/attachment/diff-header.html.tmpl

index cf16485794165d467ec8ed6481da9753f105902e..29ff1f93f3f418e5dde5e9b92c24073c75ae5290 100644 (file)
@@ -10,6 +10,9 @@ package Bugzilla::Attachment::PatchReader;
 use 5.10.1;
 use strict;
 
+use IPC::Open3;
+use Symbol 'gensym';
+
 use Bugzilla::Error;
 use Bugzilla::Attachment;
 use Bugzilla::Util;
@@ -100,8 +103,23 @@ sub process_interdiff {
     # Send through interdiff, send output directly to template.
     # Must hack path so that interdiff will work.
     $ENV{'PATH'} = $lc->{diffpath};
-    open my $interdiff_fh, "$lc->{interdiffbin} $old_filename $new_filename|";
-    binmode $interdiff_fh;
+
+    my ($interdiff_stdout, $interdiff_stderr);
+    $interdiff_stderr = gensym;
+    my $pid = open3(gensym, $interdiff_stdout, $interdiff_stderr,
+                    $lc->{interdiffbin}, $old_filename, $new_filename);
+    binmode $interdiff_stdout;
+
+    # Check for errors
+    {
+        local $/ = undef;
+        my $error = <$interdiff_stderr>;
+        if ($error) {
+            warn($error);
+            $warning = 'interdiff3';
+        }
+    }
+
     my ($reader, $last_reader) = setup_patch_readers("", $context);
 
     if ($format eq 'raw') {
@@ -114,7 +132,7 @@ sub process_interdiff {
     }
     else {
         # In case the HTML page is displayed with the UTF-8 encoding.
-        binmode $interdiff_fh, ':utf8' if Bugzilla->params->{'utf8'};
+        binmode $interdiff_stdout, ':utf8' if Bugzilla->params->{'utf8'};
 
         $vars->{'warning'} = $warning if $warning;
         $vars->{'bugid'} = $new_attachment->bug_id;
@@ -125,9 +143,9 @@ sub process_interdiff {
 
         setup_template_patch_reader($last_reader, $format, $context, $vars);
     }
-    $reader->iterate_fh($interdiff_fh, 'interdiff #' . $old_attachment->id .
+    $reader->iterate_fh($interdiff_stdout, 'interdiff #' . $old_attachment->id .
                         ' #' . $new_attachment->id);
-    close $interdiff_fh;
+    waitpid($pid, 0);
     $ENV{'PATH'} = '';
 
     # Delete temporary files.
index ed4d44e25899e3a5cdd3f68ff32f555d87527511..4261c8423c20e220bcf27f851637c0ce6f5dd00a 100644 (file)
@@ -119,15 +119,18 @@ Interdiff of #[% oldid %] and #[% newid %] for [% terms.bug %] #[% bugid %]
 [% END %]
 
 [% IF warning %]
-<h2 class="warning">Warning: 
+<h2 class="warning">
+  Warning:
   [% IF warning == "interdiff1" %]
-  this difference between two patches may show things in the wrong places due
-  to a limitation in [% terms.Bugzilla %] when comparing patches with different
-  sets of files.
-  [% END %]
-  [% IF warning == "interdiff2" %]
-  this difference between two patches may be inaccurate due to a limitation in
-  [%+ terms.Bugzilla %] when comparing patches made against different revisions.
+    this difference between two patches may show things in the wrong places due
+    to a limitation in [% terms.Bugzilla %] when comparing patches with
+    different sets of files.
+  [% ELSIF warning == "interdiff2" %]
+    this difference between two patches may be inaccurate due to a limitation
+    in [%+ terms.Bugzilla %] when comparing patches made against different
+    revisions.
+  [% ELSIF warning == "interdiff3" %]
+    interdiff encountered errors while comparing these patches.
   [% END %]
 </h2>
 [% ELSE %]