diff --git a/drupalorg_project/drupalorg_project.install b/drupalorg_project/drupalorg_project.install index 9f1f9ef..1c7a50c 100644 --- a/drupalorg_project/drupalorg_project.install +++ b/drupalorg_project/drupalorg_project.install @@ -18,6 +18,17 @@ function drupalorg_project_install() { } /** + * Implements hook_uninstall(). + */ +function drupalorg_project_uninstall() { + variable_del('packagist_username'); + variable_del('packagist_api_token'); + variable_del('packagist_api_url'); + variable_del('packagist_drupal_url'); + variable_del('drupal_git_url'); +} + +/** * Implements hook_update_dependencies(). */ function drupalorg_project_update_dependencies() { diff --git a/drupalorg_project/drupalorg_project.module b/drupalorg_project/drupalorg_project.module index 2f4a983..c61b174 100644 --- a/drupalorg_project/drupalorg_project.module +++ b/drupalorg_project/drupalorg_project.module @@ -118,6 +118,12 @@ function drupalorg_project_menu() { 'type' => MENU_LOCAL_TASK, 'weight' => 6, ); + $items['admin/config/system/drupalorg-packagist'] = array( + 'title' => 'Drupal.org Packagist settings', + 'access arguments' => array('administer site configuration'), + 'page callback' => 'drupal_get_form', + 'page arguments' => array('drupalorg_project_packagist_settings_form'), + ); // Callbacks to process legacy urls. $map = array( @@ -915,6 +921,114 @@ function drupalorg_project_node_view($node, $view_mode = 'full') { } } +function drupalorg_project_packagist_settings_form($form, &$form_state) { + $form['authentication'] = array( + '#type' => 'fieldset', + '#title' => t('Packagist authentication'), + '#collapsible' => FALSE, + '#collapsed' => FALSE, + ); + + $form['authentication']['packagist_username'] = array( + '#type' => 'textfield', + '#title' => t('Packagist username'), + '#default_value' => variable_get('packagist_username', FALSE), + '#size' => 60, + '#maxlength' => 128, + '#required' => TRUE, + ); + + $form['authentication']['packagist_api_token'] = array( + '#type' => 'textfield', + '#title' => t('Packagist API token'), + '#default_value' => variable_get('packagist_api_token', FALSE), + '#size' => 60, + '#maxlength' => 128, + '#required' => TRUE, + ); + + $form['packagist_api_url'] = array( + '#type' => 'textfield', + '#title' => t('Packagist API url'), + '#default_value' => variable_get('packagist_api_url', 'https://packagist.org/api/'), + '#size' => 60, + '#maxlength' => 128, + '#required' => TRUE, + ); + + $form['packagist_drupal_url'] = array( + '#type' => 'textfield', + '#title' => t('Packagist Drupal url'), + '#default_value' => variable_get('packagist_drupal_url', 'https://packagist.org/packages/drupal/'), + '#size' => 60, + '#maxlength' => 128, + '#required' => TRUE, + ); + + $form['drupal_git_url'] = array( + '#type' => 'textfield', + '#title' => t('Drupal git url'), + '#default_value' => variable_get('drupal_git_url', 'http://git.drupal.org/project/'), + '#size' => 60, + '#maxlength' => 128, + '#required' => TRUE, + ); + + return system_settings_form($form); +} + +/** + * Implements hook_versioncontrol_code_arrival(). + */ +function drupalorg_versioncontrol_code_arrival(VersioncontrolRepository $repository, VersioncontrolEvent $event){ + $packagist_project = drupalorg_project_packagist_get($repository); + if ($packagist_project->code === 404) { + drupalorg_project_packagist_submit('create-package', $repository); + } + else { + drupalorg_project_packagist_submit('update-package', $repository); + } +} + +/** + * Get package info from packagist + * + * @param VersioncontrolRepository $repository + * The repository object. + */ +function drupalorg_project_packagist_get(VersioncontrolRepository $repository) { + $project_url_name = check_plain(drupal_encode_path($repository->name)); + $packagist_drupal_url = variable_get('packagist_drupal_url', 'https://packagist.org/packages/drupal/'); + return drupal_http_request("{$packagist_drupal_url}{$project_url_name}.json", [ + 'headers' => array('Content-Type' => 'application/json'), + 'method' => 'GET' + ]); +} + +/** + * Submit to packagist + * + * @param string $endpoint + * The Packagist endpoint to use ('update-package' or 'create-package'). + * @param VersioncontrolRepository $repository + * The repository object. + */ +function drupalorg_project_packagist_submit($endpoint, VersioncontrolRepository $repository) { + $packagist_username = variable_get('packagist_username', FALSE); + $packagist_api_token = variable_get('packagist_api_token', FALSE); + $packagist_api_url = variable_get('packagist_api_url', 'https://packagist.org/api/'); + $drupal_git_url = variable_get('drupal_git_url', 'http://git.drupal.org/project/'); + if ($packagist_username && $packagist_api_token) { + $project_url_name = check_plain(drupal_encode_path($repository->name . '.git')); + $anon_project_url = $drupal_git_url . $project_url_name; + return drupal_http_request("{$packagist_api_url}{$endpoint}?username={$packagist_username}&apiToken={$packagist_api_token}", [ + 'headers' => array('Content-Type' => 'application/json'), + 'method' => 'POST', + 'data' => json_encode(['repository' => ['url' => $anon_project_url]]), + ]); + } +} + /** * Implements hook_preprocess_node(). */