3 require('../include/json-header.php');
5 function main($post_data) {
8 exit_with_error('DatabaseConnectionFailure');
10 $report = json_decode($post_data, true);
12 verify_builder($db, $report);
14 $commits = array_get($report, 'commits', array());
16 foreach ($commits as $commit_info) {
17 if (!array_key_exists('repository', $commit_info))
18 exit_with_error('MissingRepositoryName', array('commit' => $commit_info));
19 if (!array_key_exists('revision', $commit_info))
20 exit_with_error('MissingRevision', array('commit' => $commit_info));
21 if (!ctype_alnum($commit_info['revision']))
22 exit_with_error('InvalidRevision', array('commit' => $commit_info));
23 if (!array_key_exists('time', $commit_info))
24 exit_with_error('MissingTimestamp', array('commit' => $commit_info));
25 if (!array_key_exists('author', $commit_info) || !is_array($commit_info['author']))
26 exit_with_error('MissingAuthorOrInvalidFormat', array('commit' => $commit_info));
29 $db->begin_transaction();
30 foreach ($commits as $commit_info) {
31 $repository_id = $db->select_or_insert_row('repositories', 'repository', array('name' => $commit_info['repository']));
32 if (!$repository_id) {
33 $db->rollback_transaction();
34 exit_with_error('FailedToInsertRepository', array('commit' => $commit_info));
37 $parent_revision = array_get($commit_info, 'parent');
39 if ($parent_revision) {
40 $parent_commit = $db->select_first_row('commits', 'commit', array('repository' => $repository_id, 'revision' => $parent_revision));
41 if (!$parent_commit) {
42 $db->rollback_transaction();
43 exit_with_error('FailedToFindParentCommit', array('commit' => $commit_info));
45 $parent_id = $parent_commit['commit_id'];
49 'repository' => $repository_id,
50 'revision' => $commit_info['revision'],
51 'parent' => $parent_id,
52 'time' => $commit_info['time'],
53 'author_name' => array_get($commit_info['author'], 'name'),
54 'author_email' => array_get($commit_info['author'], 'email'),
55 'message' => $commit_info['message'],
58 $db->update_or_insert_row('commits', 'commit', array('repository' => $repository_id, 'revision' => $data['revision']), $data);
60 $db->commit_transaction();
65 function verify_builder($db, $report) {
66 array_key_exists('builderName', $report) or exit_with_error('MissingBuilderName');
67 array_key_exists('builderPassword', $report) or exit_with_error('MissingBuilderPassword');
69 $builder_info = array(
70 'name' => $report['builderName'],
71 'password_hash' => hash('sha256', $report['builderPassword'])
74 $matched_builder = $db->select_first_row('builders', 'builder', $builder_info);
75 if (!$matched_builder)
76 exit_with_error('BuilderNotFound', array('name' => $builder_info['name']));
79 main($HTTP_RAW_POST_DATA);
84 require('../include/json-header.php');
86 function main($post_data) {
89 exit_with_error('DatabaseConnectionFailure');
91 $report = json_decode($post_data, true);
93 verify_builder($db, $report);
95 $commits = array_get($report, 'commits', array());
97 foreach ($commits as $commit_info) {
98 if (!array_key_exists('repository', $commit_info))
99 exit_with_error('MissingRepositoryName', array('commit' => $commit_info));
100 if (!array_key_exists('revision', $commit_info))
101 exit_with_error('MissingRevision', array('commit' => $commit_info));
102 if (!ctype_alnum($commit_info['revision']))
103 exit_with_error('InvalidRevision', array('commit' => $commit_info));
104 if (!array_key_exists('time', $commit_info))
105 exit_with_error('MissingTimestamp', array('commit' => $commit_info));
106 if (!array_key_exists('author', $commit_info) || !is_array($commit_info['author']))
107 exit_with_error('MissingAuthorOrInvalidFormat', array('commit' => $commit_info));
110 $db->begin_transaction();
111 foreach ($commits as $commit_info) {
112 $repository_id = $db->select_or_insert_row('repositories', 'repository', array('name' => $commit_info['repository']));
113 if (!$repository_id) {
114 $db->rollback_transaction();
115 exit_with_error('FailedToInsertRepository', array('commit' => $commit_info));
118 $parent_revision = array_get($commit_info, 'parent');
120 if ($parent_revision) {
121 $parent_commit = $db->select_first_row('commits', 'commit', array('repository' => $repository_id, 'revision' => $parent_revision));
122 if (!$parent_commit) {
123 $db->rollback_transaction();
124 exit_with_error('FailedToFindParentCommit', array('commit' => $commit_info));
126 $parent_id = $parent_commit['commit_id'];
130 'repository' => $repository_id,
131 'revision' => $commit_info['revision'],
132 'parent' => $parent_id,
133 'time' => $commit_info['time'],
134 'author_name' => array_get($commit_info['author'], 'name'),
135 'author_email' => array_get($commit_info['author'], 'email'),
136 'message' => $commit_info['message'],
139 $db->update_or_insert_row('commits', 'commit', array('repository' => $repository_id, 'revision' => $data['revision']), $data);
141 $db->commit_transaction();
146 function verify_builder($db, $report) {
147 array_key_exists('builderName', $report) or exit_with_error('MissingBuilderName');
148 array_key_exists('builderPassword', $report) or exit_with_error('MissingBuilderPassword');
150 $builder_info = array(
151 'name' => $report['builderName'],
152 'password_hash' => hash('sha256', $report['builderPassword'])
155 $matched_builder = $db->select_first_row('builders', 'builder', $builder_info);
156 if (!$matched_builder)
157 exit_with_error('BuilderNotFound', array('name' => $builder_info['name']));
160 main($HTTP_RAW_POST_DATA);