public function testGithubPRComment() { echo "1. testGithubPRComment\n"; global $configure; $this->login(); // Create a project named CDash and set its repository information. $settings = ['Name' => 'CDash', 'Description' => 'CDash', 'CvsUrl' => 'github.com/Kitware/CDash', 'CvsViewerType' => 'github', 'BugTrackerFileUrl' => 'http://public.kitware.com/Bug/view.php?id=', 'repositories' => [['url' => 'https://github.com/Kitware/CDash', 'branch' => 'master', 'username' => $configure['github_username'], 'password' => $configure['github_password']]]]; $this->ProjectId = $this->createProject($settings); if ($this->ProjectId < 1) { return 1; } // Setup subprojects by submitting the Project.xml file. global $configure; // Submit the file. $url = $this->url . '/submit.php?project=CDash'; $result = $this->uploadfile($url, dirname(__FILE__) . '/data/GithubPR/Project.xml'); $this->deleteLog($this->logfilename); // Submit a failing test. echo "Submitting Test.xml\n"; if (!$this->submitPullRequestFile(dirname(__FILE__) . '/data/GithubPR/Test.xml')) { return 1; } // Submit a broken build. echo "Submitting Build.xml\n"; if (!$this->submitPullRequestFile(dirname(__FILE__) . '/data/GithubPR/Build.xml')) { return 1; } // Submit a failed configure. echo "Submitting Configure.xml\n"; if (!$this->submitPullRequestFile(dirname(__FILE__) . '/data/GithubPR/Configure.xml')) { return 1; } // Make sure these builds link back to the GitHub PR. $row = pdo_single_row_query("SELECT id, parentid FROM build\n WHERE name = 'test_PR_comment' AND parentid>0 LIMIT 1"); $build = new Build(); $build->Id = $row['id']; $build->FillFromId($build->Id); $date = $build->GetDate(); // Parent view $content = $this->connect($this->url . "/api/v1/index.php?project=CDash&date={$date}"); $jsonobj = json_decode($content, true); $buildgroup = array_pop($jsonobj['buildgroups']); $build_response = $buildgroup['builds'][0]; if ($build_response['changelink'] !== 'github.com/Kitware/CDash/pull/80') { $this->fail("Expected changelink not found for parent build. Found: " . $build_response['changelink']); } if ($build_response['changeicon'] !== 'img/Octocat.png') { $this->fail("Expected changeicon not found for parent build. Found: " . $build_response['changeicon']); } // Child view $parentid = $row['parentid']; $content = $this->connect($this->url . "/api/v1/index.php?project=CDash&parentid={$parentid}"); $jsonobj = json_decode($content, true); if ($jsonobj['changelink'] !== 'github.com/Kitware/CDash/pull/80') { $this->fail("Expected changelink not found for parent build"); } if ($jsonobj['changeicon'] !== 'img/Octocat.png') { $this->fail("Expected changeicon not found for parent build"); } // Delete the project now that we're done with it. $this->deleteProject($this->ProjectId); }
/** * Parse an individual .gcov file. **/ public function ParseGcovFile($fileinfo) { $coverageFileLog = new CoverageFileLog(); $coverageFileLog->AggregateBuildId = $this->AggregateBuildId; $coverageFileLog->PreviousAggregateParentId = $this->PreviousAggregateParentId; $coverageFile = new CoverageFile(); $coverage = new Coverage(); $coverage->CoverageFile = $coverageFile; // Begin parsing this file. // The first thing we look for is the full path to this source file. $file = new SplFileObject($fileinfo); $path = ''; while (!$file->eof()) { $gcovLine = $file->current(); $term = ':Source:'; $pos = strpos($gcovLine, $term); if ($pos !== false) { $path = substr($gcovLine, $pos + strlen($term)); break; } $file->next(); } if (empty($path)) { return; } // Check if this file belongs to a different SubProject. $buildid = $this->Build->Id; if (!empty($this->SubProjectPath) && strpos($path, $this->SubProjectPath) === false) { // Find the SubProject that corresponds to this path. $query = "SELECT id, name, path FROM subproject\n WHERE projectid = {$this->ProjectId} AND\n endtime = '1980-01-01 00:00:00' AND\n path != '' AND\n '{$path}' LIKE CONCAT('%',path,'%')"; $result = pdo_query($query); if (!$result || pdo_num_rows($result) == 0) { add_log("No SubProject found for '{$path}'", 'ParseGcovFile', LOG_INFO, $this->ProjectId, $this->Build->Id); return; } $row = pdo_fetch_array($result); $subprojectid = $row['id']; $subprojectname = $row['name']; $subprojectpath = $row['path']; // Find the sibling build that performed this SubProject. $siblingBuild = new Build(); $query = 'SELECT b.id FROM build AS b INNER JOIN subproject2build AS sp2b ON (sp2b.buildid=b.id) WHERE b.parentid= (SELECT parentid FROM build WHERE id=' . $this->Build->Id . ")\n AND sp2b.subprojectid={$subprojectid}"; $row = pdo_single_row_query($query); if ($row && array_key_exists('id', $row)) { $buildid = $row['id']; $siblingBuild->Id = $buildid; $siblingBuild->FillFromId($buildid); } else { // Build doesn't exist yet, add it here. $siblingBuild->Name = $this->Build->Name; $siblingBuild->ProjectId = $this->ProjectId; $siblingBuild->SiteId = $this->Build->SiteId; $siblingBuild->SetParentId($this->Build->GetParentId()); $siblingBuild->SetStamp($this->Build->GetStamp()); $siblingBuild->SetSubProject($subprojectname); $siblingBuild->StartTime = $this->Build->StartTime; $siblingBuild->EndTime = $this->Build->EndTime; $siblingBuild->SubmitTime = gmdate(FMT_DATETIME); add_build($siblingBuild, 0); $buildid = $siblingBuild->Id; } $coverageFileLog->Build = $siblingBuild; // Remove any part of the file path that comes before // the subproject path. $path = substr($path, strpos($path, $subprojectpath)); // Replace the subproject path with '.' $path = substr_replace($path, '.', 0, strlen($subprojectpath)); } else { // If this source file isn't from the source or binary directory // we shouldn't include it in our coverage report. if (!empty($this->SubProjectPath) && strpos($path, $this->SubProjectPath) !== false) { $path = substr($path, strpos($path, $this->SubProjectPath)); $path = substr_replace($path, '.', 0, strlen($this->SubProjectPath)); } elseif (strpos($path, $this->SourceDirectory) !== false) { $path = str_replace($this->SourceDirectory, '.', trim($path)); } elseif (strpos($path, $this->BinaryDirectory) !== false) { $path = str_replace($this->BinaryDirectory, '.', trim($path)); } else { return; } $coverageFileLog->Build = $this->Build; } // Get a reference to the coverage summary for this build. if ($buildid === $this->Build->Id) { $coverageSummary = $this->CoverageSummary; } else { if (!array_key_exists($buildid, $this->SubProjectSummaries)) { $coverageSummary = new CoverageSummary(); $coverageSummary->BuildId = $buildid; $this->SubProjectSummaries[$buildid] = $coverageSummary; } else { $coverageSummary = $this->SubProjectSummaries[$buildid]; } } // Use a regexp to resolve any /../ in this path. // We can't use realpath() because we're referencing a path that // doesn't exist on the server. // For a source file that contains: // #include "src/../include/foo.h" // CDash will report the covered file as include/foo.h $pattern = "#/[^/]*?/\\.\\./#"; while (strpos($path, "/../") !== false) { $path = preg_replace($pattern, "/", $path, 1); } $coverageFile->FullPath = trim($path); $lineNumber = 0; // The lack of rewind is intentional. while (!$file->eof()) { $gcovLine = $file->current(); // "Ordinary" entries in a .gcov file take the following format: // <lineNumber>: <timesHit>: <source code at that line> // So we check if this line matches the format & parse the // data out of it if so. $fields = explode(':', $gcovLine, 3); if (count($fields) > 2) { // Separate out delimited values from this line. $timesHit = trim($fields[0]); $lineNumber = trim($fields[1]); $sourceLine = rtrim($fields[2]); if ($lineNumber > 0) { $coverageFile->File .= $sourceLine; // cannot be <br/> for backward compatibility. $coverageFile->File .= '<br>'; } // This is how gcov indicates a line of unexecutable code. if ($timesHit === '-') { $file->next(); continue; } // This is how gcov indicates an uncovered line. if ($timesHit === '#####') { $timesHit = 0; } $coverageFileLog->AddLine($lineNumber - 1, $timesHit); $file->next(); } else { $coveredBranches = 0; $uncoveredBranches = 0; $throwBranches = 0; $fallthroughBranches = 0; while (count($fields) < 3 && !$file->eof()) { // Parse branch coverage here. if (substr($gcovLine, 0, 6) === 'branch') { // Figure out whether this branch was covered or not. if (strpos($gcovLine, 'taken 0%') !== false) { $uncoveredBranches += 1; } else { $coveredBranches += 1; } // Also keep track of the different types of branches encountered. if (strpos($gcovLine, '(throw)') !== false) { $throwBranches += 1; } elseif (strpos($gcovLine, '(fallthrough)') !== false) { $fallthroughBranches += 1; } } $file->next(); $gcovLine = $file->current(); $fields = explode(':', $gcovLine); } // Don't report branch coverage for this line if we only // encountered (throw) and (fallthrough) branches here. $totalBranches = $coveredBranches + $uncoveredBranches; if ($totalBranches > 0 && $totalBranches > $throwBranches + $fallthroughBranches) { $coverageFileLog->AddBranch($lineNumber - 1, $coveredBranches, $totalBranches); } } } // Save these models to the database. $coverageFile->TrimLastNewline(); $coverageFile->Update($buildid); $coverageFileLog->BuildId = $buildid; $coverageFileLog->FileId = $coverageFile->Id; $coverageFileLog->Insert(true); // Query the filelog to get how many lines & branches were covered. // We do this after inserting the filelog because we want to accurately // reflect the union of the current and previously existing results // (if any). $stats = $coverageFileLog->GetStats(); $coverage->LocUntested = $stats['locuntested']; $coverage->LocTested = $stats['loctested']; $coverage->Covered = 1; $coverage->BranchesUntested = $stats['branchesuntested']; $coverage->BranchesTested = $stats['branchestested']; // Add any labels. if (array_key_exists($path, $this->Labels)) { foreach ($this->Labels[$path] as $labelText) { $label = new Label(); $label->SetText($labelText); $coverage->AddLabel($label); } } // Add this Coverage to our summary. $coverageSummary->AddCoverage($coverage); }
function rest_post() { global $projectid; if (isset($_POST['newbuildgroup'])) { // Create a new buildgroup $BuildGroup = new BuildGroup(); $BuildGroup->SetProjectId($projectid); $name = htmlspecialchars(pdo_real_escape_string($_POST['newbuildgroup'])); // Avoid creating a group that uses one of the default names. if ($name == "Nightly" || $name == "Experimental" || $name == "Continuous") { echo_error("You cannot create a group named 'Nightly','Experimental' or 'Continuous'"); return; } $type = htmlspecialchars(pdo_real_escape_string($_POST['type'])); $BuildGroup->SetName($name); $BuildGroup->SetType($type); $BuildGroup->Save(); // Respond with a JSON representation of this new buildgroup $response = array(); $response['id'] = $BuildGroup->GetId(); $response['name'] = $BuildGroup->GetName(); $response['autoremovetimeframe'] = $BuildGroup->GetAutoRemoveTimeFrame(); echo json_encode($response); return; } if (isset($_POST['newLayout'])) { // Update the order of the buildgroups for this project. $inputRows = $_POST['newLayout']; if (count($inputRows) > 0) { // Remove old build group layout for this project. global $CDASH_DB_TYPE; if (isset($CDASH_DB_TYPE) && $CDASH_DB_TYPE == "pgsql") { // We use a subquery here because postgres doesn't support // JOINs in a DELETE statement. $sql = "\n DELETE FROM buildgroupposition WHERE buildgroupid IN\n (SELECT bgp.buildgroupid FROM buildgroupposition AS bgp\n LEFT JOIN buildgroup AS bg ON (bgp.buildgroupid = bg.id)\n WHERE bg.projectid = '{$projectid}')"; } else { $sql = "\n DELETE bgp FROM buildgroupposition AS bgp\n LEFT JOIN buildgroup AS bg ON (bgp.buildgroupid = bg.id)\n WHERE bg.projectid = '{$projectid}'"; } pdo_query($sql); add_last_sql_error("manageBuildGroup::newLayout::DELETE", $projectid); // construct query to insert the new layout $query = "INSERT INTO buildgroupposition (buildgroupid, position) VALUES "; foreach ($inputRows as $inputRow) { $query .= "(" . qnum(pdo_real_escape_numeric($inputRow["buildgroupid"])) . ", " . qnum(pdo_real_escape_numeric($inputRow["position"])) . "), "; } // remove the trailing comma and space, then insert our new values $query = rtrim($query, ", "); pdo_query($query); add_last_sql_error("API::buildgroup::newLayout::INSERT", $projectid); } return; } if (isset($_POST['builds'])) { // Move builds to a new group. $group = $_POST['group']; if ($group['id'] < 1) { echo_error("Please select a group for these builds"); return; } $builds = $_POST['builds']; if (array_key_exists('expected', $_POST)) { $expected = $_POST['expected']; } else { $expected = 0; } foreach ($builds as $buildinfo) { $groupid = pdo_real_escape_numeric($group['id']); $Build = new Build(); $buildid = pdo_real_escape_numeric($buildinfo['id']); $Build->Id = $buildid; $Build->FillFromId($Build->Id); $prevgroupid = $Build->GroupId; // Change the group for this build. pdo_query("UPDATE build2group SET groupid='{$groupid}'\n WHERE groupid='{$prevgroupid}' AND buildid='{$buildid}'"); // Delete any previous rules pdo_query("\n DELETE FROM build2grouprule\n WHERE groupid='{$prevgroupid}' AND buildtype='{$Build->Type}' AND\n buildname='{$Build->Name}' AND siteid='{$Build->SiteId}'"); // Add the new rule pdo_query("\n INSERT INTO build2grouprule\n (groupid,buildtype,buildname,siteid,expected,starttime,endtime)\n VALUES\n ('{$groupid}','{$Build->Type}','{$Build->Name}','{$Build->SiteId}',\n '{$expected}','1980-01-01 00:00:00','1980-01-01 00:00:00')"); } } if (isset($_POST['nameMatch'])) { // Define a BuildGroup by Build name. $group = $_POST['group']; $groupid = $group['id']; if ($groupid < 1) { echo_error("Please select a BuildGroup to define."); return; } $nameMatch = "%" . htmlspecialchars(pdo_real_escape_string($_POST["nameMatch"])) . "%"; $type = htmlspecialchars(pdo_real_escape_string($_POST["type"])); $sql = "INSERT INTO build2grouprule (groupid, buildtype, buildname, siteid)\n VALUES ('{$groupid}', '{$type}', '{$nameMatch}', '-1')"; if (!pdo_query($sql)) { echo_error(pdo_error()); } } if (isset($_POST['dynamic']) && !empty($_POST['dynamic'])) { // Add a build row to a dynamic group $groupid = pdo_real_escape_numeric($_POST['dynamic']['id']); if (empty($_POST['buildgroup'])) { $parentgroupid = 0; } else { $parentgroupid = pdo_real_escape_numeric($_POST['buildgroup']['id']); } if (empty($_POST['site'])) { $siteid = 0; } else { $siteid = pdo_real_escape_numeric($_POST['site']['id']); } if (empty($_POST['match'])) { $match = ""; } else { $match = "%" . htmlspecialchars(pdo_real_escape_string($_POST['match'])) . "%"; } $sql = "INSERT INTO build2grouprule (groupid, buildname, siteid, parentgroupid)\n VALUES ('{$groupid}', '{$match}', '{$siteid}', '{$parentgroupid}')"; if (!pdo_query($sql)) { echo_error(pdo_error()); } else { // Respond with a JSON representation of this new rule. $response = array(); $response['match'] = htmlspecialchars(pdo_real_escape_string($_POST['match'])); $response['siteid'] = $siteid; if ($siteid > 0) { $response['sitename'] = htmlspecialchars(pdo_real_escape_string($_POST['site']['name'])); } else { $response['sitename'] = 'Any'; } $response['parentgroupid'] = $parentgroupid; if ($parentgroupid > 0) { $response['parentgroupname'] = htmlspecialchars(pdo_real_escape_string($_POST['buildgroup']['name'])); } else { $response['parentgroupname'] = 'Any'; } echo json_encode($response); return; } } }
/** Main function to send email if necessary */ function sendemail($handler, $projectid) { include 'config/config.php'; include_once 'include/common.php'; require_once 'include/pdo.php'; require_once 'models/build.php'; require_once 'models/project.php'; require_once 'models/buildgroup.php'; $Project = new Project(); $Project->Id = $projectid; $Project->Fill(); $sendEmail = null; if ($CDASH_USE_LOCAL_DIRECTORY && file_exists('local/sendemail.php')) { include_once 'local/sendemail.php'; $sendEmail = new SendEmail(); $sendEmail->SetProjectId($projectid); } // If we shouldn't sent any emails we stop if ($Project->EmailBrokenSubmission == 0) { return; } // If the handler has a buildid (it should), we use it if (isset($handler->BuildId) && $handler->BuildId > 0) { $buildid = $handler->BuildId; } else { // Get the build id $name = $handler->getBuildName(); $stamp = $handler->getBuildStamp(); $sitename = $handler->getSiteName(); $buildid = get_build_id($name, $stamp, $projectid, $sitename); } if ($buildid < 0) { return; } //add_log("Buildid ".$buildid,"sendemail ".$Project->Name,LOG_INFO); // Check if the group as no email $Build = new Build(); $Build->Id = $buildid; $groupid = $Build->GetGroup(); $BuildGroup = new BuildGroup(); $BuildGroup->SetId($groupid); // If we specified no email we stop here if ($BuildGroup->GetSummaryEmail() == 2) { return; } $emailCommitters = $BuildGroup->GetEmailCommitters(); $errors = check_email_errors($buildid, $Project->EmailTestTimingChanged, $Project->TestTimeMaxStatus, !$Project->EmailRedundantFailures); // We have some fixes if ($errors['hasfixes']) { $Build->FillFromId($Build->Id); // Get the list of person who should get the email $lookup_result = lookup_emails_to_send($errors, $buildid, $projectid, $Build->Type, true, $emailCommitters); $userids = $lookup_result['userids']; foreach ($userids as $userid) { $emailtext = array(); $emailtext['nfixes'] = 0; // Check if an email has been sent already for this user foreach ($errors['fixes'] as $fixkey => $nfixes) { if ($nfixes == 0) { continue; } if (!check_email_sent($userid, $buildid, $fixkey)) { $emailtext['category'][$fixkey] = $nfixes; $emailtext['nfixes'] = 1; } } // Send the email if ($emailtext['nfixes'] == 1) { send_email_fix_to_user($userid, $emailtext, $Build, $Project); } } } // No error we return if (!$errors['errors']) { return; } if ($CDASH_USE_LOCAL_DIRECTORY && file_exists('local/sendemail.php')) { $sendEmail->BuildId = $Build->Id; $sendEmail->Errors = $errors; } // If we should send a summary email if ($BuildGroup->GetSummaryEmail() == 1) { // Send the summary email sendsummaryemail($projectid, $groupid, $errors, $buildid); if ($CDASH_USE_LOCAL_DIRECTORY && file_exists('local/sendemail.php')) { $sendEmail->SendSummary(); } return; } $Build->FillFromId($Build->Id); // Send build error if ($CDASH_USE_LOCAL_DIRECTORY && file_exists('local/sendemail.php')) { $sendEmail->SendBuildError(); } // Lookup the list of people who should get the email, both registered // users *and* committers: // $lookup_result = lookup_emails_to_send($errors, $buildid, $projectid, $Build->Type, false, $emailCommitters); // Loop through the *registered* users: // $userids = $lookup_result['userids']; foreach ($userids as $userid) { send_error_email($userid, '', $sendEmail, $errors, $Build, $Project); } // Loop through "other" users, if necessary: // // ...people who committed code, but are *not* registered CDash users, but // only if the 'emailcommitters' field is on for this build group. // if ($emailCommitters) { $committeremails = $lookup_result['committeremails']; foreach ($committeremails as $committeremail) { send_error_email(0, $committeremail, $sendEmail, $errors, $Build, $Project, getHandlerErrorKeyPrefix($handler)); } } }
public function testBuildRemovalWorksAsExpected() { require_once 'include/common.php'; require_once 'include/pdo.php'; require_once 'models/build.php'; require_once 'models/buildconfigure.php'; require_once 'models/builderror.php'; require_once 'models/buildfailure.php'; require_once 'models/buildgroup.php'; require_once 'models/buildnote.php'; require_once 'models/buildupdate.php'; require_once 'models/coverage.php'; require_once 'models/dynamicanalysis.php'; require_once 'models/dynamicanalysissummary.php'; require_once 'models/image.php'; require_once 'models/label.php'; require_once 'models/test.php'; require_once 'models/uploadfile.php'; $time = gmdate(FMT_DATETIME); // Find an existing site. $row = pdo_single_row_query('SELECT id FROM site LIMIT 1'); $siteid = $row['id']; // Label $label = new Label(); $label->SetText('remove me'); // Build $build = new Build(); $build->Name = 'RemovalWorksAsExpected'; $build->SetStamp('20160822-1810-Experimental'); $build->ProjectId = 1; $build->InsertErrors = true; $build->SiteId = $siteid; $build->StartTime = $time; $build->EndTime = $time; $build->SubmitTime = $time; $build->AddLabel($label); $buildgroup = new BuildGroup(); $build->GroupId = $buildgroup->GetGroupIdFromRule($build); $info = new BuildInformation(); $info->SetValue('OSNAME', 'Windows'); $build->Information = $info; // BuildError $error = new BuildError(); $error->Text = 'error: asdf'; $build->AddError($error); // BuildFailure $failure = new BuildFailure(); $failure->StdError = 'failure: asdf'; $failure->AddArgument('arg1'); $failure->AddLabel($label); $build->AddError($failure); $build->Save(); // Create another build to test shared resources. $existing_build = new Build(); $existing_build->Id = $build->Id; $existing_build->FillFromId($build->Id); $existing_build->SetStamp('20160822-1811-Experimental'); $existing_build->SubmitTime = $time; $existing_build->InsertErrors = true; $existing_build->AddError($failure); $existing_build->Id = null; $existing_build->Save(); // BuildConfigure $configure = new BuildConfigure(); $configure->BuildId = $build->Id; $configure->StartTime = $time; $configure->EndTime = $time; $configure->Command = 'cmake'; $configure->Log = "precontext\nWARNING: bar\npostcontext"; $configure->Status = 5; $configure->AddLabel($label); $configure->Insert(); $configure->ComputeWarnings(); $configure->ComputeErrors(); // BuildNote $note = new BuildNote(); $note->Name = 'my note'; $note->Text = 'note text'; $note->Time = $time; $note->BuildId = $build->Id; $note->Insert(); $shared_note = new BuildNote(); $shared_note->Name = 'my shared note'; $shared_note->Text = 'shared note text'; $shared_note->Time = $time; $shared_note->BuildId = $build->Id; $shared_note->Insert(); $shared_note->BuildId = $existing_build->Id; $shared_note->Insert(); // buildtesttime $build->SaveTotalTestsTime(8); // BuildUpdate $updatefile = new BuildUpdateFile(); $updatefile->Author = 'My Self'; $updatefile->Committer = 'My Self'; $updatefile->Email = '*****@*****.**'; $updatefile->CommitterEmail = '*****@*****.**'; $updatefile->Revision = 2; $updatefile->PriorRevision = 1; $updatefile->Filename = 'foo.cpp'; $updatefile->Status = 'MODIFIED'; $update = new BuildUpdate(); $update->AddFile($updatefile); $update->BuildId = $build->Id; $update->StartTime = $time; $update->EndTime = $time; $update->Command = 'git fetch'; $update->Insert(); pdo_query("INSERT INTO build2update (buildid, updateid)\n VALUES ({$existing_build->Id}, {$update->UpdateId})"); // Coverage $file1 = new CoverageFile(); $file1->FullPath = '/path/to/unshared.php'; $file1->File .= "this unshared line gets covered<br>"; $file1->File .= "this unshared line does not<br>"; $coverage1 = new Coverage(); $coverage1->Covered = 1; $coverage1->CoverageFile = $file1; $coverage1->LocTested = 1; $coverage1->LocUntested = 1; $coverage1->AddLabel($label); $file2 = new CoverageFile(); $file2->FullPath = '/path/to/shared.php'; $file2->File .= "this shared line gets covered<br>"; $file2->File .= "this shared line does not<br>"; $coverage2 = new Coverage(); $coverage2->Covered = 1; $coverage2->CoverageFile = $file2; $coverage2->LocTested = 1; $coverage2->LocUntested = 1; $coverage2->AddLabel($label); $summary = new CoverageSummary(); $summary->BuildId = $build->Id; $summary->AddCoverage($coverage1); $summary->AddCoverage($coverage2); $summary->Insert(true); $file1->TrimLastNewline(); $file1->Update($build->Id); $log1 = new CoverageFileLog(); $log1->AddLine(1, 1); $log1->BuildId = $build->Id; $log1->FileId = $file1->Id; $log1->Insert(true); $file2->TrimLastNewline(); $file2->Update($build->Id); $log2 = new CoverageFileLog(); $log2->AddLine(1, 1); $log2->BuildId = $build->Id; $log2->FileId = $file2->Id; $log2->Insert(true); // Also add coverage to existing build to test that shared files // do not get deleted. $existing_cov = new Coverage(); $existing_cov->Covered = 1; $existing_cov->CoverageFile = $file2; $existing_cov->LocTested = 1; $existing_cov->LocUntested = 1; $existing_cov->AddLabel($label); $existing_summary = new CoverageSummary(); $existing_summary->BuildId = $existing_build->Id; $existing_summary->AddCoverage($existing_cov); $existing_summary->Insert(true); $file2->Update($existing_build->Id); $existing_log = new CoverageFileLog(); $existing_log->AddLine(1, 1); $existing_log->BuildId = $existing_build->Id; $existing_log->FileId = $file2->Id; $existing_log->Insert(true); // DynamicAnalysis $DA_defect = new DynamicAnalysisDefect(); $DA_defect->Type = 'Potential Memory Leak'; $DA_defect->Value = 5; $DA = new DynamicAnalysis(); $DA->BuildId = $build->Id; $DA->Checker = 'Valgrind'; $DA->FullCommandLine = 'php DA_removebuilds.php'; $DA->Log = 'build removed successfully'; $DA->Name = 'removal test'; $DA->Path = '/path/to/removal/DA'; $DA->Status = 'failed'; $DA->AddDefect($DA_defect); $DA->AddLabel($label); $DA->Insert(); $DA_summary = new DynamicAnalysisSummary(); $DA_summary->BuildId = $build->Id; $DA_summary->Checker = 'Valgrind'; $DA_summary->AddDefects($DA_defect->Value); $DA_summary->Insert(); // Test $test = new Test(); $test->ProjectId = 1; $test->CompressedOutput = false; $test->Details = 'Completed'; $test->Name = 'removal test'; $test->Path = '/path/to/removal/test'; $test->Command = 'php test_removebuilds.php'; $test->Output = 'build removed successfully'; $measurement = new TestMeasurement(); $measurement->Name = 'Exit Value'; $measurement->Type = 'text/string'; $measurement->Value = 5; $test->AddMeasurement($measurement); $image = new Image(); $image->Extension = 'image/png'; $image->Data = 'iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABl' . 'BMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDr' . 'EX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r' . '8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg=='; $image->Name = 'remove_me.png'; $test->AddImage($image); $test->Insert(); $buildtest = new BuildTest(); $buildtest->BuildId = $build->Id; $buildtest->TestId = $test->Id; $buildtest->Status = 'passed'; $buildtest->Insert(); $test->AddLabel($label); $test->InsertLabelAssociations($build->Id); $test2 = new Test(); $test2->ProjectId = 1; $test2->CompressedOutput = false; $test2->Details = 'Completed'; $test2->Name = 'shared test'; $test2->Path = '/path/to/shared/test'; $test2->Command = 'php test_sharedtest.php'; $test2->Output = 'test shared successfully'; $measurement2 = new TestMeasurement(); $measurement2->Name = 'Exit Value'; $measurement2->Type = 'text/string'; $measurement2->Value = 0; $test2->AddMeasurement($measurement2); $image2 = new Image(); $image2->Extension = 'image/gif'; $image2->Name = 'smile.gif'; $image2->Data = base64_encode(file_get_contents(dirname(__FILE__) . '/data/smile.gif')); $test2->AddImage($image2); $test2->Insert(); $buildtest2 = new BuildTest(); $buildtest2->BuildId = $build->Id; $buildtest2->TestId = $test2->Id; $buildtest2->Status = 'passed'; $buildtest2->Insert(); $buildtest2->BuildId = $existing_build->Id; $buildtest2->Insert(); $test2->AddLabel($label); $test2->InsertLabelAssociations($build->Id); // UploadFile $filename = dirname(__FILE__) . '/data/smile.gif'; $upload1 = new UploadFile(); $upload1->Filename = $filename; $upload1->IsUrl = false; $upload1->BuildId = $build->Id; $upload1->Sha1Sum = sha1_file($filename); $upload1->Filesize = filesize($filename); $upload1->Insert(); $filename = dirname(__FILE__) . '/data/smile2.gif'; $upload2 = new UploadFile(); $upload2->Filename = $filename; $upload2->IsUrl = false; $upload2->BuildId = $build->Id; $upload2->Sha1Sum = sha1_file($filename); $upload2->Filesize = filesize($filename); $upload2->Insert(); $upload2->BuildId = $existing_build->Id; $upload2->Insert(); // Various tables that are too hard to spoof with models so we resort // to direct insertion. pdo_query("INSERT INTO buildemail (userid, buildid, category)\n VALUES (1, {$build->Id}, 0)"); pdo_query("INSERT INTO builderrordiff\n (buildid, type, difference_positive, difference_negative)\n VALUES ({$build->Id}, 0, 1, 1)"); pdo_query("INSERT INTO configureerrordiff (buildid, type, difference)\n VALUES ({$build->Id}, 0, 1)"); pdo_query("INSERT INTO coveragesummarydiff (buildid, loctested, locuntested)\n VALUES ({$build->Id}, 1, 1)"); pdo_query("INSERT INTO summaryemail (buildid, date, groupid)\n VALUES ({$build->Id}, '{$time}', 1)"); pdo_query("INSERT INTO subproject2build (subprojectid, buildid)\n VALUES (1, {$build->Id})"); pdo_query("INSERT INTO testdiff\n (buildid, type, difference_positive, difference_negative)\n VALUES ({$build->Id}, 0, 1, 1)"); // Check that everything was created successfully. $this->verify('build', 'id', '=', $build->Id, 1); $this->verify('build2group', 'buildid', '=', $build->Id, 1); $this->verify('buildemail', 'buildid', '=', $build->Id, 1); $this->verify('builderror', 'buildid', '=', $build->Id, 1); $this->verify('builderrordiff', 'buildid', '=', $build->Id, 1); $this->verify('buildinformation', 'buildid', '=', $build->Id, 1); $this->verify('buildtesttime', 'buildid', '=', $build->Id, 1); $this->verify('configure', 'buildid', '=', $build->Id, 1); $this->verify('configureerror', 'buildid', '=', $build->Id, 1); $this->verify('configureerrordiff', 'buildid', '=', $build->Id, 1); $this->verify('coveragesummary', 'buildid', '=', $build->Id, 1); $this->verify('coveragesummarydiff', 'buildid', '=', $build->Id, 1); $this->verify('coveragefilelog', 'buildid', '=', $build->Id, 2); $this->verify('dynamicanalysissummary', 'buildid', '=', $build->Id, 1); $this->verify('summaryemail', 'buildid', '=', $build->Id, 1); $this->verify('subproject2build', 'buildid', '=', $build->Id, 1); $this->verify('testdiff', 'buildid', '=', $build->Id, 1); list($buildfailureid, $detailsid) = $this->verify_get_columns('buildfailure', ['id', 'detailsid'], 'buildid', '=', $build->Id, 1); $this->verify('buildfailure2argument', 'buildfailureid', '=', $buildfailureid, 1); $this->verify('buildfailuredetails', 'id', '=', $detailsid, 1); $noteids = $this->verify_get_rows('build2note', 'noteid', 'buildid', '=', $build->Id, 2); $this->verify('note', 'id', 'IN', $noteids, 2); $coveragefileids = $this->verify_get_rows('coverage', 'fileid', 'buildid', '=', $build->Id, 2); $this->verify('coveragefile', 'id', 'IN', $coveragefileids, 2); $dynamicanalysisid = $this->verify_get_rows('dynamicanalysis', 'id', 'buildid', '=', $build->Id, 1); $this->verify('dynamicanalysisdefect', 'dynamicanalysisid', '=', $dynamicanalysisid, 1); $testids = $this->verify_get_rows('build2test', 'testid', 'buildid', '=', $build->Id, 2); $this->verify('test', 'id', 'IN', $testids, 2); $this->verify('testmeasurement', 'testid', 'IN', $testids, 2); $imgids = $this->verify_get_rows('test2image', 'imgid', 'testid', 'IN', $testids, 2); $this->verify('image', 'id', 'IN', $imgids, 2); $updateid = $this->verify_get_rows('build2update', 'updateid', 'buildid', '=', $build->Id, 1); $this->verify('buildupdate', 'id', '=', $updateid, 1); $this->verify('updatefile', 'updateid', '=', $updateid, 1); $uploadfileids = $this->verify_get_rows('build2uploadfile', 'fileid', 'buildid', '=', $build->Id, 2); $this->verify('uploadfile', 'id', 'IN', $uploadfileids, 2); $labelid = $this->verify_get_rows('label2build', 'labelid', 'buildid', '=', $build->Id, 1); $this->verify('label', 'id', '=', $labelid, 1); $this->verify('label2buildfailure', 'labelid', '=', $labelid, 2); $this->verify('label2coveragefile', 'labelid', '=', $labelid, 3); $this->verify('label2dynamicanalysis', 'labelid', '=', $labelid, 1); $this->verify('label2test', 'labelid', '=', $labelid, 2); // Remove the build. remove_build($build->Id); // Check that everything was deleted properly. $this->verify('build', 'id', '=', $build->Id, 0, true); $this->verify('build2group', 'buildid', '=', $build->Id, 0, true); $this->verify('build2note', 'buildid', '=', $build->Id, 0, true); $this->verify('build2test', 'buildid', '=', $build->Id, 0, true); $this->verify('build2update', 'buildid', '=', $build->Id, 0, true); $this->verify('build2uploadfile', 'buildid', '=', $build->Id, 0, true); $this->verify('buildemail', 'buildid', '=', $build->Id, 0, true); $this->verify('builderror', 'buildid', '=', $build->Id, 0, true); $this->verify('builderrordiff', 'buildid', '=', $build->Id, 0, true); $this->verify('buildfailure', 'buildid', '=', $build->Id, 0, true); $this->verify('buildfailure2argument', 'buildfailureid', '=', $buildfailureid, 0, true); $this->verify('buildfailuredetails', 'id', '=', $detailsid, 1, true); $this->verify('buildinformation', 'buildid', '=', $build->Id, 0, true); $this->verify('buildtesttime', 'buildid', '=', $build->Id, 0, true); $this->verify('buildupdate', 'id', '=', $updateid, 1, true); $this->verify('configure', 'buildid', '=', $build->Id, 0, true); $this->verify('configureerror', 'buildid', '=', $build->Id, 0, true); $this->verify('configureerrordiff', 'buildid', '=', $build->Id, 0, true); $this->verify('coverage', 'buildid', '=', $build->Id, 0, true); $this->verify('coveragefile', 'id', 'IN', $coveragefileids, 1, true); $this->verify('coveragefilelog', 'buildid', '=', $build->Id, 0, true); $this->verify('coveragesummary', 'buildid', '=', $build->Id, 0, true); $this->verify('coveragesummarydiff', 'buildid', '=', $build->Id, 0, true); $this->verify('dynamicanalysis', 'buildid', '=', $build->Id, 0, true); $this->verify('dynamicanalysissummary', 'buildid', '=', $build->Id, 0, true); $this->verify('dynamicanalysisdefect', 'dynamicanalysisid', '=', $dynamicanalysisid, 0, true); $this->verify('image', 'id', 'IN', $imgids, 1, true); $this->verify('label2build', 'buildid', '=', $build->Id, 0, true); $this->verify('label2buildfailure', 'labelid', '=', $labelid, 1, true); $this->verify('label2coveragefile', 'labelid', '=', $labelid, 1, true); $this->verify('label2dynamicanalysis', 'labelid', '=', $labelid, 0, true); $this->verify('label2test', 'labelid', '=', $labelid, 0, true); $this->verify('note', 'id', 'IN', $noteids, 1, true); $this->verify('summaryemail', 'buildid', '=', $build->Id, 0, true); $this->verify('subproject2build', 'buildid', '=', $build->Id, 0, true); $this->verify('test', 'id', 'IN', $testids, 1, true); $this->verify('test2image', 'testid', 'IN', $testids, 1, true); $this->verify('testdiff', 'buildid', '=', $build->Id, 0, true); $this->verify('testmeasurement', 'testid', 'IN', $testids, 1, true); $this->verify('updatefile', 'updateid', '=', $updateid, 1, true); $this->verify('uploadfile', 'id', 'IN', $uploadfileids, 1, true); }
/** Helper function to insert the build */ public function InsertBuild($projectid, $buildid) { $build = new Build(); $build->FillFromId($buildid); if ($build->GetPreviousBuildId() == 0) { // if we don't have a previous build then we need to count ourselves $query = pdo_query('SELECT name FROM build WHERE id=' . $buildid); if (!$query) { add_last_sql_error('Feed::InsertBuild'); return false; } $query_array = pdo_fetch_array($query); $buildname = $query_array['name']; $positives = pdo_query('SELECT count(*) FROM builderror WHERE buildid=' . $buildid . ' AND type=0'); $positives_array = pdo_fetch_array($positives); $npositives = $positives_array[0]; $positives = pdo_query('SELECT count(*) FROM buildfailure AS bf LEFT JOIN buildfailuredetails AS bfd ON (bfd.id=bf.detailsid) WHERE bf.buildid=' . $buildid . ' AND bfd.type=0'); $positives_array = pdo_fetch_array($positives); $npositives += $positives_array[0]; if ($npositives > 0) { $description = $npositives . ' error'; if ($npositives > 1) { $description .= 's'; } $description .= ' introduced on ' . $buildname; $this->Insert($projectid, $buildid, Feed::TypeBuildError, $description); } $positives = pdo_query('SELECT count(*) FROM builderror WHERE buildid=' . $buildid . ' AND type=1'); $positives_array = pdo_fetch_array($positives); $npositives = $positives_array[0]; $positives = pdo_query('SELECT count(*) FROM buildfailure AS bf LEFT JOIN buildfailuredetails AS bfd ON (bfd.id=bf.detailsid) WHERE bf.buildid=' . $buildid . ' AND bfd.type=1'); $positives_array = pdo_fetch_array($positives); $npositives += $positives_array[0]; if ($npositives > 0) { $description = $npositives . ' warning'; if ($npositives > 1) { $description .= 's'; } $description .= ' introduced on ' . $buildname; $this->Insert($projectid, $buildid, Feed::TypeBuildWarning, $description); } return; } // If we do have a previous build then we use the builderrordiff table // Check if we have any fixes or errors $query = pdo_query("SELECT * FROM builderrordiff AS bd JOIN build AS b ON (bd.buildid=b.id) WHERE bd.buildid='{$buildid}'"); if (!$query) { add_last_sql_error('Feed::InsertBuild'); return false; } while ($query_array = pdo_fetch_array($query)) { $type = 'error'; $feedtype = Feed::TypeBuildError; if ($query_array['type'] == 1) { // warning $type = 'warning'; $feedtype = Feed::TypeBuildWarning; } if ($query_array['difference_positive'] > 0) { $description .= $query_array['difference_positive'] . ' ' . $type; if ($query_array['difference_positive'] > 1) { $description .= 's'; } $description .= ' introduced on ' . $query_array['name']; $this->Insert($projectid, $buildid, $feedtype, $description); } elseif ($query_array['difference_negative'] > 0) { $description .= $query_array['difference_negative'] . ' ' . $type; if ($query_array['difference_negative'] > 1) { $description .= 's'; } $description .= ' fixed on ' . $query_array['name']; $this->Insert($projectid, $buildid, $feedtype, $description); } } }
This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ include dirname(dirname(dirname(__DIR__))) . '/config/config.php'; require_once 'include/pdo.php'; require_once 'include/common.php'; require_once 'models/build.php'; if (!isset($_GET['buildid']) || !is_numeric($_GET['buildid'])) { return; } // Get details about this build. $buildid = $_GET['buildid']; $build = new Build(); $build->Id = $buildid; $build->FillFromId($build->Id); if ($build->ProjectId < 1) { return; } // Take subproject into account, such that if there is one, then the // previous builds must be associated with the same subproject. // $subproj_table = ''; $subproj_criteria = ''; if ($build->SubProjectId > 0) { $subproj_table = 'INNER JOIN subproject2build AS sp2b ON (b.id=sp2b.buildid)'; $subproj_criteria = 'AND sp2b.subprojectid=:subprojectid'; } // Get details about previous builds. // Currently just grabbing the info used for the graphs and charts // on buildSummary.php.
/** Update the aggregate coverage build to include these results. */ public function UpdateAggregate() { if (!$this->Build) { $this->Build = new Build(); $this->Build->Id = $this->BuildId; } $this->Build->FillFromId($this->BuildId); // Only nightly builds count towards aggregate coverage. if ($this->Build->Type !== 'Nightly' || $this->Build->Name === 'Aggregate Coverage') { return; } // Find the build ID for this day's edition of 'Aggregate Coverage'. $aggregateBuildId = null; if ($this->AggregateBuildId) { if ($this->Build->SubProjectId) { // For SubProject builds, AggregateBuildId refers to the parent. // Look up the ID of the appropriate child. $query = "SELECT id FROM build\n INNER JOIN subproject2build AS sp2b ON (build.id=sp2b.buildid)\n WHERE parentid='{$this->AggregateBuildId}' AND\n projectid='" . $this->Build->ProjectId . "' AND\n sp2b.subprojectid='" . $this->Build->SubProjectId . "'"; $row = pdo_single_row_query($query); if (!$row || !array_key_exists('id', $row)) { // An aggregate build for this SubProject doesn't exist yet. // Create it here. $aggregateBuild = create_aggregate_build($this->Build); $aggregateBuildId = $aggregateBuild->Id; } else { $aggregateBuildId = $row['id']; } } else { // For standalone builds AggregateBuildId is exactly what we're // looking for. $aggregateBuildId = $this->AggregateBuildId; } $aggregateBuild = new Build(); $aggregateBuild->Id = $aggregateBuildId; $aggregateBuild->FillFromId($aggregateBuildId); } else { // AggregateBuildId not specified, look it up here. $aggregateBuild = get_aggregate_build($this->Build); $aggregateBuildId = $aggregateBuild->Id; $aggregateBuild->FillFromId($aggregateBuildId); } // Abort if this log refers to a different version of the file // than the one already contained in the aggregate. $row = pdo_single_row_query("SELECT id, fullpath FROM coveragefile WHERE id='{$this->FileId}'"); $path = $row['fullpath']; $row = pdo_single_row_query("SELECT id FROM coveragefile AS cf\n INNER JOIN coveragefilelog AS cfl ON (cfl.fileid=cf.id)\n WHERE cfl.buildid='{$aggregateBuildId}' AND cf.fullpath='{$path}'"); if ($row && array_key_exists('id', $row) && $row['id'] != $this->FileId) { add_log("Not appending coverage of '{$path}' to aggregate as it " . 'already contains a different version of this file.', 'CoverageFileLog::UpdateAggregate', LOG_INFO, $this->BuildId); return; } // Append these results to the aggregate coverage log. $aggregateLog = clone $this; $aggregateLog->BuildId = $aggregateBuildId; $aggregateLog->Build = $aggregateBuild; $aggregateLog->Insert(true); // Update the aggregate coverage summary. $aggregateSummary = new CoverageSummary(); $aggregateSummary->BuildId = $aggregateBuildId; $coverageFile = new CoverageFile(); $coverageFile->Id = $this->FileId; $coverageFile->Load(); $coverageFile->Update($aggregateBuildId); // Query the log to get how many lines & branches were covered. // We do this after inserting the filelog because we want to // accurately reflect the union of the current and previously // existing results (if any). $stats = $aggregateLog->GetStats(); $aggregateCoverage = new Coverage(); $aggregateCoverage->CoverageFile = $coverageFile; $aggregateCoverage->LocUntested = $stats['locuntested']; $aggregateCoverage->LocTested = $stats['loctested']; if ($aggregateCoverage->LocTested > 0 || $aggregateCoverage->LocUntested > 0) { $aggregateCoverage->Covered = 1; } else { $aggregateCoverage->Covered = 0; } $aggregateCoverage->BranchesUntested = $stats['branchesuntested']; $aggregateCoverage->BranchesTested = $stats['branchestested']; // Add this Coverage to the summary. $aggregateSummary->AddCoverage($aggregateCoverage); // Insert/Update the aggregate summary. $aggregateSummary->Insert(true); $aggregateSummary->ComputeDifference($this->PreviousAggregateParentId); if ($this->Build->SubProjectId && $this->AggregateBuildId) { // Compute diff for the aggregate parent too. $aggregateParentSummary = new CoverageSummary(); $aggregateParentSummary->BuildId = $this->AggregateBuildId; $aggregateParentSummary->ComputeDifference(); } }
// Find the recent builds for this project if ($projectid > 0) { $xml .= "<project>"; $xml .= add_XML_value("id", $Project->Id); $xml .= add_XML_value("name", $Project->GetName()); $xml .= add_XML_value("name_encoded", urlencode($Project->GetName())); if ($buildid > 0) { $xml .= add_XML_value("buildid", $buildid); } $CoverageSummary = new CoverageSummary(); $buildids = $CoverageSummary->GetBuilds($Project->Id, $beginUTCTime, $currentUTCTime); rsort($buildids); foreach ($buildids as $buildId) { $Build = new Build(); $Build->Id = $buildId; $Build->FillFromId($Build->Id); $xml .= "<build>"; $xml .= add_XML_value("id", $buildId); $Site = new Site(); $Site->Id = $Build->SiteId; $xml .= add_XML_value("name", $Site->GetName() . "-" . $Build->GetName() . " [" . gmdate(FMT_DATETIME, strtotime($Build->StartTime)) . "]"); if ($buildid > 0 && $buildId == $buildid) { $xml .= add_XML_value("selected", 1); } $xml .= "</build>"; } // For now take the first one if ($buildid > 0) { // Find the files associated with the build $Coverage = new Coverage(); $Coverage->BuildId = $buildid;
require_once "cdash/pdo.php"; include_once 'cdash/common.php'; include "cdash/version.php"; include 'login.php'; include_once 'models/project.php'; include_once 'models/build.php'; include_once 'models/site.php'; include_once 'models/uploadfile.php'; if (!isset($_GET['buildid'])) { echo "Build id not set"; return; } $buildid = pdo_real_escape_numeric($_GET['buildid']); $Build = new Build(); $Build->Id = $buildid; $Build->FillFromId($buildid); $Site = new Site(); $Site->Id = $Build->SiteId; $build_array = pdo_fetch_array(pdo_query("SELECT projectid FROM build WHERE id='{$buildid}'")); if (!isset($build_array["projectid"])) { echo "Build does not exist. Maybe it has been deleted."; return; } $projectid = $build_array["projectid"]; checkUserPolicy(@$_SESSION['cdash']['loginid'], $projectid); @($date = $_GET["date"]); if ($date != NULL) { $date = htmlspecialchars(pdo_real_escape_string($date)); } $xml = begin_XML_for_XSLT(); $xml .= get_cdash_dashboard_xml(get_project_name($projectid), $date);
} $response = begin_JSON_response(); $projectname = get_project_name($projectid); $response['title'] = "CDash : {$projectname}"; $previous_buildid = $build->GetPreviousBuildId(); $current_buildid = $build->GetCurrentBuildId(); $next_buildid = $build->GetNextBuildId(); $menu = array(); $nightlytime = get_project_property($projectname, 'nightlytime'); $menu['back'] = 'index.php?project=' . urlencode($projectname) . '&date=' . get_dashboard_date_from_build_starttime($build->StartTime, $nightlytime); if ($previous_buildid > 0) { $menu['previous'] = "buildSummary.php?buildid={$previous_buildid}"; // Find the last submit date. $previous_build = new Build(); $previous_build->Id = $previous_buildid; $previous_build->FillFromId($previous_build->Id); $lastsubmitdate = date(FMT_DATETIMETZ, strtotime($previous_build->StartTime . ' UTC')); } else { $menu['noprevious'] = '1'; $lastsubmitdate = 0; } $menu['current'] = "buildSummary.php?buildid={$current_buildid}"; if ($next_buildid > 0) { $menu['next'] = "buildSummary.php?buildid={$next_buildid}"; } else { $menu['nonext'] = '1'; } $response['menu'] = $menu; get_dashboard_JSON($projectname, $date, $response); // User if ($logged_in) {
function get_aggregate_build($build) { require_once 'models/build.php'; $siteid = get_server_siteid(); $build->ComputeTestingDayBounds(); $subproj_table = ''; $subproj_where = ''; if ($build->SubProjectId) { $subproj_table = "INNER JOIN subproject2build AS sp2b ON (build.id=sp2b.buildid)"; $subproj_where = "AND sp2b.subprojectid='{$build->SubProjectId}'"; } $query = "SELECT id FROM build\n {$subproj_table}\n WHERE name='Aggregate Coverage' AND\n siteid = '{$siteid}' AND\n parentid < '1' AND\n projectid = '{$build->ProjectId}' AND\n starttime < '{$build->EndOfDay}' AND\n starttime >= '{$build->BeginningOfDay}'\n {$subproj_where}"; $row = pdo_single_row_query($query); if (!$row || !array_key_exists('id', $row)) { // The aggregate build does not exist yet. // Create it here. $aggregate_build = create_aggregate_build($build, $siteid); } else { $aggregate_build = new Build(); $aggregate_build->Id = $row['id']; $aggregate_build->FillFromId($row['id']); } return $aggregate_build; }
/** Compute the coverage summary diff */ function ComputeDifference() { $build = new Build(); $build->FillFromId($this->BuildId); $previousBuildId = $build->GetPreviousBuildId(); if ($previousBuildId === FALSE) { return; } // Look at the number of errors and warnings differences $coverage = pdo_query("SELECT loctested,locuntested FROM coveragesummary WHERE buildid=" . qnum($this->BuildId)); if (!$coverage) { add_last_sql_error("CoverageSummary:ComputeDifference"); return false; } $coverage_array = pdo_fetch_array($coverage); $loctested = $coverage_array['loctested']; $locuntested = $coverage_array['locuntested']; $previouscoverage = pdo_query("SELECT loctested,locuntested FROM coveragesummary WHERE buildid=" . qnum($previousBuildId)); if (pdo_num_rows($previouscoverage) > 0) { $previouscoverage_array = pdo_fetch_array($previouscoverage); $previousloctested = $previouscoverage_array['loctested']; $previouslocuntested = $previouscoverage_array['locuntested']; // Don't log if no diff $loctesteddiff = $loctested - $previousloctested; $locuntesteddiff = $locuntested - $previouslocuntested; if ($loctesteddiff != 0 && $locuntesteddiff != 0) { $summaryDiff = new CoverageSummaryDiff(); $summaryDiff->BuildId = $this->BuildId; $summaryDiff->LocTested = $loctesteddiff; $summaryDiff->LocTested = $locuntesteddiff; $summaryDiff->Insert(); } } }