From 275eb1b39a25ef88f47fa5b592c9cf02ad9f754d Mon Sep 17 00:00:00 2001 From: Byron Jones Date: Thu, 7 Feb 2013 15:03:00 +0800 Subject: Bug 784352: Show a warning when interdiff reports errors r=dkl, a=LpSolit --- Bugzilla/Attachment/PatchReader.pm | 28 ++++++++++++++++++---- .../en/default/attachment/diff-header.html.tmpl | 19 ++++++++------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/Bugzilla/Attachment/PatchReader.pm b/Bugzilla/Attachment/PatchReader.pm index cf1648579..29ff1f93f 100644 --- a/Bugzilla/Attachment/PatchReader.pm +++ b/Bugzilla/Attachment/PatchReader.pm @@ -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. diff --git a/template/en/default/attachment/diff-header.html.tmpl b/template/en/default/attachment/diff-header.html.tmpl index ed4d44e25..4261c8423 100644 --- a/template/en/default/attachment/diff-header.html.tmpl +++ b/template/en/default/attachment/diff-header.html.tmpl @@ -119,15 +119,18 @@ Interdiff of #[% oldid %] and #[% newid %] for [% terms.bug %] #[% bugid %] [% END %] [% IF warning %] -

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 %]

[% ELSE %] -- cgit v1.2.3-24-g4f1b