Author: rob
Date: Mon Sep 26 14:47:55 2011
New Revision: 29498
URL: https://ssl.nixos.org/websvn/nix/?rev=29498&sc=1

Log:
add log diff to compare logs to previous builds

Modified:
   hydra/trunk/deps.nix
   hydra/trunk/src/lib/Hydra/Controller/API.pm
   hydra/trunk/src/lib/Hydra/Controller/Root.pm
   hydra/trunk/src/root/build.tt

Modified: hydra/trunk/deps.nix
==============================================================================
--- hydra/trunk/deps.nix        Mon Sep 26 13:15:33 2011        (r29497)
+++ hydra/trunk/deps.nix        Mon Sep 26 14:47:55 2011        (r29498)
@@ -20,6 +20,8 @@
   perlPackages.DBDSQLite
   perlPackages.EmailSender
   perlPackages.TextTable
+  perlPackages.TextDiff
+  perlPackages.FileSlurp
   perlPackages.NetTwitterLite
   perlPackages.PadWalker
   perlPackages.DataDump

Modified: hydra/trunk/src/lib/Hydra/Controller/API.pm
==============================================================================
--- hydra/trunk/src/lib/Hydra/Controller/API.pm Mon Sep 26 13:15:33 2011        
(r29497)
+++ hydra/trunk/src/lib/Hydra/Controller/API.pm Mon Sep 26 14:47:55 2011        
(r29498)
@@ -10,6 +10,8 @@
 use JSON::Any;
 use DateTime;
 use Digest::SHA qw(sha256_hex);
+use Text::Diff;
+use File::Slurp;
 
 # !!! Rewrite this to use View::JSON.
 
@@ -213,7 +215,7 @@
     if($type eq "hg") {
         my $clonePath = scmPath . "/" . sha256_hex($uri);
         die if ! -d $clonePath;
-       $diff .= `(cd $clonePath ; hg log -r $rev1:$rev2)`;
+       $diff .= `(cd $clonePath ; hg log -r $rev1 -r $rev2 -b $branch)`;
        $diff .= `(cd $clonePath ; hg diff -r $rev1:$rev2)`;
     } elsif ($type eq "git") {
         my $clonePath = scmPath . "/" . sha256_hex($uri.$branch);
@@ -225,5 +227,38 @@
     $c->stash->{'plain'} = { data => (scalar $diff) || " " };
     $c->forward('Hydra::View::Plain');
 }
+
+sub readNormalizedLog {
+    my ($file) = @_;
+    my $res = read_file($file);
+
+    $res =~ s/\/nix\/store\/[a-z0-9]*-/\/nix\/store\/...-/g;
+    $res =~ s/nix-build-[a-z0-9]*-/nix-build-...-/g;
+    $res =~ s/[0-9]{2}:[0-9]{2}:[0-9]{2}/00:00:00/g;
+    return $res;
+}
+
+sub logdiff : Chained('api') PathPart('logdiff') Args(2) {
+    my ($self, $c, $buildid1, $buildid2) = @_;
+
+    my $diff = "";
+
+    my $build1 = getBuild($c, $buildid1);
+    notFound($c, "Build with ID $buildid1 doesn't exist.")
+        if !defined $build1;
+    my $build2 = getBuild($c, $buildid2);
+    notFound($c, "Build with ID $buildid2 doesn't exist.")
+        if !defined $build2;
+
+    if (-f $build1->resultInfo->logfile && -f $build2->resultInfo->logfile) {
+        my $logtext1 = readNormalizedLog($build1->resultInfo->logfile);
+        my $logtext2 = readNormalizedLog($build2->resultInfo->logfile);
+        $diff = diff \$logtext1, \$logtext2;
+    } else {
+        $c->response->status(404);
+    }
+    $c->stash->{'plain'} = { data => (scalar $diff) || " " };
+    $c->forward('Hydra::View::Plain');
+}
 
 1;

Modified: hydra/trunk/src/lib/Hydra/Controller/Root.pm
==============================================================================
--- hydra/trunk/src/lib/Hydra/Controller/Root.pm        Mon Sep 26 13:15:33 
2011        (r29497)
+++ hydra/trunk/src/lib/Hydra/Controller/Root.pm        Mon Sep 26 14:47:55 
2011        (r29498)
@@ -151,6 +151,7 @@
         , uri_for('Root', 'status', [])
         , uri_for('Root', 'all', [])
         , uri_for('API', 'scmdiff', [])
+        , uri_for('API', 'logdiff', [],"*", "*")
         , uri_for('Project', 'all', ["*"])
         , channelUris('Root', ["*"])
         , channelUris('Project', ["*", "*"])

Modified: hydra/trunk/src/root/build.tt
==============================================================================
--- hydra/trunk/src/root/build.tt       Mon Sep 26 13:15:33 2011        (r29497)
+++ hydra/trunk/src/root/build.tt       Mon Sep 26 14:47:55 2011        (r29498)
@@ -184,15 +184,19 @@
                                [% INCLUDE renderBuildSteps type="Failed" %]
                        [% END %]
 
-            [% IF build.resultInfo.buildstatus != 0 && prevSuccessfulBuild %]
             <h2>Changes</h2>
-            Changes compared to last successful build:<br/>
             <br/> 
             <table>
                 <thead>
                     <th>Last successful build <tt>[% INCLUDE renderDateTime 
timestamp = prevSuccessfulBuild.timestamp %]</tt></th>
-                    [% IF prevSuccessfulBuild && firstBrokenBuild && 
firstBrokenBuild.id != build.id %]<th>First broken build <tt>[% INCLUDE 
renderDateTime timestamp = firstBrokenBuild.timestamp %]</tt></th>[% END %]
-                    <th>This build <tt>[% INCLUDE renderDateTime timestamp = 
build.timestamp %]</tt></th>
+                    [% IF prevSuccessfulBuild && firstBrokenBuild && 
firstBrokenBuild.id != build.id %]
+                        <th>First broken build <tt>[% INCLUDE renderDateTime 
timestamp = firstBrokenBuild.timestamp %]</tt><br/>
+                            <tt>[ <a href="[% 
c.uri_for(c.controller('API').action_for('logdiff') prevSuccessfulBuild.id 
firstBrokenBuild.id ) %]">log diff</a> ]</tt>
+                        </th>
+                    [% END %]
+                    <th>This build <tt>[% INCLUDE renderDateTime timestamp = 
build.timestamp %]</tt> <br/>
+                        <tt>[ <a href="[% 
c.uri_for(c.controller('API').action_for('logdiff') prevSuccessfulBuild.id 
build.id) %]">log diff</a> ]</tt>
+                    </th>
                 </thead>
                 <tr>
                     <td valign="center">[% INCLUDE renderBuildStatusIcon 
build=prevSuccessfulBuild size=32 %] [% INCLUDE renderFullBuildLink 
build=prevSuccessfulBuild %]</td>
@@ -205,7 +209,6 @@
                     <td>[% INCLUDE renderInputDiff build1=prevSuccessfulBuild 
, build2=build %]</td>
                 </tr>
             </table>
-            [% END %]
 
                        [% IF build.resultInfo.errormsg && 
build.resultInfo.buildstatus != 5 %]
                
_______________________________________________
nix-commits mailing list
nix-comm...@lists.science.uu.nl
http://lists.science.uu.nl/mailman/listinfo/nix-commits

Reply via email to