/** 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)); } } }
/** Add daily changes if necessary */ function addDailyChanges($projectid) { include "cdash/config.php"; include_once "cdash/common.php"; include_once "cdash/sendemail.php"; $db = pdo_connect("{$CDASH_DB_HOST}", "{$CDASH_DB_LOGIN}", "{$CDASH_DB_PASS}"); pdo_select_db("{$CDASH_DB_NAME}", $db); $project_array = pdo_fetch_array(pdo_query("SELECT nightlytime,name,autoremovetimeframe,autoremovemaxbuilds,emailadministrator\n FROM project WHERE id='{$projectid}'")); $date = ""; // now list($previousdate, $currentstarttime, $nextdate) = get_dates($date, $project_array["nightlytime"]); $date = gmdate(FMT_DATE, $currentstarttime); // Check if we already have it somwhere $query = pdo_query("SELECT id FROM dailyupdate WHERE projectid='{$projectid}' AND date='{$date}'"); if (pdo_num_rows($query) == 0) { $cvsauthors = array(); pdo_query("INSERT INTO dailyupdate (projectid,date,command,type,status)\n VALUES ({$projectid},'{$date}','NA','NA','0')"); $updateid = pdo_insert_id("dailyupdate"); $dates = get_related_dates($project_array["nightlytime"], $date); $commits = get_repository_commits($projectid, $dates); // Insert the commits foreach ($commits as $commit) { $filename = $commit['directory'] . "/" . $commit['filename']; $checkindate = $commit['time']; $author = addslashes($commit['author']); $email = ''; if (isset($commit['email'])) { $email = addslashes($commit['email']); } $log = addslashes($commit['comment']); $revision = $commit['revision']; $priorrevision = $commit['priorrevision']; // Check if we have a robot file for this build $robot = pdo_query("SELECT authorregex FROM projectrobot\n WHERE projectid=" . qnum($projectid) . " AND robotname='" . $author . "'"); if (pdo_num_rows($robot) > 0) { $robot_array = pdo_fetch_array($robot); $regex = $robot_array['authorregex']; preg_match($regex, $commit['comment'], $matches); if (isset($matches[1])) { $author = addslashes($matches[1]); } } if (!in_array(stripslashes($author), $cvsauthors)) { $cvsauthors[] = stripslashes($author); } pdo_query("INSERT INTO dailyupdatefile (dailyupdateid,filename,checkindate,author,email,log,revision,priorrevision)\n VALUES ({$updateid},'{$filename}','{$checkindate}','{$author}','{$email}','{$log}','{$revision}','{$priorrevision}')"); add_last_sql_error("addDailyChanges", $projectid); } // end foreach commit // If the project has the option to send an email to the author if ($project_array['emailadministrator']) { sendEmailUnregisteredUsers($projectid, $cvsauthors); } // Send an email if some expected builds have not been submitting sendEmailExpectedBuilds($projectid, $currentstarttime); // cleanBuildEmail cleanBuildEmail(); cleanUserTemp(); // If the status of daily update is set to 2 that means we should send an email $query = pdo_query("SELECT status FROM dailyupdate WHERE projectid='{$projectid}' AND date='{$date}'"); $dailyupdate_array = pdo_fetch_array($query); $dailyupdate_status = $dailyupdate_array["status"]; if ($dailyupdate_status == 2) { // Find the groupid $group_query = pdo_query("SELECT buildid,groupid FROM summaryemail WHERE date='{$date}'"); while ($group_array = pdo_fetch_array($group_query)) { $groupid = $group_array["groupid"]; $buildid = $group_array["buildid"]; // Find if the build has any errors $builderror = pdo_query("SELECT count(buildid) FROM builderror WHERE buildid='{$buildid}' AND type='0'"); $builderror_array = pdo_fetch_array($builderror); $nbuilderrors = $builderror_array[0]; // Find if the build has any warnings $buildwarning = pdo_query("SELECT count(buildid) FROM builderror WHERE buildid='{$buildid}' AND type='1'"); $buildwarning_array = pdo_fetch_array($buildwarning); $nbuildwarnings = $buildwarning_array[0]; // Find if the build has any test failings if ($project_emailtesttimingchanged) { $sql = "SELECT count(testid) FROM build2test WHERE buildid='{$buildid}' AND (status='failed' OR timestatus>" . qnum($project_testtimemaxstatus) . ")"; } else { $sql = "SELECT count(testid) FROM build2test WHERE buildid='{$buildid}' AND status='failed'"; } $nfail_array = pdo_fetch_array(pdo_query($sql)); $nfailingtests = $nfail_array[0]; sendsummaryemail($projectid, $groupid, $nbuildwarnings, $nbuilderrors, $nfailingtests); } } pdo_query("UPDATE dailyupdate SET status='1' WHERE projectid='{$projectid}' AND date='{$date}'"); // Remove the old logs include_once "models/errorlog.php"; $ErrorLog = new ErrorLog(); $ErrorLog->Clean(10); // 10 days // Clean the backup directory clean_backup_directory(); // Remove the first builds of the project include_once "cdash/autoremove.php"; removeFirstBuilds($projectid, $project_array["autoremovetimeframe"], $project_array["autoremovemaxbuilds"]); removeBuildsGroupwise($projectid, $project_array["autoremovemaxbuilds"]); } }