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_slave($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 require_format('Revision', $commit_info['revision'], '/^[A-Za-z0-9 \.]+$/');
22 if (array_key_exists('author', $commit_info) && !is_array($commit_info['author']))
23 exit_with_error('InvalidAuthorFormat', array('commit' => $commit_info));
26 $db->begin_transaction();
27 foreach ($commits as $commit_info) {
28 $repository_id = $db->select_or_insert_row('repositories', 'repository', array('name' => $commit_info['repository']));
29 if (!$repository_id) {
30 $db->rollback_transaction();
31 exit_with_error('FailedToInsertRepository', array('commit' => $commit_info));
34 $author = array_get($commit_info, 'author');
37 $account = array_get($author, 'account');
38 $committer_query = array('repository' => $repository_id, 'account' => $account);
39 $committer_data = $committer_query;
40 $name = array_get($author, 'name');
42 $committer_data['name'] = $name;
43 $committer_id = $db->update_or_insert_row('committers', 'committer', $committer_query, $committer_data);
45 $db->rollback_transaction();
46 exit_with_error('FailedToInsertCommitter', array('committer' => $committer_data));
50 $parent_revision = array_get($commit_info, 'parent');
52 if ($parent_revision) {
53 $parent_commit = $db->select_first_row('commits', 'commit', array('repository' => $repository_id, 'revision' => $parent_revision));
54 if (!$parent_commit) {
55 $db->rollback_transaction();
56 exit_with_error('FailedToFindParentCommit', array('commit' => $commit_info));
58 $parent_id = $parent_commit['commit_id'];
62 'repository' => $repository_id,
63 'revision' => $commit_info['revision'],
64 'parent' => $parent_id,
65 'time' => array_get($commit_info, 'time'),
66 'committer' => $committer_id,
67 'message' => array_get($commit_info, 'message'),
70 $db->update_or_insert_row('commits', 'commit', array('repository' => $repository_id, 'revision' => $data['revision']), $data);
72 $db->commit_transaction();
77 main($HTTP_RAW_POST_DATA);