Date: Fri, 14 Nov 2003 23:04:39 -0500 From: Bryce W Nesbitt <bryce1@obviously.com> To: freebsd-cvsweb@FreeBSD.org Subject: Re: Patch to cvsweb? Message-ID: <3FB5A5D7.9060108@obviously.com> In-Reply-To: <1068671035.4763.136.camel@bobcat.mine.nu> References: <3FB23C1F.6040502@obviously.com> <1068661352.4763.72.camel@bobcat.mine.nu> <3FB28082.6070707@obviously.com> <1068671035.4763.136.camel@bobcat.mine.nu>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --] Ville Skyttä wrote: >On Wed, 2003-11-12 at 20:48, Bryce Nesbitt (spam account) wrote: > > >>I am working with CVS HEAD. >>My modified version is at: >> http://www.obviously.com/test/cvsweb.cgi/MassGIS/ >> >>I implemented an external diff utility. In this case, it >>compares binary application files stored inside a .zip archive. >> >> > >Whoo, looks cool. Could you post the source code (or prefreably a >unified diff against CVS HEAD) somewhere? > > This version, patched against CVS HEAD, can diff the contents of a .zip archive. You can also specify which "diff" utility to use for which mime type: %DIFF_COMMANDS = ( "application/arcview" => "shpdiff", "application/vnd.ms-excel" => "excel_diff", ); There's more to do, but I hope this patch is a good start. -Bryce Nesbitt [-- Attachment #2 --] ? cvsroot_test Index: cvsweb.cgi =================================================================== RCS file: /home/ncvs/projects/cvsweb/cvsweb.cgi,v retrieving revision 1.215 diff -u -r1.215 cvsweb.cgi --- cvsweb.cgi 25 Oct 2003 19:16:32 -0000 1.215 +++ cvsweb.cgi 14 Nov 2003 22:41:10 -0000 @@ -62,7 +62,7 @@ $VERSION $config $allow_version_select @CVSrepositories @CVSROOT %CVSROOT %CVSROOTdescr - %MIRRORS %DEFAULTVALUE %ICONS %MTYPES + %MIRRORS %DEFAULTVALUE %ICONS %MTYPES %DIFF_COMMANDS %DIFF_OPTIONS @DIFFTYPES %DIFFTYPES @LOGSORTKEYS %LOGSORTKEYS %alltags %fileinfo %tags @branchnames %nameprinted %symrev %revsym @allrevisions %date %author @revdisplayorder @@ -100,7 +100,7 @@ use File::Spec::Functions qw(catdir catfile curdir devnull rootdir tmpdir updir); use File::Temp qw(tempdir); -use IPC::Run qw(finish timeout); +#use IPC::Run qw(finish timeout); # Not on RedHat 7.3... use Time::Local qw(timegm); use URI::Escape qw(uri_escape uri_unescape); @@ -2232,7 +2232,72 @@ my @difftype = @{$difftype->{'opts'}}; my $human_readable = $difftype->{'colored'}; - # apply special options + + ####################################################################### + # First, check if we need to uncompress a .zip archive + # + my $mimetype = getMimeType($fullname); + my $cvsname = $where; + + if( $mimetype eq "application/zip" ) { + http_header("text/plain"); + + # Create two temporary directories + my $tmpexportdir1 = tempdir('cvsweb1.XXXXXXXX', TMPDIR => 1); + my $tmpexportdir2 = tempdir('cvsweb2.XXXXXXXX', TMPDIR => 1); + + # Check out and uncompress rev1 + $cvsname =~ s/\.diff$//; + chdir($tmpexportdir1) or exit -1; + system ($CMD{cvs}, @cvs_options, '-Qd', $cvsroot, 'co', "-r$rev1", $cvsname); + system ($CMD{unzip}, $cvsname); + + # Check out and uncompress rev2 + $cvsname =~ s/\.diff$//; + chdir($tmpexportdir2) or exit -1; + system ($CMD{cvs}, @cvs_options, '-Qd', $cvsroot, 'co', "-r$rev2", $cvsname); + system ($CMD{unzip}, $cvsname); + + # Examine each file, check if a special diffing command is defined in %DIFF_COMMANDS + # This is useful for comparing binary files (spreadsheets, images, etc) that + # don't work with standard text diff. + my $processed_something = 0; + my $fname; + my $diffutil; + opendir(DIR, $tmpexportdir1) or die "can't opendir $tmpexportdir1: $!"; + while (defined($fname = readdir(DIR))) { + $mimetype = getMimeType($fname); + #print "Saw file $fname | $mimetype\n"; + if( $diffutil = $DIFF_COMMANDS{$mimetype} ) { + if( !defined $CMD{$diffutil} ) { + print "Error: can't find utility '$diffutil' to handle mimetype '$mimetype'\n"; + } + if( $DIFF_OPTIONS{$mimetype} ne "" ) { + system($CMD{$diffutil}, $DIFF_OPTIONS{$mimetype}, + "$tmpexportdir1/$fname", "$tmpexportdir2/$fname"); + $processed_something = 1; + } else { + system($CMD{$diffutil}, "$tmpexportdir1/$fname", "$tmpexportdir2/$fname"); + $processed_something = 1; + } + } + } + closedir(DIR); + + # If we did not diff anything above, then just do a standard "diff -r" + if( !$processed_something ) { + system ($CMD{diff}, "-r", "$tmpexportdir1", "$tmpexportdir2"); + } + + # Delete temporary directories + system ($CMD{rm}, "-r", "$tmpexportdir1"); + system ($CMD{rm}, "-r", "$tmpexportdir2"); + exit; + } + + + ####################################################################### + # regular diff: apply special options if ($showfunc) { push @difftype, '-p' if $f ne 's'; @@ -2322,7 +2387,7 @@ # - Add "no differences found" if the diff command supplied no output. # #*** src/sys/netinet/tcp_output.c 1995/11/03 22:08:08 1.16 - #--- src/sys/netinet/tcp_output.c 1995/12/05 17:46:35 1.17 RELENG_2_1_0 + #--- src/sys/netinet/tcp_output.c 1995/12/05 17:46:35 1.17 REL_2_1_0 # (bogus example, but...) # my ($f1, $f2); @@ -2355,6 +2420,7 @@ } + ############################### # Show Logs .. ############################### @@ -3106,8 +3172,8 @@ print "<p>\n "; print &link($backicon, "$backurl#$filename"), " <b>Up to ", &clickablePath($upwhere, 1), "</b>\n</p>\n"; - print "<p>\n "; - print &link('Request diff between arbitrary revisions', '#diff'); + #print "<p>\n "; + #print &link('Request diff between arbitrary revisions', '#diff'); if ($allow_cvsgraph) { print ' / ', &graph_link('', 'Display revisions graphically'); } Index: cvsweb.conf =================================================================== RCS file: /home/ncvs/projects/cvsweb/cvsweb.conf,v retrieving revision 1.64 diff -u -r1.64 cvsweb.conf --- cvsweb.conf 30 Oct 2003 20:09:18 -0000 1.64 +++ cvsweb.conf 14 Nov 2003 22:41:11 -0000 @@ -24,7 +24,7 @@ # Search the above directories for each command (prefer gtar over tar). # -for (qw(cvs rlog rcsdiff gzip gtar zip cvsgraph enscript)) { +for (qw(cvs rlog rcsdiff gzip gtar zip cvsgraph enscript unzip diff rm shpdiff)) { $CMD{$_} = search_path($_); } $CMD{tar} = delete($CMD{gtar}) if $CMD{gtar}; @@ -42,7 +42,7 @@ # 'symbolic_name' => ['Name to display', '/path/to/cvsroot'] # @CVSrepositories = ( - 'local' => ['Local Repository', '/home/cvs'], + 'local' => ['Local Repository', '/var/www/html/cvsweb/cvsroot_test'], # 'freebsd' => ['FreeBSD', '/home/ncvs'], # 'openbsd' => ['OpenBSD', '/home/ncvs'], # 'netbsd' => ['NetBSD', '/home/ncvs'], @@ -318,6 +318,19 @@ # $inputTextSize = 12; +########################################################################### +# Custom diff type based on mime type +# (used for comparing binary files such as spreadhseets, images) +# +%DIFF_COMMANDS = ( + "application/vnd.arcview" => "shpdiff", + "application/vnd.ms-excel" => "excel_diff", +); +%DIFF_OPTIONS = ( + "application/vnd.arcview" => "", + "application/vnd.ms-excel" => "-vvv", +); + ############## # Mime Types ############## @@ -343,8 +356,12 @@ "jpg" => "image/jpeg", "png" => "image/png", "xpm" => "image/xpm", + "zip" => "application/zip", + "shp" => "application/vnd.arcview", + "xls" => "application/vnd.ms-excel", # "*" => "text/plain", ); + # The traditional mime.types file, eg. the one from Apache is fine. # See above where this gets used.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3FB5A5D7.9060108>
