Check for cockups in the schroot setup
[buildd-scripts.git] / bin / analyze_results
index f3c5f32..70c5e2f 100755 (executable)
@@ -17,31 +17,34 @@ my @logcheck = (
        # "rchitecture mismatch" -> should never build on this arch
        # Stop working on this log at this point
        string   => 'rchitecture mismatch',
-       pstring  => '.*',
-       message  => 'architecture mismatch',
+       message  => 'Architecture mismatch',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
     },
     {
        string   => 'not in arch list or does not match any',
-       pstring  => '.*',
-       message  => 'architecture mismatch',
+       message  => 'Architecture mismatch',
+       check    => 1,
+       stop     => 1,
+       timeout  => 0, # This is a real error, not a build timeout
+    },
+    {
+       string   => 'schroot.*File is not owned by user root',
+       message  => 'Schroot setup failure',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
     },
     {
        string   => 'No space left on device',
-       pstring  => '.*',
-       message  => 'ran out of disk space',
+       message  => 'Build ran out of disk space',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
     },
     {
        string   => 'aarch64-unknown-linux-gnu',
-       pstring  => '.*',
        message  => 'Wrong arch detected',
        check    => 1,
        stop     => 1,
@@ -49,7 +52,6 @@ my @logcheck = (
     },
     {
        string   => 'binutils-aarch64',
-       pstring  => '.*',
        message  => 'Wrong arch detected',
        check    => 1,
        stop     => 1,
@@ -57,7 +59,6 @@ my @logcheck = (
     },
     {
        string   => 'lib.linux-aarch64',
-       pstring  => '.*',
        message  => 'Wrong arch detected',
        check    => 1,
        stop     => 1,
@@ -68,8 +69,7 @@ my @logcheck = (
        # built. Why not picked up already above?.
        # Stop working on this log at this point
        string   => 'binary build with no binary artifacts found',
-       pstring  => '.*',
-       message  => 'no binaries built',
+       message  => 'No binaries built',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -77,8 +77,7 @@ my @logcheck = (
     {
        # "Bus error" -> alignment bug
        string   => 'Bus error',
-       pstring  => '.*',
-       message  => 'alignment problem',
+       message  => 'Alignment problem',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -86,8 +85,8 @@ my @logcheck = (
     {
        # "Segmentation fault" -> code problem
        string   => 'Segmentation fault',
-       pstring  => 'Setting up libglib2.0-cil',
-       message  => 'Segmentation fault (mono)',
+       pstring  => 'Setting up (\S+)',
+       message  => 'Segmentation fault when installing RESULT',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -95,7 +94,6 @@ my @logcheck = (
     {
        # "Segmentation fault" -> code problem
        string   => 'Segmentation fault',
-       pstring  => '.*',
        message  => 'Segmentation fault',
        check    => 1,
        stop     => 1,
@@ -104,8 +102,8 @@ my @logcheck = (
     {
        # "Illegal instruction" -> bad build target?
        string   => 'Illegal instruction',
-       pstring  => 'Setting up ghc',
-       message  => 'Illegal instruction (ghc)',
+       pstring  => 'Setting up (\S+)',
+       message  => 'Illegal instruction when installing RESULT',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -113,7 +111,6 @@ my @logcheck = (
     {
        # "Illegal instruction" -> bad build target?
        string   => 'Illegal instruction',
-       pstring  => '.*',
        message  => 'Illegal instruction',
        check    => 1,
        stop     => 1,
@@ -121,18 +118,16 @@ my @logcheck = (
     },
     {
        # Installing build-deps failed
-       string   => 'dpkg: error processing package',
-       pstring  => '.*',
-       message  => 'build-deps failed',
+       string   => 'dpkg: error processing package (\S+)',
+       message  => 'Build-dep failed to install (RESULT)',
        check    => 1,
-       stop     => 1,
+       stop     => 0,
        timeout  => 0, # This is a real error, not a build timeout
     },
     {
        # Installing build-deps failed
        string   => 'E: pbuilder-satisfydepends failed.',
-       pstring  => '.*',
-       message  => 'pbuilder build-deps failed',
+       message  => 'Pbuilder build-deps failed',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -140,17 +135,15 @@ my @logcheck = (
     {
        # Installing build-deps failed
        string   => 'E: Unmet dependencies',
-       pstring  => '.*',
-       message  => 'build-deps failed',
+       message  => 'Build-deps failed',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
     },
     {
        # Installing build-deps failed
-       string   => 'unsat-dependency:',
-       pstring  => '.*',
-       message  => 'build-deps failed',
+       string   => 'unsat-dependency: (\S+)',
+       message  => 'Missing build-dep (RESULT)',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -158,8 +151,7 @@ my @logcheck = (
     {
        # Build failed - missing build-dep?
        string   => 'build dependencies/conflicts unsatisfied',
-       pstring  => '.*',
-       message  => 'build-deps not satisfiable',
+       message  => 'Build-deps not satisfiable',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -167,8 +159,7 @@ my @logcheck = (
     {
        # Build failed - missing build-dep?
        string   => 'ld: cannot find',
-       pstring  => '.*',
-       message  => 'build failure: missing library - missing build-dep?',
+       message  => 'Build failure: missing library - missing build-dep?',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -176,8 +167,7 @@ my @logcheck = (
     {
        # Build failed - missing build-dep?
        string   => 'fatal error:.*No such file or directory',
-       pstring  => '.*',
-       message  => 'build failure: missing header - missing build-dep?',
+       message  => 'Build failure: missing header - missing build-dep?',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -185,8 +175,7 @@ my @logcheck = (
     {
        # Build failed - missing build-dep?
        string   => 'SEVERE: Cannot resolve dependencies',
-       pstring  => '.*',
-       message  => 'build failure - missing build-dep?',
+       message  => 'Build failure - missing build-dep?',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -194,8 +183,7 @@ my @logcheck = (
     {
        # Build failed - can't exec something...
        string   => 'error trying to exec.*execvp: No',
-       pstring  => '.*',
-       message  => 'build failure (missing binary)',
+       message  => 'Build failure (missing binary)',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -203,8 +191,7 @@ my @logcheck = (
     {
        # Build failed
        string   => 'BUILD FAILED',
-       pstring  => '.*',
-       message  => 'build failure (java/javadoc))',
+       message  => 'Build failure (java/javadoc))',
        check    => 1,
        stop     => 1,
        timeout  => 0, # This is a real error, not a build timeout
@@ -212,8 +199,7 @@ my @logcheck = (
     {
        # Build failed
        string   => 'make.*returned exit code',
-       pstring  => '.*',
-       message  => 'build failure (other)',
+       message  => 'Build failure (other)',
        check    => 1,
        stop     => 0,
        timeout  => 0, # This is a real error, not a build timeout
@@ -221,8 +207,7 @@ my @logcheck = (
     {
        # Build failed
        string   => '^make.*\*\*\*.* \[debian/rules.*Error \d+$',
-       pstring  => '.*',
-       message  => 'build failure (other)',
+       message  => 'Build failure (other)',
        check    => 1,
        stop     => 0,
        timeout  => 0, # This is a real error, not a build timeout
@@ -230,7 +215,6 @@ my @logcheck = (
     {
        # Build failed
        string   => 'dpkg-source: error: unrepresentable changes to source',
-       pstring  => '.*',
        message  => 'dpkg-source failure',
        check    => 1,
        stop     => 1,
@@ -239,32 +223,28 @@ my @logcheck = (
     {
        # Build failed
        string   => 'fakeroot debian/rules binary',
-       pstring  => '.*',
-       message  => 'build failure (other)',
+       message  => 'Build failure (other)',
        check    => 0,
        stop     => 1,
     },
     {
        # Test failure
        string   => 'OSError: \[Errno 13\] Permission denied',
-       pstring  => '.*',
-       message  => 'python EPERM test failure',
+       message  => 'Python EPERM test failure',
        check    => 1,
        stop     => 1,
     },
     {
        # Test failure
        string   => 'dh_auto_test:.*returned exit code \d+',
-       pstring  => '.*',
-       message  => 'test failure',
+       message  => 'Test failure',
        check    => 1,
        stop     => 1,
     },
     {
        # Timeout. pbuilder is too dumb to do this properly :-(
        string   => 'I: Terminating build process due to timeout',
-       pstring  => '.*',
-       message  => 'pbuilder build timeout',
+       message  => 'Pbuilder build timeout',
        check    => 1,
        stop     => 1,
        timeout  => 1, # This is a build timeout. If this happened
@@ -273,8 +253,7 @@ my @logcheck = (
     {
        # Timeout from sbuild
        string   => 'Build killed with signal TERM after \d+ minutes of inactivity',
-       pstring  => '.*',
-       message  => 'sbuild build timeout',
+       message  => 'Sbuild build timeout',
        check    => 1,
        stop     => 1,
        timeout  => 1, # This is a build timeout. If this happened
@@ -298,6 +277,7 @@ print "<title>Build log analysis</title>\n";
 print "</head>\n";
 print "<body>\n";
 print "<h1>Build log analysis</h1>\n";
+print "<p><a href=\"#summary\">Summary</a></p>\n";
 print "<h2>Packages</h2>\n";
 print "<ol>\n";
 
@@ -317,14 +297,18 @@ foreach my $input (@ARGV) {
            my %check = %$checktmp;
            if ($check{check}) {
                if (!$stop
-                   and $line =~ m/$check{string}/
-                   and $oldline =~ m/$check{pstring}/) {
+                   and ($line =~ m/$check{string}/)
+                   and (!$check{pstring} or $oldline =~ m/$check{pstring}/)) {
 #                  print "  Line $lineno: found \"$check{string}\"\n";
-                   $file_results{$check{message}} = 1;
+                   my $match = $1;
+                   my $message = $check{message};
+                   $message =~ s,RESULT,$match,g;
+                   $file_results{$message} = 1;
                    if ($check{timeout} and $errors == 0) {
+                       print "  <li>Line $lineno: $message\n";
                        print "  <li>Build killed by timeout before any errors at line $lineno\n";
                    } else {
-                       print "  <li>Line $lineno: $check{message}\n";
+                       print "  <li>Line $lineno: $message\n";
                        $errors++;
                    }
                    if ($check{stop}) {
@@ -338,7 +322,7 @@ foreach my $input (@ARGV) {
     }
     close IN;
     # End of checking this package
-    print "  <li><strong>found errors: $errors</strong>\n";
+    print "  <li><strong>Found errors: $errors</strong>\n";
     if (!$errors) {
        print " (maybe just timed out during build?)\n";
     }
@@ -368,12 +352,13 @@ foreach my $input (@ARGV) {
 }
 print "</ol>\n";
 
+print "<a name=\"summary\"</a>\n";
 print "<h2>Summary of results from $num_fail failed builds:</h2>\n";
-print "<ol>\n";
+print "<ul>\n";
 print "<li>Found $existing_bugs existing bugs</li>\n";
-foreach my $key (keys %log_results) {
+foreach my $key (sort { $log_results{$b} <=> $log_results{$a} } keys %log_results) {
     print "  <li>Found $log_results{$key} logs showing $key\n";
 }
-print "</ol>\n";
+print "</ul>\n";
 print "</body>\n";
 print "</html>\n";