Example #1
1
function main()
{
    $program_start_time = microtime(true);
    $arguments = validate_arguments($_GET, array('platform' => 'int', 'metric' => 'int', 'testGroup' => 'int?', 'startTime' => 'int?', 'endTime' => 'int?'));
    $platform_id = $arguments['platform'];
    $metric_id = $arguments['metric'];
    $start_time = $arguments['startTime'];
    $end_time = $arguments['endTime'];
    if (!!$start_time != !!$end_time) {
        exit_with_error('InvalidTimeRange', array('startTime' => $start_time, 'endTime' => $end_time));
    }
    $db = new Database();
    if (!$db->connect()) {
        exit_with_error('DatabaseConnectionFailure');
    }
    $fetcher = new MeasurementSetFetcher($db);
    if (!$fetcher->fetch_config_list($platform_id, $metric_id)) {
        exit_with_error('ConfigurationNotFound', array('platform' => $platform_id, 'metric' => $metric_id));
    }
    $cluster_count = 0;
    while (!$fetcher->at_end()) {
        $content = $fetcher->fetch_next_cluster();
        $cluster_count++;
        if ($fetcher->at_end()) {
            $cache_filename = "measurement-set-{$platform_id}-{$metric_id}.json";
            $content['clusterCount'] = $cluster_count;
            $content['elapsedTime'] = (microtime(true) - $program_start_time) * 1000;
        } else {
            $cache_filename = "measurement-set-{$platform_id}-{$metric_id}-{$content['endTime']}.json";
        }
        $json = success_json($content);
        generate_data_file($cache_filename, $json);
    }
    echo $json;
}
Example #2
0
function main($path)
{
    if (count($path) > 1) {
        exit_with_error('InvalidRequest');
    }
    $db = new Database();
    if (!$db->connect()) {
        exit_with_error('DatabaseConnectionFailure');
    }
    $task_id = array_get($_GET, 'task');
    $query = array();
    if ($task_id) {
        $triggerable = find_triggerable_for_task($db, $task_id);
        if (!$triggerable) {
            exit_with_error('TriggerableNotFoundForTask', array('task' => $task_id));
        }
        $query['id'] = $triggerable['id'];
    }
    $id_to_triggerable = array();
    foreach ($db->select_rows('build_triggerables', 'triggerable', $query) as $row) {
        $id = $row['triggerable_id'];
        $repositories = array();
        $id_to_triggerable[$id] = array('id' => $id, 'name' => $row['triggerable_name'], 'acceptedRepositories' => &$repositories);
    }
    foreach ($db->select_rows('triggerable_repositories', 'trigrepo', array()) as $row) {
        $triggerable = array_get($id_to_triggerable, $row['trigrepo_triggerable']);
        if ($triggerable) {
            array_push($triggerable['acceptedRepositories'], $row['trigrepo_repository']);
        }
    }
    exit_with_success(array('triggerables' => array_values($id_to_triggerable)));
}
Example #3
0
function main($post_data)
{
    $db = new Database();
    if (!$db->connect()) {
        exit_with_error('DatabaseConnectionFailure');
    }
    $report = json_decode($post_data, true);
    verify_slave($db, $report);
    $commits = array_get($report, 'commits', array());
    foreach ($commits as $commit_info) {
        if (!array_key_exists('repository', $commit_info)) {
            exit_with_error('MissingRepositoryName', array('commit' => $commit_info));
        }
        if (!array_key_exists('revision', $commit_info)) {
            exit_with_error('MissingRevision', array('commit' => $commit_info));
        }
        require_format('Revision', $commit_info['revision'], '/^[A-Za-z0-9 \\.]+$/');
        if (array_key_exists('author', $commit_info) && !is_array($commit_info['author'])) {
            exit_with_error('InvalidAuthorFormat', array('commit' => $commit_info));
        }
    }
    $db->begin_transaction();
    foreach ($commits as $commit_info) {
        $repository_id = $db->select_or_insert_row('repositories', 'repository', array('name' => $commit_info['repository']));
        if (!$repository_id) {
            $db->rollback_transaction();
            exit_with_error('FailedToInsertRepository', array('commit' => $commit_info));
        }
        $author = array_get($commit_info, 'author');
        $committer_id = NULL;
        if ($author) {
            $account = array_get($author, 'account');
            $committer_query = array('repository' => $repository_id, 'account' => $account);
            $committer_data = $committer_query;
            $name = array_get($author, 'name');
            if ($name) {
                $committer_data['name'] = $name;
            }
            $committer_id = $db->update_or_insert_row('committers', 'committer', $committer_query, $committer_data);
            if (!$committer_id) {
                $db->rollback_transaction();
                exit_with_error('FailedToInsertCommitter', array('committer' => $committer_data));
            }
        }
        $parent_revision = array_get($commit_info, 'parent');
        $parent_id = NULL;
        if ($parent_revision) {
            $parent_commit = $db->select_first_row('commits', 'commit', array('repository' => $repository_id, 'revision' => $parent_revision));
            if (!$parent_commit) {
                $db->rollback_transaction();
                exit_with_error('FailedToFindParentCommit', array('commit' => $commit_info));
            }
            $parent_id = $parent_commit['commit_id'];
        }
        $data = array('repository' => $repository_id, 'revision' => $commit_info['revision'], 'parent' => $parent_id, 'order' => array_get($commit_info, 'order'), 'time' => array_get($commit_info, 'time'), 'committer' => $committer_id, 'message' => array_get($commit_info, 'message'), 'reported' => true);
        $db->update_or_insert_row('commits', 'commit', array('repository' => $repository_id, 'revision' => $data['revision']), $data);
    }
    $db->commit_transaction();
    exit_with_success();
}
Example #4
0
function commit_sets_from_root_sets($db, $root_sets)
{
    $repository_name_to_id = array();
    foreach ($db->fetch_table('repositories') as $row) {
        $repository_name_to_id[$row['repository_name']] = $row['repository_id'];
    }
    $commit_sets = array();
    foreach ($root_sets as $repository_name => $revisions) {
        $repository_id = array_get($repository_name_to_id, $repository_name);
        if (!$repository_id) {
            exit_with_error('RepositoryNotFound', array('name' => $repository_name));
        }
        foreach ($revisions as $i => $revision) {
            $commit = $db->select_first_row('commits', 'commit', array('repository' => $repository_id, 'revision' => $revision));
            if (!$commit) {
                exit_with_error('RevisionNotFound', array('repository' => $repository_name, 'revision' => $revision));
            }
            array_set_default($commit_sets, $i, array());
            array_push($commit_sets[$i], $commit['commit_id']);
        }
    }
    $commit_count_per_set = count($commit_sets[0]);
    foreach ($commit_sets as $commits) {
        if ($commit_count_per_set != count($commits)) {
            exit_with_error('InvalidRootSets', array('rootSets' => $root_sets));
        }
    }
    return $commit_sets;
}
Example #5
0
function main($post_data)
{
    set_exit_detail('failureStored', false);
    $db = new Database();
    if (!$db->connect()) {
        exit_with_error('DatabaseConnectionFailure');
    }
    // Convert all floating points to strings to avoid parsing them in PHP.
    // FIXME: Do this conversion in the submission scripts themselves.
    $parsed_json = json_decode(preg_replace('/(?<=[\\s,\\[])(\\d+(\\.\\d+)?)(\\s*[,\\]])/', '"$1"$3', $post_data), true);
    if (!$parsed_json) {
        exit_with_error('FailedToParseJSON');
    }
    set_exit_detail('processedRuns', 0);
    foreach ($parsed_json as $i => $report) {
        $processor = new ReportProcessor($db);
        $processor->process($report);
        set_exit_detail('processedRuns', $i + 1);
    }
    $generator = new ManifestGenerator($db);
    if (!$generator->generate()) {
        exit_with_error('FailedToGenerateManifest');
    } else {
        if (!$generator->store()) {
            exit_with_error('FailedToStoreManifest');
        }
    }
    exit_with_success();
}
Example #6
0
function main()
{
    $data = ensure_privileged_api_data_and_token();
    $analysis_task_id = array_get($data, 'task');
    $bug_tracker_id = array_get($data, 'bugTracker');
    $bug_number = array_get($data, 'number');
    $bug_id = array_get($data, 'bugToDelete');
    $db = connect();
    $db->begin_transaction();
    if ($bug_id) {
        require_format('BugToDelete', $bug_id, '/^\\d+$/');
        $count = $db->query_and_get_affected_rows("DELETE FROM bugs WHERE bug_id = \$1", array($bug_id));
        if ($count != 1) {
            $db->rollback_transaction();
            exit_with_error('UnexpectedNumberOfAffectedRows', array('affectedRows' => $count));
        }
    } else {
        require_format('AnalysisTask', $analysis_task_id, '/^\\d+$/');
        require_format('BugTracker', $bug_tracker_id, '/^\\d+$/');
        require_format('BugNumber', $bug_number, '/^\\d+$/');
        $bug_id = $db->insert_row('bugs', 'bug', array('task' => $analysis_task_id, 'tracker' => $bug_tracker_id, 'number' => $bug_number));
    }
    $db->commit_transaction();
    exit_with_success(array('bugId' => $bug_id));
}
function main()
{
    $data = ensure_privileged_api_data_and_token();
    $test_group_id = array_get($data, 'group');
    if (!$test_group_id) {
        exit_with_error('TestGroupNotSpecified');
    }
    $values = array();
    if (array_key_exists('name', $data)) {
        $values['name'] = $data['name'];
    }
    if (array_key_exists('hidden', $data)) {
        $values['hidden'] = Database::to_database_boolean($data['hidden']);
    }
    if (!$values) {
        exit_with_error('NothingToUpdate');
    }
    $db = connect();
    $db->begin_transaction();
    if (!$db->update_row('analysis_test_groups', 'testgroup', array('id' => $test_group_id), $values)) {
        $db->rollback_transaction();
        exit_with_error('FailedToUpdateTestGroup', array('id' => $test_group_id, 'values' => $values));
    }
    if (array_get($data, 'hidden')) {
        $db->query_and_get_affected_rows('UPDATE build_requests SET request_status = $1
            WHERE request_group = $2 AND request_status = $3', array('canceled', $test_group_id, 'pending'));
    }
    $db->commit_transaction();
    exit_with_success();
}
Example #8
0
function fetch_and_push_bugs_to_tasks($db, &$tasks)
{
    $task_ids = array();
    $task_by_id = array();
    foreach ($tasks as &$task) {
        array_push($task_ids, $task['id']);
        $task_by_id[$task['id']] =& $task;
    }
    $bugs = $db->query_and_fetch_all('SELECT bug_id AS "id", bug_task AS "task", bug_tracker AS "bugTracker", bug_number AS "number"
        FROM bugs WHERE bug_task = ANY ($1)', array('{' . implode(', ', $task_ids) . '}'));
    if (!is_array($bugs)) {
        exit_with_error('FailedToFetchBugs');
    }
    foreach ($bugs as $bug) {
        $associated_task =& $task_by_id[$bug['task']];
        array_push($associated_task['bugs'], $bug['id']);
    }
    $task_build_counts = $db->query_and_fetch_all('SELECT
        testgroup_task AS "task",
        count(testgroup_id) as "total",
        sum(case when request_status = \'failed\' or request_status = \'completed\' then 1 else 0 end) as "finished"
        FROM analysis_test_groups, build_requests
        WHERE request_group = testgroup_id AND testgroup_task = ANY($1) GROUP BY testgroup_task', array('{' . implode(', ', $task_ids) . '}'));
    if (!is_array($task_build_counts)) {
        exit_with_error('FailedToFetchTestGroups');
    }
    foreach ($task_build_counts as $build_count) {
        $task =& $task_by_id[$build_count['task']];
        $task['buildRequestCount'] = $build_count['total'];
        $task['finishedBuildRequestCount'] = $build_count['finished'];
    }
    return $bugs;
}
function ensure_config_from_runs($db, $start_run, $end_run)
{
    $range = array('startRun' => $start_run, 'endRun' => $end_run);
    if ($start_run['run_config'] != $end_run['run_config']) {
        exit_with_error('RunConfigMismatch', $range);
    }
    return ensure_row_by_id($db, 'test_configurations', 'config', $start_run['run_config'], 'ConfigNotFound', $range);
}
Example #10
0
function main($paths)
{
    if (count($paths) < 1 || count($paths) > 2) {
        exit_with_error('InvalidRequest');
    }
    $db = new Database();
    if (!$db->connect()) {
        exit_with_error('DatabaseConnectionFailure');
    }
    $fetcher = new CommitLogFetcher($db);
    if (!is_numeric($paths[0])) {
        $repository_id = $fetcher->repository_id_from_name($paths[0]);
        if (!$repository_id) {
            exit_with_error('RepositoryNotFound', array('repositoryName' => $paths[0]));
        }
    } else {
        $repository_id = intval($paths[0]);
    }
    $filter = array_get($paths, 1);
    $commits = array();
    if (!$filter) {
        $keyword = array_get($_GET, 'keyword');
        $from = array_get($_GET, 'from');
        $to = array_get($_GET, 'to');
        $commits = $fetcher->fetch_between($repository_id, $from, $to, $keyword);
    } else {
        if ($filter == 'oldest') {
            $commits = $fetcher->fetch_oldest($repository_id);
        } else {
            if ($filter == 'latest') {
                $commits = $fetcher->fetch_latest($repository_id);
            } else {
                if ($filter == 'last-reported') {
                    $commits = $fetcher->fetch_last_reported($repository_id);
                } else {
                    if (ctype_alnum($filter)) {
                        $commits = $fetcher->fetch_revision($repository_id, $filter);
                    } else {
                        $matches = array();
                        if (!preg_match('/([A-Za-z0-9]+)[\\:\\-]([A-Za-z0-9]+)/', $filter, $matches)) {
                            exit_with_error('UnknownFilter', array('repositoryName' => $repository_name, 'filter' => $filter));
                        }
                        $commits = $fetcher->fetch_between($repository_id, $matches[1], $matches[2]);
                    }
                }
            }
        }
    }
    if (!is_array($commits)) {
        exit_with_error('FailedToFetchCommits', array('repository' => $repository_id, 'filter' => $filter));
    }
    exit_with_success(array('commits' => $commits));
}
function main($path)
{
    $db = new Database();
    if (!$db->connect()) {
        exit_with_error('DatabaseConnectionFailure');
    }
    if (count($path) > 1) {
        exit_with_error('InvalidRequest');
    }
    $build_requests_fetcher = new BuildRequestsFetcher($db);
    if (count($path) > 0 && $path[0]) {
        $group_id = intval($path[0]);
        $group = $db->select_first_row('analysis_test_groups', 'testgroup', array('id' => $group_id));
        if (!$group) {
            exit_with_error('GroupNotFound', array('id' => $group_id));
        }
        $test_groups = array($group);
        $build_requests_fetcher->fetch_for_group($group_id);
    } else {
        $task_id = array_get($_GET, 'task');
        if (!$task_id) {
            exit_with_error('TaskIdNotSpecified');
        }
        $test_groups = $db->select_rows('analysis_test_groups', 'testgroup', array('task' => $task_id));
        if (!is_array($test_groups)) {
            exit_with_error('FailedToFetchTestGroups');
        }
        $build_requests_fetcher->fetch_for_task($task_id);
    }
    if (!$build_requests_fetcher->has_results()) {
        exit_with_error('FailedToFetchBuildRequests');
    }
    $test_groups = array_map("format_test_group", $test_groups);
    $group_by_id = array();
    foreach ($test_groups as &$group) {
        $group_id = $group['id'];
        $group_by_id[$group_id] =& $group;
        $platforms = $db->query_and_fetch_all('SELECT DISTINCT(config_platform)
            FROM test_configurations, test_runs, build_requests
            WHERE run_config = config_id AND run_build = request_build AND request_group = $1', array($group_id));
        if ($platforms) {
            $group['platform'] = $platforms[0]['config_platform'];
        }
    }
    $build_requests = $build_requests_fetcher->results();
    foreach ($build_requests as $request) {
        $request_group =& $group_by_id[$request['testGroup']];
        array_push($request_group['buildRequests'], $request['id']);
        array_push($request_group['rootSets'], $request['rootSet']);
    }
    exit_with_success(array('testGroups' => $test_groups, 'buildRequests' => $build_requests, 'rootSets' => $build_requests_fetcher->root_sets(), 'roots' => $build_requests_fetcher->roots()));
}
Example #12
0
function require_existence_of($array, $list_of_arguments, $prefix = '')
{
    if ($prefix) {
        $prefix .= '_';
    }
    foreach ($list_of_arguments as $key => $pattern) {
        $name = camel_case_words_separated_by_underscore($prefix . $key);
        if (!array_key_exists($key, $array)) {
            exit_with_error($name . 'NotSpecified');
        }
        require_format($name, $array[$key], $pattern);
    }
}
Example #13
0
 public function __construct($jsonFileLocation, $outputFile)
 {
     $this->jsonFileLocation = $jsonFileLocation;
     $this->json = json_decode(file_get_contents(realpath($jsonFileLocation)), true);
     $this->out = fopen($outputFile, 'w');
     if (!is_array($this->json)) {
         fclose($this->out);
         exit_with_error('invalid json file');
     }
     if ($this->out === false) {
         exit_with_error('could not open output file ./InitializerExtension.swift');
     }
 }
Example #14
0
function main()
{
    $db = new Database();
    if (!$db->connect()) {
        exit_with_error('DatabaseConnectionFailure');
    }
    $generator = new ManifestGenerator($db);
    if (!$generator->generate()) {
        exit_with_error('FailedToGenerateManifest');
    }
    if (!$generator->store()) {
        exit_with_error('FailedToStoreManifest');
    }
    exit_with_success($generator->manifest());
}
Example #15
0
function main($path)
{
    if (count($path) != 1) {
        exit_with_error('InvalidRequest');
    }
    $parts = explode('-', $path[0]);
    if (count($parts) != 2) {
        exit_with_error('InvalidRequest');
    }
    $db = new Database();
    if (!$db->connect()) {
        exit_with_error('DatabaseConnectionFailure');
    }
    $platform_id = intval($parts[0]);
    $metric_id = intval($parts[1]);
    $config_rows = $db->query_and_fetch_all('SELECT *
        FROM test_configurations WHERE config_metric = $1 AND config_platform = $2', array($metric_id, $platform_id));
    if (!$config_rows) {
        exit_with_error('ConfigurationNotFound');
    }
    $test_group_id = array_get($_GET, 'testGroup');
    $should_cache = array_get($_GET, 'cache');
    if ($test_group_id) {
        $test_group_id = intval($test_group_id);
    } else {
        if ($should_cache) {
            // Only v1 UI needs caching.
            $maxage = config('jsonCacheMaxAge');
            header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $maxage) . ' GMT');
            header("Cache-Control: maxage={$maxage}");
        }
    }
    $generator = new RunsGenerator($config_rows);
    foreach ($config_rows as $config) {
        if ($test_group_id) {
            $raw_runs = fetch_runs_for_config_and_test_group($db, $config, $test_group_id);
        } else {
            $raw_runs = fetch_runs_for_config($db, $config);
        }
        $generator->add_runs($config['config_type'], $raw_runs);
    }
    $content = success_json($generator->results());
    if (!$test_group_id) {
        generate_data_file("{$platform_id}-{$metric_id}.json", $content);
    }
    echo $content;
}
Example #16
0
function main()
{
    require_existence_of($_GET, array('builder' => '/^[A-Za-z0-9 \\(\\)\\-_]+$/'));
    $builder_name = $_GET['builder'];
    $db = connect();
    $builder_row = $db->select_first_row('builders', NULL, array('name' => $builder_name));
    if (!$builder_row) {
        exit_with_error('BuilderNotFound');
    }
    $builder_id = $builder_row['id'];
    $generator = new ResultsJSONGenerator($db, $builder_id);
    if ($generator->generate()) {
        exit_with_success();
    } else {
        exit_with_error('ResultsNotFound');
    }
}
Example #17
0
function main($post_data)
{
    set_exit_detail('failureStored', false);
    $maintenance_mode = config('maintenanceMode');
    if ($maintenance_mode && !config('maintenanceDirectory')) {
        exit_with_error('MaintenanceDirectoryNotSet');
    }
    $db = new Database();
    if (!$maintenance_mode && !$db->connect()) {
        exit_with_error('DatabaseConnectionFailure');
    }
    // Convert all floating points to strings to avoid parsing them in PHP.
    // FIXME: Do this conversion in the submission scripts themselves.
    $parsed_json = json_decode(preg_replace('/(?<=[\\s,\\[])(\\d+(\\.\\d+)?)(\\s*[,\\]])/', '"$1"$3', $post_data), true);
    if (!$parsed_json) {
        exit_with_error('FailedToParseJSON');
    }
    set_exit_detail('processedRuns', 0);
    foreach ($parsed_json as $i => $report) {
        if (!$maintenance_mode) {
            $processor = new ReportProcessor($db);
            $processor->process($report);
        }
        set_exit_detail('processedRuns', $i + 1);
    }
    if ($maintenance_mode) {
        $files = scandir(config_path('maintenanceDirectory', ''));
        $i = 0;
        $filename = '';
        do {
            $i++;
            $filename = "{$i}.json";
        } while (in_array($filename, $files));
        file_put_contents(config_path('maintenanceDirectory', $filename), $post_data, LOCK_EX);
    } else {
        $generator = new ManifestGenerator($db);
        if (!$generator->generate()) {
            exit_with_error('FailedToGenerateManifest');
        } else {
            if (!$generator->store()) {
                exit_with_error('FailedToStoreManifest');
            }
        }
    }
    exit_with_success();
}
Example #18
0
function main()
{
    $data = ensure_privileged_api_data_and_token();
    $run_id = array_get($data, 'run');
    if (!$run_id) {
        exit_with_error('MissingRunId');
    }
    $db = connect();
    $run = $db->select_first_row('test_runs', 'run', array('id' => $run_id));
    if (!$run) {
        exit_with_error('InvalidRun', array('run' => $run_id));
    }
    $marked_outlier = array_get($data, 'markedOutlier');
    $db->begin_transaction();
    $db->update_row('test_runs', 'run', array('id' => $run_id), array('id' => $run_id, 'marked_outlier' => $marked_outlier ? 't' : 'f'));
    $db->commit_transaction();
    exit_with_success();
}
function main()
{
    $data = ensure_privileged_api_data_and_token();
    $analysis_task_id = array_get($data, 'task');
    if (!$analysis_task_id) {
        exit_with_error('AnalysisTaskNotSpecified');
    }
    $values = array();
    if (array_key_exists('name', $data)) {
        $values['name'] = $data['name'];
    }
    if (array_key_exists('result', $data)) {
        require_match_one_of_values('Result', $data['result'], array(null, 'progression', 'regression', 'unchanged', 'inconclusive'));
        $values['result'] = $data['result'];
    }
    if (array_key_exists('needed', $data)) {
        $needed = $data['needed'];
        if ($needed === null) {
            $values['needed'] = null;
        } else {
            if (in_array($needed, array(0, false))) {
                $values['needed'] = Database::to_database_boolean(false);
            } else {
                if (in_array($needed, array(1, true))) {
                    $values['needed'] = Database::to_database_boolean(true);
                } else {
                    exit_with_error('InvalidValueForFeedback', array('value' => $data['needed']));
                }
            }
        }
    }
    if (!$values) {
        exit_with_error('NothingToUpdate');
    }
    $db = connect();
    $db->begin_transaction();
    if (!$db->update_row('analysis_tasks', 'task', array('id' => $analysis_task_id), $values)) {
        $db->rollback_transaction();
        exit_with_error('FailedToUpdateTask', array('id' => $analysis_task_id, 'values' => $values));
    }
    $db->commit_transaction();
    exit_with_success();
}
function main()
{
    $data = ensure_privileged_api_data_and_token();
    $analysis_task_id = array_get($data, 'task');
    $repository_id = array_get($data, 'repository');
    $revision = array_get($data, 'revision');
    $kind = array_get($data, 'kind');
    $commit_id_to_diassociate = array_get($data, 'commit');
    $db = connect();
    $db->begin_transaction();
    require_format('AnalysisTask', $analysis_task_id, '/^\\d+$/');
    if ($commit_id_to_diassociate) {
        require_format('Commit', $commit_id_to_diassociate, '/^\\d*$/');
        $count = $db->query_and_get_affected_rows("DELETE FROM task_commits WHERE taskcommit_task = \$1 AND taskcommit_commit = \$2", array($analysis_task_id, $commit_id_to_diassociate));
        if ($count != 1) {
            $db->rollback_transaction();
            exit_with_error('UnexpectedNumberOfAffectedRows', array('affectedRows' => $count));
        }
    } else {
        require_format('Repository', $repository_id, '/^\\d+$/');
        require_format('Kind', $kind, '/^(cause|fix)$/');
        $commit_info = array('repository' => $repository_id, 'revision' => $revision);
        $commit_rows = $db->query_and_fetch_all('SELECT commit_id FROM commits WHERE commit_repository = $1 AND commit_revision LIKE $2 LIMIT 2', array($repository_id, '%' . Database::escape_for_like($revision) . '%'));
        if (count($commit_rows) > 1) {
            $db->rollback_transaction();
            exit_with_error('AmbiguousRevision', $commit_info);
        } else {
            if (!$commit_rows) {
                $db->rollback_transaction();
                exit_with_error('CommitNotFound', $commit_info);
            }
        }
        $commit_id = $commit_rows[0]['commit_id'];
        $association = array('task' => $analysis_task_id, 'commit' => $commit_id, 'is_fix' => Database::to_database_boolean($kind == 'fix'));
        $commit_id = $db->update_or_insert_row('task_commits', 'taskcommit', array('task' => $analysis_task_id, 'commit' => $commit_id), $association, 'commit');
        if (!$commit_id) {
            $db->rollback_transaction();
            exit_with_error('FailedToAssociateCommit', $association);
        }
    }
    $db->commit_transaction();
    exit_with_success();
}
function main()
{
    $program_start_time = microtime(true);
    $arguments = validate_arguments($_GET, array('platform' => 'int?', 'metric' => 'int?', 'analysisTask' => 'int?'));
    $platform_id = $arguments['platform'];
    $metric_id = $arguments['metric'];
    $task_id = $arguments['analysisTask'];
    if (!($platform_id && $metric_id && !$task_id || $task_id && !$platform_id && !$metric_id)) {
        exit_with_error('AmbiguousRequest');
    }
    $db = new Database();
    if (!$db->connect()) {
        exit_with_error('DatabaseConnectionFailure');
    }
    if ($task_id) {
        $fetcher = new AnalysisResultsFetcher($db, $task_id);
        exit_with_success($fetcher->fetch());
    }
    $fetcher = new MeasurementSetFetcher($db);
    if (!$fetcher->fetch_config_list($platform_id, $metric_id)) {
        exit_with_error('ConfigurationNotFound', array('platform' => $platform_id, 'metric' => $metric_id));
    }
    if ($fetcher->at_end()) {
        header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
        exit(404);
    }
    $cluster_count = 0;
    while (!$fetcher->at_end()) {
        $content = $fetcher->fetch_next_cluster();
        $cluster_count++;
        if ($fetcher->at_end()) {
            $cache_filename = "measurement-set-{$platform_id}-{$metric_id}.json";
            $content['clusterCount'] = $cluster_count;
            $content['elapsedTime'] = (microtime(true) - $program_start_time) * 1000;
        } else {
            $cache_filename = "measurement-set-{$platform_id}-{$metric_id}-{$content['endTime']}.json";
        }
        $json = success_json($content);
        generate_data_file($cache_filename, $json);
    }
    echo $json;
}
Example #22
0
function update_builds($db, $updates)
{
    $db->begin_transaction();
    foreach ($updates as $id => $info) {
        $id = intval($id);
        $status = $info['status'];
        $url = array_get($info, 'url');
        if ($status == 'failedIfNotCompleted') {
            $db->query_and_get_affected_rows('UPDATE build_requests SET (request_status, request_url) = ($1, $2)
                WHERE request_id = $3 AND request_status != $4', array('failed', $url, $id, 'completed'));
        } else {
            if (!in_array($status, array('pending', 'scheduled', 'running', 'failed', 'completed'))) {
                $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));
        }
    }
    $db->commit_transaction();
}
Example #23
0
function main()
{
    require_existence_of($_POST, array('master' => '/[A-Za-z0-9\\.]+/', 'builder_name' => '/^[A-Za-z0-9 \\(\\)\\-_]+$/', 'build_number' => '/^[0-9]+?$/', 'build_slave' => '/^[A-Za-z0-9\\-_]+$/', 'revisions' => '/^.+?$/', 'start_time' => '/^[0-9]+(\\.[0-9]+)?$/', 'end_time' => '/^[0-9]+(\\.[0-9]+)?$/'));
    $master = $_POST['master'];
    $builder_name = $_POST['builder_name'];
    $build_number = intval($_POST['build_number']);
    $start_time = float_to_time($_POST['start_time']);
    $end_time = float_to_time($_POST['end_time']);
    $revisions = json_decode(str_replace('\\', '', $_POST['revisions']), TRUE);
    foreach ($revisions as $repository_name => $revision_data) {
        require_format('repository_name', $repository_name, '/^\\w+$/');
        require_existence_of($revision_data, array('revision' => '/^[a-z0-9]+$/', 'timestamp' => '/^[a-z0-9\\-\\.:TZ]+$/'), 'revision');
    }
    if (!array_key_exists('file', $_FILES) or !array_key_exists('tmp_name', $_FILES['file']) or count($_FILES['file']['tmp_name']) <= 0) {
        exit_with_error('ResultsJSONNotIncluded');
    }
    $json_path = $_FILES['file']['tmp_name'];
    $db = connect();
    store_results($db, $master, $builder_name, $build_number, $start_time, $end_time, $revisions, $json_path);
    echo_success();
}
function main($post_data)
{
    $db = new Database();
    if (!$db->connect()) {
        exit_with_error('DatabaseConnectionFailure');
    }
    $report = json_decode($post_data, true);
    verify_slave($db, $report);
    $triggerable_name = array_get($report, 'triggerable');
    $triggerable = $db->select_first_row('build_triggerables', 'triggerable', array('name' => $triggerable_name));
    if (!$triggerable) {
        exit_with_error('TriggerableNotFound', array('triggerable' => $triggerable_name));
    }
    $triggerable_id = $triggerable['triggerable_id'];
    $configurations = array_get($report, 'configurations');
    if (!is_array($configurations)) {
        exit_with_error('InvalidConfigurations', array('configurations' => $configurations));
    }
    foreach ($configurations as $entry) {
        if (!is_array($entry) || !array_key_exists('test', $entry) || !array_key_exists('platform', $entry)) {
            exit_with_error('InvalidConfigurationEntry', array('configurationEntry' => $entry));
        }
    }
    $db->begin_transaction();
    if ($db->query_and_get_affected_rows('DELETE FROM triggerable_configurations WHERE trigconfig_triggerable = $1', array($triggerable_id)) === false) {
        $db->rollback_transaction();
        exit_with_error('FailedToDeleteExistingConfigurations', array('triggerable' => $triggerable_id));
    }
    foreach ($configurations as $entry) {
        $config_info = array('test' => $entry['test'], 'platform' => $entry['platform'], 'triggerable' => $triggerable_id);
        if (!$db->insert_row('triggerable_configurations', 'trigconfig', $config_info, null)) {
            $db->rollback_transaction();
            exit_with_error('FailedToInsertConfiguration', array('entry' => $entry));
        }
    }
    $db->commit_transaction();
    exit_with_success();
}
function main()
{
    $data = ensure_privileged_api_data_and_token();
    $test_group_id = array_get($data, 'group');
    if (!$test_group_id) {
        exit_with_error('TestGroupNotSpecified');
    }
    $values = array();
    if (array_key_exists('name', $data)) {
        $values['name'] = $data['name'];
    }
    if (!$values) {
        exit_with_error('NothingToUpdate');
    }
    $db = connect();
    $db->begin_transaction();
    if (!$db->update_row('analysis_test_groups', 'testgroup', array('id' => $test_group_id), $values)) {
        $db->rollback_transaction();
        exit_with_error('FailedToUpdateTestGroup', array('id' => $test_group_id, 'values' => $values));
    }
    $db->commit_transaction();
    exit_with_success();
}
function main()
{
    $data = ensure_privileged_api_data_and_token();
    $analysis_task_id = array_get($data, 'task');
    $bug_tracker_id = array_get($data, 'bugTracker');
    $bug_number = array_get($data, 'number');
    $bug_id = array_get($data, 'bugToDelete');
    $should_delete = array_get($data, 'shouldDelete');
    $db = connect();
    $db->begin_transaction();
    if ($bug_id) {
        // V2 compatibility
        require_format('BugToDelete', $bug_id, '/^\\d+$/');
        $count = $db->query_and_get_affected_rows("DELETE FROM bugs WHERE bug_id = \$1", array($bug_id));
        if ($count != 1) {
            $db->rollback_transaction();
            exit_with_error('UnexpectedNumberOfAffectedRows', array('affectedRows' => $count));
        }
    } else {
        require_format('AnalysisTask', $analysis_task_id, '/^\\d+$/');
        require_format('BugTracker', $bug_tracker_id, '/^\\d+$/');
        require_format('BugNumber', $bug_number, '/^\\d+$/');
        if ($should_delete) {
            // V3
            $count = $db->query_and_get_affected_rows("DELETE FROM bugs WHERE bug_task = \$1 AND bug_tracker = \$2 AND bug_number = \$3", array($analysis_task_id, $bug_tracker_id, $bug_number));
            if ($count < 1) {
                // FIXME: We should forbid duplicate bugs (same bug number on same tracker for same task)
                $db->rollback_transaction();
                exit_with_error('UnexpectedNumberOfAffectedRows', array('affectedRows' => $count));
            }
        } else {
            $bug_id = $db->insert_row('bugs', 'bug', array('task' => $analysis_task_id, 'tracker' => $bug_tracker_id, 'number' => $bug_number));
        }
    }
    $db->commit_transaction();
    exit_with_success(array('bugId' => $bug_id));
}
Example #27
0
function main()
{
    require_existence_of($_GET, array('builder' => '/^[A-Za-z0-9 \\(\\)\\-_]+$/'));
    $builder_param = $_GET['builder'];
    $db = connect();
    $builder_row = $db->select_first_row('builders', NULL, array('name' => $builder_param));
    if (!$builder_row) {
        $builder_row = $db->select_first_row('builders', NULL, array('id' => $builder_param));
        if (!$builder_row) {
            exit_with_error('BuilderNotFound');
        }
    }
    $builder_id = $builder_row['id'];
    $generator = new ResultsJSONGenerator($db, $builder_id);
    if (!$generator->generate('wrongexpectations')) {
        exit_with_error('ResultsWithWrongExpectationsNotFound', array('builderId' => $builder_id));
    } else {
        if (!$generator->generate('flaky')) {
            exit_with_error('FlakyResultsNotFound', array('builderId' => $builder_id));
        } else {
            exit_with_success();
        }
    }
}
Example #28
0
    exit_with_error('InvalidRequest');
}
$parts = explode('-', $paths[0]);
if (count($parts) != 2) {
    exit_with_error('InvalidRequest');
}
$db = new Database();
if (!$db->connect()) {
    exit_with_error('DatabaseConnectionFailure');
}
$platform_id = intval($parts[0]);
$metric_id = intval($parts[1]);
$config_rows = $db->query_and_fetch_all('SELECT config_id, config_type, config_platform, config_metric
    FROM test_configurations WHERE config_metric = $1 AND config_platform = $2', array($metric_id, $platform_id));
if (!$config_rows) {
    exit_with_error('ConfigurationNotFound');
}
$repository_id_to_name = array();
if ($repository_table = $db->fetch_table('repositories')) {
    foreach ($repository_table as $repository) {
        $repository_id_to_name[$repository['repository_id']] = $repository['repository_name'];
    }
}
function fetch_runs_for_config($db, $config)
{
    $raw_runs = $db->query_and_fetch_all('
    SELECT test_runs.*, builds.*, array_agg((revision_repository, revision_value, revision_time)) AS revisions
        FROM builds LEFT OUTER JOIN build_revisions ON revision_build = build_id, test_runs
        WHERE run_build = build_id AND run_config = $1
        GROUP BY build_id, build_builder, build_number, build_time, build_latest_revision,
            run_id, run_config, run_build, run_iteration_count_cache,
Example #29
0
 private function exit_with_error($message, $details = NULL)
 {
     $details['failureStored'] = $this->db->query_and_get_affected_rows('UPDATE reports SET report_failure = $1, report_failure_details = $2 WHERE report_id = $3', array($message, $details ? json_encode($details) : NULL, $this->report_id)) == 1;
     exit_with_error($message, $details);
 }
Example #30
0
function fetch_commits_between($db, $repository_id, $first, $second, $keyword = NULL)
{
    $statements = 'SELECT commit_id as "id",
        commit_revision as "revision",
        commit_parent as "parent",
        commit_time as "time",
        committer_name as "authorName",
        committer_account as "authorEmail",
        commit_message as "message"
        FROM commits LEFT OUTER JOIN committers ON commit_committer = committer_id
        WHERE commit_repository = $1 AND commit_reported = true';
    $values = array($repository_id);
    if ($first && $second) {
        $first_commit = commit_from_revision($db, $repository_id, $first);
        $second_commit = commit_from_revision($db, $repository_id, $second);
        $first = $first_commit['commit_time'];
        $second = $second_commit['commit_time'];
        $in_order = $first < $second;
        array_push($values, $in_order ? $first : $second);
        $statements .= ' AND commit_time >= $' . count($values);
        array_push($values, $in_order ? $second : $first);
        $statements .= ' AND commit_time <= $' . count($values);
    }
    if ($keyword) {
        array_push($values, '%' . str_replace(array('\\', '_', '%'), array('\\\\', '\\_', '\\%'), $keyword) . '%');
        $keyword_index = '$' . count($values);
        array_push($values, ltrim($keyword, 'r'));
        $revision_index = '$' . count($values);
        $statements .= "\n            AND ((committer_name LIKE {$keyword_index} OR committer_account LIKE {$keyword_index}) OR commit_revision = {$revision_index})";
    }
    $commits = $db->query_and_fetch_all($statements . ' ORDER BY commit_time', $values);
    if (!is_array($commits)) {
        exit_with_error('FailedToFetchCommits', array('repository' => $repository_id, 'first' => $first, 'second' => $second));
    }
    foreach ($commits as &$commit) {
        $commit['time'] = Database::to_js_time($commit['time']);
    }
    return $commits;
}