From b692036962b8d2c5c2b12749cf662d537a889375 Mon Sep 17 00:00:00 2001 From: Angie Byron Date: Wed, 15 Jul 2009 02:08:41 +0000 Subject: [PATCH] #509392 by adrian: Add .info files for installation profiles. --- includes/install.inc | 53 ++++----- install.php | 27 ++--- modules/simpletest/drupal_web_test_case.php | 7 +- modules/system/system.api.php | 120 ++++++++++++++++++++ profiles/default/default.info | 16 +++ profiles/default/default.profile | 88 +------------- profiles/expert/expert.info | 7 ++ profiles/expert/expert.profile | 39 +------ 8 files changed, 188 insertions(+), 169 deletions(-) create mode 100644 profiles/default/default.info create mode 100644 profiles/expert/expert.info diff --git a/includes/install.inc b/includes/install.inc index e5b8243b47b..70ab3c70944 100644 --- a/includes/install.inc +++ b/includes/install.inc @@ -422,24 +422,6 @@ function drupal_get_install_files($module_list = array()) { return $installs; } -/** - * Get a list of modules required by an installation profile. - * - * @param profile - * Name of profile. - * @param locale - * Name of locale used (if any). - * @return - * The list of modules to install. - */ -function drupal_get_profile_modules($profile, $locale = 'en') { - $profile_file = "./profiles/$profile/$profile.profile"; - require_once($profile_file); - - // Get a list of modules required by this profile. - $function = $profile . '_profile_modules'; - return array_merge(drupal_required_modules(), $function(), ($locale != 'en' && !empty($locale) ? array('locale') : array())); -} /** * Verify an install profile for installation. @@ -460,8 +442,8 @@ function drupal_verify_profile($profile, $locale) { if (!isset($profile) || !file_exists($profile_file)) { install_no_profile_error(); } + $info = install_profile_info($profile); - $module_list = drupal_get_profile_modules($profile, $locale); // Get a list of modules that exist in Drupal's assorted subdirectories. $present_modules = array(); @@ -470,7 +452,7 @@ function drupal_verify_profile($profile, $locale) { } // Verify that all of the profile's required modules are present. - $missing_modules = array_diff($module_list, $present_modules); + $missing_modules = array_diff($info['dependencies'], $present_modules); $requirements = array(); @@ -924,14 +906,10 @@ function drupal_check_profile($profile) { install_no_profile_error(); } - require_once $profile_file; - - // Get a list of modules required by this profile. - $function = $profile . '_profile_modules'; - $module_list = array_unique(array_merge(drupal_required_modules(), $function())); + $info = install_profile_info($profile); // Get a list of all .install files. - $installs = drupal_get_install_files($module_list); + $installs = drupal_get_install_files($info['dependencies']); // Collect requirement testing results $requirements = array(); @@ -996,3 +974,26 @@ function drupal_check_module($module) { } return TRUE; } + +/** + * Retrieve info about an install profile from its .info file. + */ +function install_profile_info($profile, $locale = 'en') { + $cache =& drupal_static('install_profile_info', array(), TRUE); + // Set defaults for module info. + $defaults = array( + 'dependencies' => array(), + 'tasks' => array(), + 'description' => '', + 'version' => NULL, + 'php' => DRUPAL_MINIMUM_PHP, + ); + $info = drupal_parse_info_file(sprintf('profiles/%s/%s.info', $profile, $profile)) + $defaults; + $info['dependencies'] = array_unique(array_merge( + drupal_required_modules(), + $info['dependencies'], + ($locale != 'en' && !empty($locale) ? array('locale') : array())) + ); + return $info; +} + diff --git a/install.php b/install.php index ba10ef279b0..b76bb601739 100644 --- a/install.php +++ b/install.php @@ -102,8 +102,6 @@ function install_main() { install_no_profile_error(); } - // Load the profile. - require_once DRUPAL_ROOT . "/profiles/$profile/$profile.profile"; // Locale selection if (!empty($_GET['locale'])) { @@ -113,6 +111,10 @@ function install_main() { install_goto("install.php?profile=$profile&locale=$install_locale"); } + // Load the profile. + require_once DRUPAL_ROOT . "/profiles/$profile/$profile.profile"; + $info = install_profile_info($profile, $install_locale); + // Tasks come after the database is set up if (!$task) { global $db_url; @@ -151,7 +153,7 @@ function install_main() { // Save the list of other modules to install for the 'profile-install' // task. variable_set() can be used now that system.module is installed // and drupal is bootstrapped. - $modules = drupal_get_profile_modules($profile, $install_locale); + $modules = $info['dependencies']; variable_set('install_profile_modules', array_diff($modules, array('system'))); } @@ -437,6 +439,7 @@ function install_select_profile() { } } + /** * Form API array definition for the profile selection form. * @@ -451,12 +454,8 @@ function install_select_profile_form(&$form_state, $profile_files) { foreach ($profile_files as $profile) { include_once DRUPAL_ROOT . '/' . $profile->filepath; - - // Load profile details and store them for later retrieval. - $function = $profile->name . '_profile_details'; - if (function_exists($function)) { - $details = $function(); - } + + $details = install_profile_info($profile->name); $profiles[$profile->name] = $details; // Determine the name of the profile; default to file name if defined name @@ -970,15 +969,11 @@ function install_task_list($active = NULL) { unset($tasks['profile-select']); $tasks['profile-install-batch'] = st('Install site'); } - // Add tasks defined by the profile. if ($profile) { - $function = $profile . '_profile_task_list'; - if (function_exists($function)) { - $result = $function(); - if (is_array($result)) { - $tasks += $result; - } + $info = install_profile_info($profile); + if (array_key_exists('tasks', $info)) { + $tasks += $info['tasks']; } } diff --git a/modules/simpletest/drupal_web_test_case.php b/modules/simpletest/drupal_web_test_case.php index 4e0d55ffbc9..8b5655d5155 100644 --- a/modules/simpletest/drupal_web_test_case.php +++ b/modules/simpletest/drupal_web_test_case.php @@ -1033,10 +1033,13 @@ class DrupalWebTestCase extends DrupalTestCase { $this->preloadRegistry(); + // Include the default profile + require_once("./profiles/default/default.profile"); + $profile_details = install_profile_info('default', 'en'); + // Add the specified modules to the list of modules in the default profile. // Install the modules specified by the default profile. - $core_modules = drupal_get_profile_modules('default', 'en'); - drupal_install_modules($core_modules, TRUE); + drupal_install_modules($profile_details['dependencies'], TRUE); node_type_clear(); diff --git a/modules/system/system.api.php b/modules/system/system.api.php index e1638f7ec15..7aead6c9b9b 100644 --- a/modules/system/system.api.php +++ b/modules/system/system.api.php @@ -1825,6 +1825,126 @@ function hook_registry_files_alter(&$files, $module_cache) { } } + +/** + * Perform any final installation tasks for an installation profile. + * + * The installer goes through the profile-select -> locale-select + * -> requirements -> database -> profile-install-batch + * -> locale-initial-batch -> configure -> locale-remaining-batch + * -> finished -> done tasks, in this order, if you don't implement + * this function in your profile. + * + * If this function is implemented, you can have any number of + * custom tasks to perform after 'configure', implementing a state + * machine here to walk the user through those tasks. First time, + * this function gets called with $task set to 'profile', and you + * can advance to further tasks by setting $task to your tasks' + * identifiers, used as array keys in the tasks property of the + * profilename.info file. + * + * You must avoid the reserved tasks listed in install_reserved_tasks(). + * If you implement your custom tasks, this function will get called in + * every HTTP request (for form processing, printing your information + * screens and so on) until you advance to the 'profile-finished' task, + * with which you hand control back to the installer. Each custom page + * you return needs to provide a way to continue, such as a form + * submission or a link. You should also set custom page titles. + * + * You should define the list of custom tasks you implement by + * specifying an array of tasks in your profilename.info file, as these + * show up in the list of tasks on the installer user interface. + * + * Example : + * task[custom_task] = My first custom task + * task[custom_task_2] = My second custom task + * + * Remember that the user will be able to reload the pages multiple + * times, so you might want to use variable_set() and variable_get() + * to remember your data and control further processing, if $task + * is insufficient. Should a profile want to display a form here, + * it can; the form should set '#redirect' to FALSE, and rely on + * an action in the submit handler, such as variable_set(), to + * detect submission and proceed to further tasks. See the configuration + * form handling code in install_tasks() for an example. + * + * Important: Any temporary variables should be removed using + * variable_del() before advancing to the 'profile-finished' phase. + * + * @param $task + * The current $task of the install system. When hook_profile_tasks() + * is first called, this is 'profile'. + * @param $url + * Complete URL to be used for a link or form action on a custom page, + * if providing any, to allow the user to proceed with the installation. + * + * @return + * An optional HTML string to display to the user. Only used if you + * modify the $task, otherwise discarded. + */ +function hook_profile_tasks(&$task, $url) { + + // Enable some standard blocks. + $values = array( + array( + 'module' => 'system', + 'delta' => 'main', + 'theme' => 'garland', + 'status' => 1, + 'weight' => 0, + 'region' => 'content', + 'pages' => '', + 'cache' => -1, + ), + array( + 'module' => 'user', + 'delta' => 'login', + 'theme' => 'garland', + 'status' => 1, + 'weight' => 0, + 'region' => 'left', + 'pages' => '', + 'cache' => -1, + ), + array( + 'module' => 'system', + 'delta' => 'navigation', + 'theme' => 'garland', + 'status' => 1, + 'weight' => 0, + 'region' => 'left', + 'pages' => '', + 'cache' => -1, + ), + array( + 'module' => 'system', + 'delta' => 'management', + 'theme' => 'garland', + 'status' => 1, + 'weight' => 1, + 'region' => 'left', + 'pages' => '', + 'cache' => -1, + ), + array( + 'module' => 'system', + 'delta' => 'help', + 'theme' => 'garland', + 'status' => 1, + 'weight' => 0, + 'region' => 'help', + 'pages' => '', + 'cache' => -1, + ), + ); + $query = db_insert('block')->fields(array('module', 'delta', 'theme', 'status', 'weight', 'region', 'pages', 'cache')); + foreach ($values as $record) { + $query->values($record); + } + $query->execute(); +} + + /** * @} End of "addtogroup hooks". */ diff --git a/profiles/default/default.info b/profiles/default/default.info new file mode 100644 index 00000000000..4dfc866230c --- /dev/null +++ b/profiles/default/default.info @@ -0,0 +1,16 @@ +; $Id$ +name = Drupal +description = Create a Drupal site with the most commonly used features pre-installed. +version = VERSION +core = 7.x +dependencies[] = block +dependencies[] = color +dependencies[] = comment +dependencies[] = help +dependencies[] = image +dependencies[] = menu +dependencies[] = path +dependencies[] = taxonomy +dependencies[] = dblog +dependencies[] = search +dependencies[] = toolbar diff --git a/profiles/default/default.profile b/profiles/default/default.profile index 256e2606242..27793b23eb9 100644 --- a/profiles/default/default.profile +++ b/profiles/default/default.profile @@ -2,95 +2,9 @@ // $Id$ /** - * Return an array of the modules to be enabled when this profile is installed. - * - * @return - * An array of modules to enable. - */ -function default_profile_modules() { - return array('block', 'color', 'comment', 'help', 'image', 'menu', 'path', 'taxonomy', 'dblog', 'search', 'toolbar'); -} - -/** - * Return a description of the profile for the initial installation screen. - * - * @return - * An array with keys 'name' and 'description' describing this profile, - * and optional 'language' to override the language selection for - * language-specific profiles. - */ -function default_profile_details() { - return array( - 'name' => 'Drupal', - 'description' => 'Create a Drupal site with the most commonly used features pre-installed.' - ); -} - -/** - * Return a list of tasks that this profile supports. - * - * @return - * A keyed array of tasks the profile will perform during - * the final stage. The keys of the array will be used internally, - * while the values will be displayed to the user in the installer - * task list. - */ -function default_profile_task_list() { -} - -/** - * Perform any final installation tasks for this profile. - * - * The installer goes through the profile-select -> locale-select - * -> requirements -> database -> profile-install-batch - * -> locale-initial-batch -> configure -> locale-remaining-batch - * -> finished -> done tasks, in this order, if you don't implement - * this function in your profile. - * - * If this function is implemented, you can have any number of - * custom tasks to perform after 'configure', implementing a state - * machine here to walk the user through those tasks. First time, - * this function gets called with $task set to 'profile', and you - * can advance to further tasks by setting $task to your tasks' - * identifiers, used as array keys in the hook_profile_task_list() - * above. You must avoid the reserved tasks listed in - * install_reserved_tasks(). If you implement your custom tasks, - * this function will get called in every HTTP request (for form - * processing, printing your information screens and so on) until - * you advance to the 'profile-finished' task, with which you - * hand control back to the installer. Each custom page you - * return needs to provide a way to continue, such as a form - * submission or a link. You should also set custom page titles. - * - * You should define the list of custom tasks you implement by - * returning an array of them in hook_profile_task_list(), as these - * show up in the list of tasks on the installer user interface. - * - * Remember that the user will be able to reload the pages multiple - * times, so you might want to use variable_set() and variable_get() - * to remember your data and control further processing, if $task - * is insufficient. Should a profile want to display a form here, - * it can; the form should set '#redirect' to FALSE, and rely on - * an action in the submit handler, such as variable_set(), to - * detect submission and proceed to further tasks. See the configuration - * form handling code in install_tasks() for an example. - * - * Important: Any temporary variables should be removed using - * variable_del() before advancing to the 'profile-finished' phase. - * - * @param $task - * The current $task of the install system. When hook_profile_tasks() - * is first called, this is 'profile'. - * @param $url - * Complete URL to be used for a link or form action on a custom page, - * if providing any, to allow the user to proceed with the installation. - * - * @return - * An optional HTML string to display to the user. Only used if you - * modify the $task, otherwise discarded. + * Implement hook_profile_tasks(). */ function default_profile_tasks(&$task, $url) { - // Enable some standard blocks. $values = array( array( diff --git a/profiles/expert/expert.info b/profiles/expert/expert.info new file mode 100644 index 00000000000..a6958c855a3 --- /dev/null +++ b/profiles/expert/expert.info @@ -0,0 +1,7 @@ +; $Id$ +name = Drupal (minimal) +description = Create a Drupal site with only required modules enabled. +version = VERSION +core = 7.x +dependencies[] = block +dependencies[] = dblog diff --git a/profiles/expert/expert.profile b/profiles/expert/expert.profile index 2a13c72a6a2..a9231e47876 100644 --- a/profiles/expert/expert.profile +++ b/profiles/expert/expert.profile @@ -2,44 +2,7 @@ // $Id$ /** - * Return an array of the modules to be enabled when this profile is installed. - * - * @return - * An array of modules to enable. - */ -function expert_profile_modules() { - return array('block', 'dblog'); -} - -/** - * Return a description of the profile for the initial installation screen. - * - * @return - * An array with keys 'name' and 'description' describing this profile, - * and optional 'language' to override the language selection for - * language-specific profiles. - */ -function expert_profile_details() { - return array( - 'name' => 'Drupal (minimal)', - 'description' => 'Create a Drupal site with only required modules enabled.' - ); -} - -/** - * Return a list of tasks that this profile supports. - * - * @return - * A keyed array of tasks the profile will perform during - * the final stage. The keys of the array will be used internally, - * while the values will be displayed to the user in the installer - * task list. - */ -function expert_profile_task_list() { -} - -/** - * Perform any final installation tasks for this profile. + * Implement hook_profile_tasks(). */ function expert_profile_tasks(&$task, $url) {