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 fetch_associated_data_for_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']); } $commit_log_fetcher = new CommitLogFetcher($db); $commits = $commit_log_fetcher->fetch_for_tasks($task_ids, $task_by_id); if (!is_array($commits)) { exit_with_error('FailedToFetchCommits'); } $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\' or request_status = \'canceled\' 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']; $task['category'] = determine_category($task); } return array('analysisTasks' => $tasks, 'bugs' => $bugs, 'commits' => $commits); }