/** Report statistics about the last build */ function ReportLastBuild($type, $projectid, $siteid, $projectname, $nightlytime) { $xml = '<' . strtolower($type) . '>'; $nightlytime = strtotime($nightlytime); // Find the last build $build = pdo_query("SELECT starttime,id FROM build WHERE siteid='{$siteid}' AND projectid='{$projectid}' AND type='{$type}' ORDER BY submittime DESC LIMIT 1"); if (pdo_num_rows($build) > 0) { $build_array = pdo_fetch_array($build); $buildid = $build_array['id']; // Express the date in terms of days (makes more sens) $buildtime = strtotime($build_array['starttime'] . ' UTC'); $builddate = $buildtime; if (date(FMT_TIME, $buildtime) > date(FMT_TIME, $nightlytime)) { $builddate += 3600 * 24; //next day } if (date(FMT_TIME, $nightlytime) < '12:00:00') { $builddate -= 3600 * 24; // previous date } $date = date(FMT_DATE, $builddate); $days = (time() - strtotime($date)) / (3600 * 24); if ($days < 1) { $day = 'today'; } elseif ($days > 1 && $days < 2) { $day = 'yesterday'; } else { $day = round($days) . ' days'; } $xml .= add_XML_value('date', $day); $xml .= add_XML_value('datelink', 'index.php?project=' . urlencode($projectname) . '&date=' . $date); // Configure $configure = pdo_query("SELECT status FROM configure WHERE buildid='{$buildid}'"); if (pdo_num_rows($configure) > 0) { $configure_array = pdo_fetch_array($configure); $xml .= add_XML_value('configure', $configure_array['status']); if ($configure_array['status'] != 0) { $xml .= add_XML_value('configureclass', 'error'); } else { $xml .= add_XML_value('configureclass', 'normal'); } } else { $xml .= add_XML_value('configure', '-'); $xml .= add_XML_value('configureclass', 'normal'); } // Update $update = pdo_query('SELECT uf.updateid FROM updatefile AS uf,build2update AS b2u WHERE uf.updateid=b2u.updateid AND b2u.buildid=' . $buildid); $nupdates = pdo_num_rows($update); $xml .= add_XML_value('update', $nupdates); // Find locally modified files $updatelocal = pdo_query('SELECT uf.updateid FROM updatefile AS uf,build2update AS b2u WHERE uf.updateid=b2u.updateid AND b2u.buildid=' . $buildid . " AND uf.author='Local User'"); // Set the color if (pdo_num_rows($updatelocal) > 0) { $xml .= add_XML_value('updateclass', 'error'); } else { $xml .= add_XML_value('updateclass', 'normal'); } // Find the number of errors and warnings $Build = new Build(); $Build->Id = $buildid; $nerrors = $Build->GetNumberOfErrors(); $xml .= add_XML_value('error', $nerrors); $nwarnings = $Build->GetNumberOfWarnings(); $xml .= add_XML_value('warning', $nwarnings); // Set the color if ($nerrors > 0) { $xml .= add_XML_value('errorclass', 'error'); } elseif ($nwarnings > 0) { $xml .= add_XML_value('errorclass', 'warning'); } else { $xml .= add_XML_value('errorclass', 'normal'); } // Find the test $nnotrun = $Build->GetNumberOfNotRunTests(); $nfail = $Build->GetNumberOfFailedTests(); // Display the failing tests then the not run if ($nfail > 0) { $xml .= add_XML_value('testfail', $nfail); $xml .= add_XML_value('testfailclass', 'error'); } elseif ($nnotrun > 0) { $xml .= add_XML_value('testfail', $nnotrun); $xml .= add_XML_value('testfailclass', 'warning'); } else { $xml .= add_XML_value('testfail', '0'); $xml .= add_XML_value('testfailclass', 'normal'); } $xml .= add_XML_value('NA', '0'); } else { $xml .= add_XML_value('NA', '1'); } $xml .= '</' . strtolower($type) . '>'; return $xml; }
/** Report statistics about the last build */ function ReportLastBuild($type, $projectid, $siteid, $projectname, $nightlytime) { $xml = "<" . strtolower($type) . ">"; $nightlytime = strtotime($nightlytime); // Find the last build $build = pdo_query("SELECT starttime,id FROM build WHERE siteid='{$siteid}' AND projectid='{$projectid}' AND type='{$type}' ORDER BY submittime DESC LIMIT 1"); if (pdo_num_rows($build) > 0) { $build_array = pdo_fetch_array($build); $buildid = $build_array["id"]; // Express the date in terms of days (makes more sens) $buildtime = strtotime($build_array["starttime"] . " UTC"); $builddate = $buildtime; if (date(FMT_TIME, $buildtime) > date(FMT_TIME, $nightlytime)) { $builddate += 3600 * 24; //next day } if (date(FMT_TIME, $nightlytime) < '12:00:00') { $builddate -= 3600 * 24; // previous date } $date = date(FMT_DATE, $builddate); $days = (time() - strtotime($date)) / (3600 * 24); if ($days < 1) { $day = "today"; } else { if ($days > 1 && $days < 2) { $day = "yesterday"; } else { $day = round($days) . " days"; } } $xml .= add_XML_value("date", $day); $xml .= add_XML_value("datelink", "index.php?project=" . urlencode($projectname) . "&date=" . $date); // Configure $configure = pdo_query("SELECT status FROM configure WHERE buildid='{$buildid}'"); if (pdo_num_rows($configure) > 0) { $configure_array = pdo_fetch_array($configure); $xml .= add_XML_value("configure", $configure_array["status"]); if ($configure_array["status"] != 0) { $xml .= add_XML_value("configureclass", "error"); } else { $xml .= add_XML_value("configureclass", "normal"); } } else { $xml .= add_XML_value("configure", "-"); $xml .= add_XML_value("configureclass", "normal"); } // Update $update = pdo_query("SELECT uf.updateid FROM updatefile AS uf,build2update AS b2u WHERE uf.updateid=b2u.updateid AND b2u.buildid=" . $buildid); $nupdates = pdo_num_rows($update); $xml .= add_XML_value("update", $nupdates); // Find locally modified files $updatelocal = pdo_query("SELECT uf.updateid FROM updatefile AS uf,build2update AS b2u WHERE uf.updateid=b2u.updateid AND b2u.buildid=" . $buildid . " AND uf.author='Local User'"); // Set the color if (pdo_num_rows($updatelocal) > 0) { $xml .= add_XML_value("updateclass", "error"); } else { $xml .= add_XML_value("updateclass", "normal"); } // Find the number of errors and warnings $Build = new Build(); $Build->Id = $buildid; $nerrors = $Build->GetNumberOfErrors(); $xml .= add_XML_value("error", $nerrors); $nwarnings = $Build->GetNumberOfWarnings(); $xml .= add_XML_value("warning", $nwarnings); // Set the color if ($nerrors > 0) { $xml .= add_XML_value("errorclass", "error"); } else { if ($nwarnings > 0) { $xml .= add_XML_value("errorclass", "warning"); } else { $xml .= add_XML_value("errorclass", "normal"); } } // Find the test $nnotrun = $Build->GetNumberOfNotRunTests(); $nfail = $Build->GetNumberOfFailedTests(); // Display the failing tests then the not run if ($nfail > 0) { $xml .= add_XML_value("testfail", $nfail); $xml .= add_XML_value("testfailclass", "error"); } else { if ($nnotrun > 0) { $xml .= add_XML_value("testfail", $nnotrun); $xml .= add_XML_value("testfailclass", "warning"); } else { $xml .= add_XML_value("testfail", "0"); $xml .= add_XML_value("testfailclass", "normal"); } } $xml .= add_XML_value("NA", "0"); } else { $xml .= add_XML_value("NA", "1"); } $xml .= "</" . strtolower($type) . ">"; return $xml; }
/** Compute the user statistics */ public function ComputeUpdateStatistics() { if (!$this->Id) { add_log('Id is not set', 'Build::ComputeUpdateStatistics', LOG_ERR, $this->ProjectId, $this->Id, CDASH_OBJECT_BUILD, $this->Id); return false; } if (!$this->ProjectId) { add_log('ProjectId is not set', 'Build::ComputeUpdateStatistics', LOG_ERR, 0, $this->Id); return false; } $previousbuildid = $this->GetPreviousBuildId(); if ($previousbuildid < 1) { // Nothing to compare the current results against. return false; } // Find how the number of errors, warnings and test failures have changed. $previousbuild = new Build(); $previousbuild->Id = $previousbuildid; $errordiff = $this->GetNumberOfErrors() - $previousbuild->GetNumberOfErrors(); $warningdiff = $this->GetNumberOfWarnings() - $previousbuild->GetNumberOfWarnings(); $testdiff = $this->GetNumberOfFailedTests() + $this->GetNumberOfNotRunTests() - ($previousbuild->GetNumberOfFailedTests() + $previousbuild->GetNumberOfNotRunTests()); // Find the number of authors that contributed to this changeset. $pdo = get_link_identifier()->getPdo(); $nauthors_stmt = $pdo->prepare('SELECT count(author) FROM (SELECT uf.author FROM updatefile AS uf JOIN build2update AS b2u ON (b2u.updateid=uf.updateid) WHERE b2u.buildid=? GROUP BY author) AS test'); $nauthors_stmt->execute(array($this->Id)); $nauthors_array = $nauthors_stmt->fetch(); $nauthors = $nauthors_array[0]; $newbuild = 1; $previousauthor = ''; // Record user statistics for each updated file. $updatefiles_stmt = $pdo->prepare("SELECT author,email,checkindate,filename FROM updatefile AS uf\n JOIN build2update AS b2u ON b2u.updateid=uf.updateid\n WHERE b2u.buildid=? AND checkindate>'1980-01-01T00:00:00'\n ORDER BY author ASC, checkindate ASC"); $updatefiles_stmt->execute(array($this->Id)); add_last_sql_error('Build:ComputeUpdateStatistics', $this->ProjectId, $this->Id); while ($updatefiles_array = $updatefiles_stmt->fetch()) { $checkindate = $updatefiles_array['checkindate']; $author = $updatefiles_array['author']; $filename = $updatefiles_array['filename']; $email = $updatefiles_array['email']; $warnings = 0; $errors = 0; $tests = 0; if ($author != $previousauthor) { $newbuild = 1; } $previousauthor = $author; if ($warningdiff > 1) { $warnings = $this->FindRealErrors('WARNING', $author, $this->Id, $filename); } elseif ($warningdiff < 0) { $warnings = $this->FindRealErrors('WARNING', $author, $previousbuildid, $filename) * -1; } if ($errordiff > 1) { $errors = $this->FindRealErrors('ERROR', $author, $this->Id, $filename); } elseif ($errordiff < 0) { $errors = $this->FindRealErrors('ERROR', $author, $previousbuildid, $filename) * -1; } if ($nauthors > 1) { // When multiple authors contribute to a changeset it is // too difficult to determine which modified file caused a // change in test behavior. $tests = 0; } else { $tests = $testdiff; } $this->AddUpdateStatistics($author, $email, $checkindate, $newbuild, $warnings, $errors, $tests); $warningdiff -= $warnings; $errordiff -= $errors; $testdiff -= $tests; $newbuild = 0; } return true; }