Unreviewed build fix after r174477.
[WebKit-https.git] / Websites / perf.webkit.org / public / api / commits.php
1 <?php
2
3 require_once('../include/json-header.php');
4
5 function main($paths) {
6     if (count($paths) < 1 || count($paths) > 2)
7         exit_with_error('InvalidRequest');
8
9     $db = new Database;
10     if (!$db->connect())
11         exit_with_error('DatabaseConnectionFailure');
12
13     $repository_name = $paths[0];
14     $repository_row = $db->select_first_row('repositories', 'repository', array('name' => $repository_name));
15     if (!$repository_row)
16         exit_with_error('RepositoryNotFound', array('repositoryName' => $repository_name));
17     $repository_id = $repository_row['repository_id'];
18
19     $filter = array_get($paths, 1);
20     $single_commit = NULL;
21     $commits = array();
22     if (!$filter) {
23         $commits = $db->fetch_table('commits', 'commit_time');
24     } else if ($filter == 'oldest') {
25         $single_commit = $db->select_first_row('commits', 'commit', array('repository' => $repository_id), 'time');
26     } else if ($filter == 'latest') {
27         $single_commit = $db->select_last_row('commits', 'commit', array('repository' => $repository_id), 'time');
28     } else if ($filter == 'last-reported') {
29         $single_commit = $db->select_last_row('commits', 'commit', array('repository' => $repository_id, 'reported' => true), 'time');
30     } else if (ctype_alnum($filter)) {
31         $single_commit = commit_from_revision($db, $repository_id, $repository_name, $filter);
32     } else {
33         $matches = array();
34         if (!preg_match('/([A-Za-z0-9]+)[\:\-]([A-Za-z0-9]+)/', $filter, $matches))
35             exit_with_error('UnknownFilter', array('repositoryName' => $repository_name, 'filter' => $filter));
36
37         $first = commit_from_revision($db, $repository_id, $matches[1])['commit_time'];
38         $second = commit_from_revision($db, $repository_id, $matches[2])['commit_time'];
39         $in_order = $first < $second;
40
41         $commits = fetch_commits_between($db, $repository_id, $in_order ? $first : $second, $in_order ? $second : $first);
42     }
43
44     exit_with_success(array('commits' => format_commits($single_commit ? array($single_commit) : $commits)));
45 }
46
47 function commit_from_revision($db, $repository_id, $revision) {
48     $all_but_first = substr($revision, 1);
49     if ($revision[0] == 'r' && ctype_digit($all_but_first))
50         $revision = $all_but_first;
51     $commit_info = array('repository' => $repository_id, 'revision' => $revision);
52     $row = $db->select_last_row('commits', 'commit', $commit_info);
53     if (!$row)
54         exit_with_error('UnknownCommit', $commit_info);
55     return $row;
56 }
57
58 function fetch_commits_between($db, $repository_id, $from, $to) {
59     $commits = $db->query_and_fetch_all('SELECT * FROM commits
60         WHERE commit_repository = $1 AND commit_time >= $2 AND commit_time <= $3 AND commit_reported = true ORDER BY commit_time',
61         array($repository_id, $from, $to));
62     if (!$commits)
63         exit_with_error('FailedToFetchCommits', array('repository' => $repository_id, 'from' => $from, 'to' => $to));
64     return $commits;
65 }
66
67 function format_commits($commits) {
68     $formatted_commits = array();
69     foreach ($commits as $commit_row) {
70         array_push($formatted_commits, array(
71             'id' => $commit_row['commit_id'],
72             'revision' => $commit_row['commit_revision'],
73             'parent' => $commit_row['commit_parent'],
74             'time' => $commit_row['commit_time'],
75             'author' => array('name' => $commit_row['commit_author_name'], 'email' => $commit_row['commit_author_email']),
76             'message' => $commit_row['commit_message']
77         ));
78     }
79     return $formatted_commits;
80 }
81
82 main(array_key_exists('PATH_INFO', $_SERVER) ? explode('/', trim($_SERVER['PATH_INFO'], '/')) : array());
83
84 ?>