| <?php |
| |
| require('../include/admin-header.php'); |
| |
| if ($db) { |
| |
| if ($action == 'add') { |
| if ($db->insert_row('build_triggerables', 'triggerable', array('name' => $_POST['name']))) { |
| notice('Inserted the new triggerable.'); |
| regenerate_manifest(); |
| } else |
| notice('Could not add the triggerable.'); |
| } else if ($action == 'update') { |
| if (update_field('build_triggerables', 'triggerable', 'name')) |
| regenerate_manifest(); |
| else if (update_boolean_field('build_triggerables', 'triggerable', 'disabled')) |
| regenerate_manifest(); |
| else |
| notice('Invalid parameters.'); |
| } else if ($action == 'update-group-name') { |
| if (update_field('triggerable_repository_groups', 'repositorygroup', 'name')) |
| regenerate_manifest(); |
| } else if ($action == 'update-group-description') { |
| if (update_field('triggerable_repository_groups', 'repositorygroup', 'description')) |
| regenerate_manifest(); |
| } else if ($action == 'update-group-hidden') { |
| if (update_field('triggerable_repository_groups', 'repositorygroup', 'hidden')) |
| regenerate_manifest(); |
| } else if ($action == 'update-group-accept-roots') { |
| if (update_field('triggerable_repository_groups', 'repositorygroup', 'accepts_roots', |
| Database::to_database_boolean(array_get($_POST, 'accepts')))) |
| regenerate_manifest(); |
| } else if ($action == 'update-repositories') { |
| $group_id = intval($_POST['group']); |
| |
| $db->begin_transaction(); |
| $db->query_and_get_affected_rows("DELETE FROM triggerable_repositories WHERE trigrepo_group = $1", array($group_id)); |
| $suceeded = insert_triggerable_repositories($db, $group_id, array_get($_POST, 'repositories')); |
| if ($suceeded) { |
| $db->commit_transaction(); |
| notice('Updated the association.'); |
| regenerate_manifest(); |
| } else |
| $db->rollback_transaction(); |
| } else if ($action == 'update-accept-patch') { |
| $group_id = intval($_POST['group']); |
| $repositories_that_accepts_patch = array_get($_POST, 'repositories', array()); |
| |
| $db->begin_transaction(); |
| if (!$db->query_and_get_affected_rows("UPDATE triggerable_repositories SET trigrepo_accepts_patch = FALSE WHERE trigrepo_group = $1", array($group_id))) { |
| notice('Failed to update the accept-patch status.'); |
| $db->rollback_transaction(); |
| } else { |
| foreach ($repositories_that_accepts_patch as $repository_id) { |
| if (!$db->query_and_get_affected_rows("UPDATE triggerable_repositories SET trigrepo_accepts_patch = TRUE |
| WHERE trigrepo_group = $1 AND trigrepo_repository = $2", array($group_id, $repository_id))) { |
| notice('Failed to update the accept-patch status.'); |
| $db->rollback_transaction(); |
| } |
| } |
| $db->commit_transaction(); |
| notice('Updated the accept-patch status.'); |
| regenerate_manifest(); |
| } |
| } else if ($action == 'add-repository-group') { |
| $triggerable_id = intval($_POST['triggerable']); |
| $name = $_POST['name']; |
| |
| $db->begin_transaction(); |
| $group_id = $db->insert_row('triggerable_repository_groups', 'repositorygroup', array('name' => $name, 'triggerable' => $triggerable_id)); |
| if (!$group_id) |
| notice('Failed to insert the specified repository group.'); |
| else if (!insert_triggerable_repositories($db, $group_id, array_get($_POST, 'repositories'))) |
| $db->rollback_transaction(); |
| else { |
| $db->commit_transaction(); |
| notice('Updated the association.'); |
| regenerate_manifest(); |
| } |
| } |
| |
| $repository_rows = $db->select_rows('repositories', 'repository', array('owner' => NULL), 'name'); |
| |
| $page = new AdministrativePage($db, 'build_triggerables', 'triggerable', array( |
| 'name' => array('editing_mode' => 'string'), |
| 'disabled' => array('editing_mode' => 'boolean', 'post_insertion' => TRUE), |
| 'repositories' => array( |
| 'label' => 'Repository Groups', |
| 'subcolumns'=> array('ID', 'Name', 'Description', 'Hidden', 'Accepts Roots', 'Repositories', 'Accept patches'), |
| 'custom' => function ($triggerable_row) use (&$db, &$repository_rows) { |
| return generate_repository_list($db, $triggerable_row['triggerable_id'], $repository_rows); |
| }), |
| )); |
| |
| $page->render_table('name'); |
| $page->render_form_to_add(); |
| } |
| |
| function insert_triggerable_repositories($db, $group_id, $repositories) |
| { |
| if (!$repositories) |
| return TRUE; |
| foreach ($repositories as $repository_id) { |
| if (!$db->insert_row('triggerable_repositories', 'trigrepo', array('group' => $group_id, 'repository' => $repository_id), NULL)) { |
| notice("Failed to associate repository $repository_id with repository group $group_id."); |
| return FALSE; |
| } |
| } |
| return TRUE; |
| } |
| |
| |
| function generate_repository_list($db, $triggerable_id, $repository_rows) { |
| $group_forms = array(); |
| |
| $repository_groups = $db->select_rows('triggerable_repository_groups', 'repositorygroup', array('triggerable' => $triggerable_id), 'name'); |
| foreach ($repository_groups as $group_row) { |
| $group_id = $group_row['repositorygroup_id']; |
| $group_name = $group_row['repositorygroup_name']; |
| $group_description = $group_row['repositorygroup_description']; |
| $checked_if_hidden = Database::is_true($group_row['repositorygroup_hidden']) ? 'checked' : ''; |
| $checked_if_accepts_roots = Database::is_true($group_row['repositorygroup_accepts_roots']) ? 'checked' : ''; |
| |
| $group_name_form = <<< END |
| <form method="POST"> |
| <input type="hidden" name="action" value="update-group-name"> |
| <input type="hidden" name="id" value="$group_id"> |
| <input type="text" name="name" value="$group_name"> |
| </form> |
| END; |
| |
| $group_description_form = <<< END |
| <form method="POST"> |
| <input type="hidden" name="action" value="update-group-description"> |
| <input type="hidden" name="id" value="$group_id"> |
| <input name="description" value="$group_description"> |
| </form> |
| END; |
| |
| $group_hidden_form = <<< END |
| <form method="POST"> |
| <input type="hidden" name="action" value="update-group-hidden"> |
| <input type="hidden" name="id" value="$group_id"> |
| <input type="checkbox" name="hidden" $checked_if_hidden> |
| <button type="submit">Save</button> |
| </form> |
| END; |
| |
| $group_accepts_roots = <<< END |
| <form method="POST"> |
| <input type="hidden" name="action" value="update-group-accept-roots"> |
| <input type="hidden" name="id" value="$group_id"> |
| <input type="checkbox" name="accepts" $checked_if_accepts_roots> |
| <button type="submit">Save</button> |
| </form> |
| END; |
| |
| $group_repository_rows = $db->select_rows('triggerable_repositories', 'trigrepo', array('group' => $group_id)); |
| $repositories_in_group = array(); |
| $repositories_that_accepts_patch = array(); |
| foreach ($repository_rows as $row) |
| $repositories_in_group[$row['repository_id']] = FALSE; |
| foreach ($group_repository_rows as $row) { |
| $repository_id = $row['trigrepo_repository']; |
| $repositories_in_group[$repository_id] = TRUE; |
| $repositories_that_accepts_patch[$repository_id] = Database::is_true($row['trigrepo_accepts_patch']); |
| } |
| |
| array_push($group_forms, array($group_id, $group_name_form, $group_description_form, $group_hidden_form, $group_accepts_roots, |
| generate_repository_form('update-repositories', $group_id, generate_repository_checkboxes($db, $repository_rows, $repositories_in_group)), |
| generate_repository_form('update-accept-patch', $group_id, generate_repository_checkboxes($db, $repository_rows, $repositories_that_accepts_patch)), |
| )); |
| } |
| |
| $new_group_checkboxes = generate_repository_checkboxes($db, $repository_rows); |
| $new_group_form = <<< END |
| <form method="POST"> |
| <input type="hidden" name="action" value="add-repository-group"> |
| <input type="hidden" name="triggerable" value="$triggerable_id"> |
| <input type="text" name="name" value="" required><br> |
| $new_group_checkboxes |
| <br><button type="submit">Add</button></form> |
| END; |
| |
| array_push($group_forms, $new_group_form); |
| |
| return $group_forms; |
| } |
| |
| function generate_repository_form($action, $group_id, $checkboxes) |
| { |
| return <<< END |
| <form method="POST"> |
| <input type="hidden" name="action" value="$action"> |
| <input type="hidden" name="group" value="$group_id"> |
| $checkboxes |
| <br><button type="submit">Save</button></form> |
| END; |
| } |
| |
| function generate_repository_checkboxes($db, $repository_rows, $selected_repositories = array()) |
| { |
| $form = ''; |
| foreach ($repository_rows as $row) { |
| $id = $row['repository_id']; |
| if (!array_key_exists($id, $selected_repositories)) |
| continue; |
| $name = $row['repository_name']; |
| $checked = $selected_repositories[$id] ? 'checked' : ''; |
| $form .= "<label><input type=\"checkbox\" name=\"repositories[]\" value=\"$id\" $checked>$name</label>"; |
| } |
| return $form; |
| } |
| |
| require('../include/admin-footer.php'); |
| |
| ?> |