148 lines
6.7 KiB
PHP
148 lines
6.7 KiB
PHP
<?php
|
|
|
|
require_once('../include/json-header.php');
|
|
require_once('../include/manifest-generator.php');
|
|
require_once('../include/repository-group-finder.php');
|
|
|
|
function main($post_data)
|
|
{
|
|
$db = new Database;
|
|
if (!$db->connect())
|
|
exit_with_error('DatabaseConnectionFailure');
|
|
|
|
$report = json_decode($post_data, true);
|
|
verify_worker($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');
|
|
validate_configurations($db, $configurations);
|
|
|
|
$repository_groups = array_get($report, 'repositoryGroups', array());
|
|
validate_repository_groups($db, $repository_groups);
|
|
|
|
$finder = new RepositoryGroupFinder($db, $triggerable_id);
|
|
foreach ($repository_groups as &$group)
|
|
$group['existingGroup'] = $finder->find_by_repositories($group['repository_id_list']);
|
|
|
|
$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));
|
|
}
|
|
}
|
|
|
|
foreach ($repository_groups as &$group) {
|
|
$group_id = $group['existingGroup'];
|
|
$group_info = array(
|
|
'triggerable' => $triggerable_id,
|
|
'name' => $group['name'],
|
|
'description' => array_get($group, 'description'),
|
|
'accepts_roots' => Database::to_database_boolean(array_get($group, 'acceptsRoots', FALSE)));
|
|
if ($group_id) {
|
|
if (!$db->update_row('triggerable_repository_groups', 'repositorygroup', array('id' => $group_id), $group_info)) {
|
|
$db->rollback_transaction();
|
|
exit_with_error('FailedToInsertRepositoryGroup', array('repositoryGroup' => $group));
|
|
}
|
|
} else {
|
|
$group_id = $db->update_or_insert_row('triggerable_repository_groups', 'repositorygroup',
|
|
array('triggerable' => $triggerable_id, 'name' => $group['name']), $group_info);
|
|
if (!$group_id) {
|
|
$db->rollback_transaction();
|
|
exit_with_error('FailedToInsertRepositoryGroup', array('repositoryGroup' => $group));
|
|
}
|
|
}
|
|
if ($db->query_and_get_affected_rows('DELETE FROM triggerable_repositories WHERE trigrepo_group = $1', array($group_id)) === FALSE) {
|
|
$db->rollback_transaction();
|
|
exit_with_error('FailedToDisassociateRepositories', array('repositoryGroup' => $group));
|
|
}
|
|
foreach ($group['repositories'] as $repository_data) {
|
|
$row = array('group' => $group_id,
|
|
'repository' => $repository_data['repository'],
|
|
'accepts_patch' => Database::to_database_boolean(array_get($repository_data, 'acceptsPatch', FALSE)));
|
|
if (!$db->insert_row('triggerable_repositories', 'trigrepo', $row, null)) {
|
|
$db->rollback_transaction();
|
|
exit_with_error('FailedToAssociateRepository', array('repositoryGroup' => $group, 'repository' => $repository_id));
|
|
}
|
|
}
|
|
}
|
|
|
|
$db->commit_transaction();
|
|
|
|
$generator = new ManifestGenerator($db);
|
|
if (!$generator->generate())
|
|
exit_with_error('FailedToGenerateManifest');
|
|
|
|
if (!$generator->store())
|
|
exit_with_error('FailedToStoreManifest');
|
|
|
|
exit_with_success();
|
|
}
|
|
|
|
function validate_configurations($db, $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));
|
|
}
|
|
}
|
|
|
|
function validate_repository_groups($db, &$repository_groups)
|
|
{
|
|
if (!is_array($repository_groups))
|
|
exit_with_error('InvalidRepositoryGroups', array('repositoryGroups' => $repository_groups));
|
|
|
|
$top_level_repositories = $db->select_rows('repositories', 'repository', array('owner' => null));
|
|
$top_level_repository_ids = array();
|
|
foreach ($top_level_repositories as $repository_row)
|
|
$top_level_repository_ids[$repository_row['repository_id']] = true;
|
|
|
|
foreach ($repository_groups as &$group) {
|
|
if (!is_array($group) || !array_key_exists('name', $group) || !array_key_exists('repositories', $group) || !is_array($group['repositories']))
|
|
exit_with_error('InvalidRepositoryGroup', array('repositoryGroup' => $group));
|
|
|
|
$accepts_roots = array_get($group, 'acceptsRoots', FALSE);
|
|
if ($accepts_roots !== TRUE && $accepts_roots !== FALSE)
|
|
exit_with_error('InvalidAcceptsRoots', array('repositoryGroup' => $group, 'acceptsRoots' => accepts_roots));
|
|
|
|
$repository_list = $group['repositories'];
|
|
$group_repository_list = array();
|
|
foreach ($repository_list as $repository_data) {
|
|
if (!$repository_data || !is_array($repository_data))
|
|
exit_with_error('InvalidRepositoryData', array('repositoryGroup' => $group, 'data' => $repository_data));
|
|
|
|
$id = array_get($repository_data, 'repository');
|
|
if (!$id || !is_numeric($id) || !array_key_exists($id, $top_level_repository_ids))
|
|
exit_with_error('InvalidRepository', array('repositoryGroup' => $group, 'repository' => $id));
|
|
|
|
if (array_key_exists($id, $group_repository_list))
|
|
exit_with_error('DuplicateRepository', array('repositoryGroup' => $group, 'repository' => $id));
|
|
|
|
$accepts_patch = array_get($repository_data, 'acceptsPatch', FALSE);
|
|
if ($accepts_patch !== TRUE && $accepts_patch !== FALSE)
|
|
exit_with_error('InvalidRepositoryData', array('repositoryGroup' => $group, 'repository' => $id));
|
|
|
|
$group_repository_list[$id] = true;
|
|
}
|
|
$group['repository_id_list'] = array_keys($group_repository_list);
|
|
}
|
|
}
|
|
|
|
main(file_get_contents('php://input'));
|
|
|
|
?>
|