| <?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")); |
| |
| ?> |