Commit b6920369 authored by webchick's avatar webchick

#509392 by adrian: Add .info files for installation profiles.

parent 3472adb2
......@@ -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;
}
......@@ -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'];
}
}
......
......@@ -1033,10 +1033,13 @@ protected function setUp() {
$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();
......
......@@ -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".
*/
; $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
......@@ -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(
......
; $Id$
name = Drupal (minimal)
description = Create a Drupal site with only required modules enabled.
version = VERSION
core = 7.x
dependencies[] = block
dependencies[] = dblog
......@@ -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) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment