From d08d7d95cfb5813b08f4c0bbc50cc435f6cf275c Mon Sep 17 00:00:00 2001 From: "jkeiser%netscape.com" <> Date: Wed, 20 Aug 2003 07:45:39 +0000 Subject: Check for PatchReader as a part of the installation and disable the "Diff" links if it is not there (bug 215268) --- attachment.cgi | 98 ++++++++++++++++----------- checksetup.pl | 20 ++++++ show_bug.cgi | 6 ++ template/en/default/attachment/edit.html.tmpl | 16 ++++- template/en/default/attachment/list.html.tmpl | 2 +- 5 files changed, 99 insertions(+), 43 deletions(-) diff --git a/attachment.cgi b/attachment.cgi index 149ddfd21..07dbe5e51 100755 --- a/attachment.cgi +++ b/attachment.cgi @@ -467,11 +467,11 @@ sub interdiff $ENV{'PATH'} = $::diffpath; open my $interdiff_fh, "$::interdiffbin $old_filename $new_filename|"; binmode $interdiff_fh; - my ($iter, $last_iter) = setup_iterators(""); + my ($reader, $last_reader) = setup_patch_readers(""); if ($::FORM{'format'} eq "raw") { - require PatchIterator::DiffPrinter::raw; - $last_iter->sends_data_to(new PatchIterator::DiffPrinter::raw()); + require PatchReader::DiffPrinter::raw; + $last_reader->sends_data_to(new PatchReader::DiffPrinter::raw()); # Actually print out the patch print $cgi->header(-type => 'text/plain', -expires => '+3M'); @@ -487,9 +487,9 @@ sub interdiff delete $vars->{attachid}; delete $vars->{do_context}; delete $vars->{context}; - setup_template_iterator($iter, $last_iter); + setup_template_patch_reader($last_reader); } - $iter->iterate_fh($interdiff_fh, "interdiff #$::FORM{'oldid'} #$::FORM{'newid'}"); + $reader->iterate_fh($interdiff_fh, "interdiff #$::FORM{'oldid'} #$::FORM{'newid'}"); close $interdiff_fh; $ENV{'PATH'} = ''; @@ -505,10 +505,10 @@ sub get_unified_diff my ($id) = @_; # Bring in the modules we need - require PatchIterator::Raw; - require PatchIterator::FixPatchRoot; - require PatchIterator::DiffPrinter::raw; - require PatchIterator::PatchInfoGrabber; + require PatchReader::Raw; + require PatchReader::FixPatchRoot; + require PatchReader::DiffPrinter::raw; + require PatchReader::PatchInfoGrabber; require File::Temp; # Get the patch @@ -520,18 +520,29 @@ sub get_unified_diff } # Reads in the patch, converting to unified diff in a temp file - my $iter = new PatchIterator::Raw; + my $reader = new PatchReader::Raw; + my $last_reader = $reader; + # fixes patch root (makes canonical if possible) - my $fix_patch_root = new PatchIterator::FixPatchRoot(Param('cvsroot')); - $iter->sends_data_to($fix_patch_root); + if (Param('cvsroot')) { + my $fix_patch_root = new PatchReader::FixPatchRoot(Param('cvsroot')); + $last_reader->sends_data_to($fix_patch_root); + $last_reader = $fix_patch_root; + } + # Grabs the patch file info - my $patch_info_grabber = new PatchIterator::PatchInfoGrabber(); - $fix_patch_root->sends_data_to($patch_info_grabber); + my $patch_info_grabber = new PatchReader::PatchInfoGrabber(); + $last_reader->sends_data_to($patch_info_grabber); + $last_reader = $patch_info_grabber; + # Prints out to temporary file my ($fh, $filename) = File::Temp::tempfile(); - $patch_info_grabber->sends_data_to(new PatchIterator::DiffPrinter::raw($fh)); + my $raw_printer = new PatchReader::DiffPrinter::raw($fh); + $last_reader->sends_data_to($raw_printer); + $last_reader = $raw_printer; + # Iterate! - $iter->iterate_string($id, $thedata); + $reader->iterate_string($id, $thedata); return ($bugid, $description, $filename, $patch_info_grabber->patch_info()->{files}); } @@ -557,7 +568,7 @@ sub warn_if_interdiff_might_fail { return undef; } -sub setup_iterators { +sub setup_patch_readers { my ($diff_root) = @_; # @@ -568,36 +579,36 @@ sub setup_iterators { # headers=0|1 # - # Define the iterators - # The iterator that reads the patch in (whatever its format) - require PatchIterator::Raw; - my $iter = new PatchIterator::Raw; - my $last_iter = $iter; + # Define the patch readers + # The reader that reads the patch in (whatever its format) + require PatchReader::Raw; + my $reader = new PatchReader::Raw; + my $last_reader = $reader; # Fix the patch root if we have a cvs root if (Param('cvsroot')) { - require PatchIterator::FixPatchRoot; - $last_iter->sends_data_to(new PatchIterator::FixPatchRoot(Param('cvsroot'))); - $last_iter->sends_data_to->diff_root($diff_root) if defined($diff_root); - $last_iter = $last_iter->sends_data_to; + require PatchReader::FixPatchRoot; + $last_reader->sends_data_to(new PatchReader::FixPatchRoot(Param('cvsroot'))); + $last_reader->sends_data_to->diff_root($diff_root) if defined($diff_root); + $last_reader = $last_reader->sends_data_to; } # Add in cvs context if we have the necessary info to do it if ($::FORM{'context'} ne "patch" && $::cvsbin && Param('cvsroot_get')) { - require PatchIterator::AddCVSContext; - $last_iter->sends_data_to( - new PatchIterator::AddCVSContext($::FORM{'context'}, + require PatchReader::AddCVSContext; + $last_reader->sends_data_to( + new PatchReader::AddCVSContext($::FORM{'context'}, Param('cvsroot_get'))); - $last_iter = $last_iter->sends_data_to; + $last_reader = $last_reader->sends_data_to; } - return ($iter, $last_iter); + return ($reader, $last_reader); } -sub setup_template_iterator +sub setup_template_patch_reader { - my ($iter, $last_iter) = @_; + my ($last_reader) = @_; - require PatchIterator::DiffPrinter::template; + require PatchReader::DiffPrinter::template; my $format = $::FORM{'format'}; @@ -614,7 +625,7 @@ sub setup_template_iterator # Print everything out print $cgi->header(-type => 'text/html', -expires => '+3M'); - $last_iter->sends_data_to(new PatchIterator::DiffPrinter::template($template, + $last_reader->sends_data_to(new PatchReader::DiffPrinter::template($template, "attachment/diff-header.$format.tmpl", "attachment/diff-file.$format.tmpl", "attachment/diff-footer.$format.tmpl", @@ -638,17 +649,17 @@ sub diff return; } - my ($iter, $last_iter) = setup_iterators(); + my ($reader, $last_reader) = setup_patch_readers(); if ($::FORM{'format'} eq "raw") { - require PatchIterator::DiffPrinter::raw; - $last_iter->sends_data_to(new PatchIterator::DiffPrinter::raw()); + require PatchReader::DiffPrinter::raw; + $last_reader->sends_data_to(new PatchReader::DiffPrinter::raw()); # Actually print out the patch use vars qw($cgi); print $cgi->header(-type => 'text/plain', -expires => '+3M'); - $iter->iterate_string("Attachment " . $::FORM{'id'}, $thedata); + $reader->iterate_string("Attachment " . $::FORM{'id'}, $thedata); } else { @@ -674,9 +685,9 @@ sub diff $vars->{bugid} = $bugid; $vars->{attachid} = $::FORM{'id'}; $vars->{description} = $description; - setup_template_iterator($iter, $last_iter); + setup_template_patch_reader($last_reader); # Actually print out the patch - $iter->iterate_string("Attachment " . $::FORM{'id'}, $thedata); + $reader->iterate_string("Attachment " . $::FORM{'id'}, $thedata); } } @@ -937,6 +948,11 @@ sub edit $vars->{'attachments'} = \@bugattachments; $vars->{'GetBugLink'} = \&GetBugLink; + # Determine if PatchReader is installed + eval { + require PatchReader; + $vars->{'patchviewerinstalled'} = 1; + }; print Bugzilla->cgi->header(); # Generate and return the UI (HTML page) from the appropriate template. diff --git a/checksetup.pl b/checksetup.pl index 00605415d..cde336d74 100755 --- a/checksetup.pl +++ b/checksetup.pl @@ -268,6 +268,7 @@ my $chartbase = have_vers("Chart::Base","0.99"); my $xmlparser = have_vers("XML::Parser",0); my $gdgraph = have_vers("GD::Graph",0); my $gdtextalign = have_vers("GD::Text::Align",0); +my $patchreader = have_vers("PatchReader",0); print "\n" unless $silent; if ((!$gd || !$chartbase) && !$silent) { @@ -295,6 +296,17 @@ if ((!$gd || !$gdgraph || !$gdtextalign) && !$silent) { "-e'install \"GD::Text::Align\"'\n" if !$gdtextalign; print "\n"; } +if (!$patchreader && !$silent) { + print "If you want to see pretty HTML views of patches, you should "; + print "install the \nPatchReader module, which can be downloaded at:\n"; + print "http://search.cpan.org/CPAN/authors/id/J/JK/JKEISER/PatchReader-0.9.2.tar.gz\n"; + print "When you get it, do the following to install:\n"; + print "tar xzvf PatchReader-0.9.2.tar.gz\n"; + print "cd PatchReader-0.9.2\n"; + print "perl Makefile.PL\n"; + print "make install\n\n"; +} + if (%missing) { print "\n\n"; print "Bugzilla requires some Perl modules which are either missing from your\n", @@ -461,6 +473,14 @@ END if (!LocalVarExists('interdiffbin')) { my $interdiff_executable = `which interdiff`; if ($interdiff_executable =~ /no interdiff/ || $interdiff_executable eq '') { + if (!$silent) { + print "\nOPTIONAL NOTE: If you want to "; + print "be able to use the\n 'difference between two patches"; + print "feature of Bugzilla (requires\n the PatchReader Perl module"; + print "as well), you should install\n patchutils from "; + print "http://cyberelk.net/tim/patchutils/\n\n"; + } + # If which didn't find it, set to blank $interdiff_executable = ""; } else { diff --git a/show_bug.cgi b/show_bug.cgi index 711b7201b..c7a780404 100755 --- a/show_bug.cgi +++ b/show_bug.cgi @@ -73,6 +73,12 @@ if ($single) { } } +# Determine if Patch Viewer is installed, for Diff link +eval { + require PatchReader; + $vars->{'patchviewerinstalled'} = 1; +}; + $vars->{'bugs'} = \@bugs; # Next bug in list (if there is one) diff --git a/template/en/default/attachment/edit.html.tmpl b/template/en/default/attachment/edit.html.tmpl index 2cfc0e088..3de65766a 100644 --- a/template/en/default/attachment/edit.html.tmpl +++ b/template/en/default/attachment/edit.html.tmpl @@ -90,6 +90,7 @@ { switchToMode('edit'); } +[% IF patchviewerinstalled %] function viewDiff() { switchToMode('diff'); @@ -102,6 +103,7 @@ has_viewed_as_diff = 1; } } +[% END %] function viewRaw() { switchToMode('raw'); @@ -120,11 +122,15 @@ hideElementById('undoEditButton'); } else if (current_mode == 'raw') { hideElementById('viewFrame'); +[% IF patchviewerinstalled %] hideElementById('viewDiffButton'); +[% END %] hideElementById(has_edited ? 'redoEditButton' : 'editButton'); hideElementById('smallCommentFrame'); } else if (current_mode == 'diff') { +[% IF patchviewerinstalled %] hideElementById('viewDiffFrame'); +[% END %] hideElementById('viewRawButton'); hideElementById(has_edited ? 'redoEditButton' : 'editButton'); hideElementById('smallCommentFrame'); @@ -136,11 +142,15 @@ showElementById('undoEditButton'); } else if (mode == 'raw') { showElementById('viewFrame'); +[% IF patchviewerinstalled %] showElementById('viewDiffButton'); +[% END %] showElementById(has_edited ? 'redoEditButton' : 'editButton'); showElementById('smallCommentFrame'); } else if (mode == 'diff') { +[% IF patchviewerinstalled %] showElementById('viewDiffFrame'); +[% END %] showElementById('viewRawButton'); showElementById(has_edited ? 'redoEditButton' : 'editButton'); showElementById('smallCommentFrame'); @@ -227,7 +237,7 @@

Actions: View - [% IF ispatch %] + [% IF ispatch && patchviewerinstalled %] | Diff [% END %] @@ -243,11 +253,15 @@