blob: f4c36629d9d226ad84e7b9e5131da328e888bc26 [file] [log] [blame]
<?php
require_once('../include/json-header.php');
require_once('../include/build-requests-fetcher.php');
function main($id, $path, $post_data) {
if (!$id && (count($path) < 1 || count($path) > 2))
exit_with_error('InvalidRequest');
$db = new Database;
if (!$db->connect())
exit_with_error('DatabaseConnectionFailure');
$report = $post_data ? json_decode($post_data, true) : array();
$updates = array_get($report, 'buildRequestUpdates');
if ($updates) {
verify_slave($db, $report);
update_builds($db, $updates);
}
$requests_fetcher = new BuildRequestsFetcher($db);
if ($id)
$requests_fetcher->fetch_request($id);
else {
$triggerable_query = array('name' => array_get($path, 0));
$triggerable = $db->select_first_row('build_triggerables', 'triggerable', $triggerable_query);
if (!$triggerable)
exit_with_error('TriggerableNotFound', $triggerable_query);
$requests_fetcher->fetch_incomplete_requests_for_triggerable($triggerable['triggerable_id']);
}
$resolve_id = array_get($_GET, 'useLegacyIdResolution');
exit_with_success(array(
'buildRequests' => $resolve_id ? $requests_fetcher->results_with_resolved_ids() : $requests_fetcher->results(),
'commitSets' => $requests_fetcher->commit_sets(),
'commits' => $requests_fetcher->commits(),
'uploadedFiles' => $requests_fetcher->uploaded_files(),
));
}
function update_builds($db, $updates) {
$db->begin_transaction();
$test_groups_may_need_more_requests = array();
foreach ($updates as $id => $info) {
$id = intval($id);
$status = $info['status'];
$url = array_get($info, 'url');
$status_description = array_get($info, 'statusDescription');
$request_row = $db->select_first_row('build_requests', 'request', array('id' => $id));
if ($status == 'failedIfNotCompleted') {
if (!$request_row) {
$db->rollback_transaction();
exit_with_error('FailedToFindBuildRequest', array('buildRequest' => $id));
}
if ($request_row['request_status'] == 'completed')
continue;
$is_build = $request_row['request_order'] < 0;
if ($is_build) {
$db->query_and_fetch_all('UPDATE build_requests SET request_status = \'failed\'
WHERE request_group = $1 AND request_order > $2',
array($request_row['request_group'], $request_row['request_order']));
}
$db->update_row('build_requests', 'request', array('id' => $id), array('status' => 'failed', 'url' => $url, 'status_description' => $status_description));
} else {
if (!in_array($status, array('pending', 'scheduled', 'running', 'failed', 'completed', 'canceled'))) {
$db->rollback_transaction();
exit_with_error('UnknownBuildRequestStatus', array('buildRequest' => $id, 'status' => $status));
}
$db->update_row('build_requests', 'request', array('id' => $id), array('status' => $status, 'url' => $url, 'status_description' => $status_description));
if ($status != 'failed')
continue;
}
$test_group_id = $request_row['request_group'];
if (array_key_exists($test_group_id, $test_groups_may_need_more_requests))
continue;
$db->update_row('analysis_test_groups', 'testgroup', array('id' => $test_group_id), array('may_need_more_requests' => TRUE));
$test_groups_may_need_more_requests[$test_group_id] = TRUE;
}
$db->commit_transaction();
}
main(array_get($_GET, 'id'),
array_key_exists('PATH_INFO', $_SERVER) ? explode('/', trim($_SERVER['PATH_INFO'], '/')) : array(),
file_get_contents("php://input"));
?>