Commit dca8e5c8 authored by Adrian Rossouw's avatar Adrian Rossouw Committed by adrian

#411822 - refactor to use drush_bootstrap. This also should fix #408810.

parent e945a47c
......@@ -16,6 +16,20 @@ define('PROVISION_DB_DUMP_NOT_READABLE', 'PROVISION_DB_DUMP_NOT_READABLE');
define('PROVISION_DB_IMPORT_FAILED', 'PROVISION_DB_IMPORT_FAILED');
function provision_mysql_provision_init() {
drush_set_default('master_db', $GLOBALS['db_url']);
$master_db = drush_get_option('master_db');
$db = parse_url($master_db);
drush_set_default('master_db_user', $db['user']);
drush_set_default('master_db_passwd', $db['pass']);
drush_set_default('master_db_host', $db['host']);
drush_set_default('db_host', $db['host']);
drush_set_default('master_db_type', $db['scheme']);
drush_set_default('db_type', $db['scheme']);
}
function provision_mysql_provision_finalize() {
provision_db_close();
}
......
......@@ -10,8 +10,10 @@
* Make sure the site is installed and enabled, and that we have a valid target to back up to.
*/
function provision_drupal_provision_backup_validate($url = NULL, $backup_file = NULL) {
_provision_drupal_url_required();
_provision_drupal_valid_installed_site();
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_SITE);
if (!drush_get_option('installed')) {
drush_set_error(PROVISION_DRUPAL_SITE_FOUND);
}
// This is the actual drupal provisioning requirements.
if (!is_dir(drush_get_option('backup_path'))) {
......
......@@ -25,7 +25,6 @@
*/
function provision_drupal_provision_deploy_validate($url = null, $backup_file = null) {
_provision_drupal_url_required();
_provision_drupal_valid_not_installed_site();
$exists = provision_path("exists", $backup_file, TRUE,
dt("Deploying site from @path"),
......@@ -45,6 +44,7 @@ function provision_drupal_provision_pre_deploy($url, $backup_file) {
dt('Failed to extract the contents of @path'),
PROVISION_BACKUP_EXTRACTION_FAILED);
if ($extracted) {
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_SITE);
// @TODO Clear up this properly.
// $old_data = provision_get_site_data($url);
// $data = array_merge($old_data, $data);
......@@ -54,7 +54,7 @@ function provision_drupal_provision_pre_deploy($url, $backup_file) {
/**
* Remove the extracted site directory
*/
function provision_provision_pre_deploy_rollback($url) {
function provision_drupal_provision_pre_deploy_rollback($url) {
_provision_recursive_delete(drush_get_option('sites_path') ."/$url");
}
......
......@@ -12,8 +12,11 @@
* Make sure the command we are running is on an installed site.
*/
function provision_drupal_provision_disable_validate() {
_provision_drupal_url_required();
_provision_drupal_valid_installed_site();
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_SITE);
if (!drush_get_option('installed')) {
drush_set_error(PROVISION_DRUPAL_SITE_FOUND);
}
}
/**
......
......@@ -105,7 +105,7 @@ function install_send_welcome_mail($url, $profile, $language, $client_email) {
function install_main() {
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_CONFIGURATION);
// This must go after drupal_bootstrap(), which unsets globals!
global $profile, $install_locale, $client_email;
require_once './modules/system/system.install';
......@@ -116,8 +116,7 @@ function install_main() {
// Drupal may already be installed.
if ($verify) {
// Establish a connection to the database.
require_once './includes/database.inc';
db_set_active();
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_DATABASE);
// Check if Drupal is installed.
if (install_verify_drupal()) {
drush_set_error(PROVISION_DRUPAL_SITE_INSTALLED, st('Site is already installed'));
......@@ -168,7 +167,7 @@ function install_main() {
// Perform actual installation defined in the profile.
drupal_install_profile($profile, $modules);
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_FULL);
// Show profile finalization info.
$function = $profile .'_profile_final';
......
......@@ -114,7 +114,7 @@ function install_mail($key, &$message, $params) {
function install_main() {
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_CONFIGURATION);
// This must go after drupal_bootstrap(), which unsets globals!
global $profile, $install_locale, $client_email, $conf, $url;
......@@ -148,9 +148,7 @@ function install_main() {
require_once './includes/cache.inc';
$conf['cache_inc'] = './includes/cache.inc';
// Establish a connection to the database.
require_once './includes/database.inc';
db_set_active();
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_DATABASE);
if (install_verify_drupal()) {
return drush_set_error(PROVISION_DRUPAL_SITE_INSTALLED);
......@@ -209,11 +207,21 @@ function install_main() {
return drush_set_error(PROVISION_DRUPAL_INSTALL_FAILED);
}
drupal_install_system();
$modules = array_diff($modules, array('system'));
$system_path = dirname(drupal_get_filename('module', 'system', NULL));
require_once './'. $system_path .'/system.install';
module_invoke('system', 'install');
$system_versions = drupal_get_schema_versions('system');
$system_version = $system_versions ? max($system_versions) : SCHEMA_INSTALLED;
db_query("INSERT INTO {system} (filename, name, type, owner, status, throttle, bootstrap, schema_version) VALUES('%s', '%s', '%s', '%s', %d, %d, %d, %d)", $system_path .'/system.module', 'system', 'module', '', 1, 0, 0, $system_version);
// Now that we've installed things properly, bootstrap the full Drupal environment
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
module_rebuild_cache();
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_FULL);
$modules = array_diff($modules, array('system'));
if ($install_locale != 'en') {
$modules = array_merge($modules, array('locale'));
}
/**
* Further installation tasks
*
......@@ -232,8 +240,10 @@ function install_main() {
array("@module" => $files[$module]->info['name'])));
}
drush_log("Initial locale import");
// locale-initial-import and locale-inintial-batch tasks
if (!empty($install_locale) && ($install_locale != 'en')) {
include_once 'includes/locale.inc';
// Enable installation language as default site language.
locale_add_language($install_locale, NULL, NULL, NULL, NULL, NULL, 1, TRUE);
// Collect files to import for this language.
......
......@@ -7,13 +7,309 @@
* which has been modified to allow being run from the command
* line.
*/
define('MAINTENANCE_MODE', 'update');
/**
* Add a column to a database using syntax appropriate for PostgreSQL.
* Save result of SQL commands in $ret array.
*
* Note: when you add a column with NOT NULL and you are not sure if there are
* already rows in the table, you MUST also add DEFAULT. Otherwise PostgreSQL
* won't work when the table is not empty, and db_add_column() will fail.
* To have an empty string as the default, you must use: 'default' => "''"
* in the $attributes array. If NOT NULL and DEFAULT are set the PostgreSQL
* version will set values of the added column in old rows to the
* DEFAULT value.
*
* @param $ret
* Array to which results will be added.
* @param $table
* Name of the table, without {}
* @param $column
* Name of the column
* @param $type
* Type of column
* @param $attributes
* Additional optional attributes. Recognized attributes:
* not null => TRUE|FALSE
* default => NULL|FALSE|value (the value must be enclosed in '' marks)
* @return
* nothing, but modifies $ret parameter.
*/
function db_add_column(&$ret, $table, $column, $type, $attributes = array()) {
if (array_key_exists('not null', $attributes) and $attributes['not null']) {
$not_null = 'NOT NULL';
}
if (array_key_exists('default', $attributes)) {
if (is_null($attributes['default'])) {
$default_val = 'NULL';
$default = 'default NULL';
}
elseif ($attributes['default'] === FALSE) {
$default = '';
}
else {
$default_val = "$attributes[default]";
$default = "default $attributes[default]";
}
}
$ret[] = update_sql("ALTER TABLE {". $table ."} ADD $column $type");
if (!empty($default)) {
$ret[] = update_sql("ALTER TABLE {". $table ."} ALTER $column SET $default");
}
if (!empty($not_null)) {
if (!empty($default)) {
$ret[] = update_sql("UPDATE {". $table ."} SET $column = $default_val");
}
$ret[] = update_sql("ALTER TABLE {". $table ."} ALTER $column SET NOT NULL");
}
}
/**
* Change a column definition using syntax appropriate for PostgreSQL.
* Save result of SQL commands in $ret array.
*
* Remember that changing a column definition involves adding a new column
* and dropping an old one. This means that any indices, primary keys and
* sequences from serial-type columns are dropped and might need to be
* recreated.
*
* @param $ret
* Array to which results will be added.
* @param $table
* Name of the table, without {}
* @param $column
* Name of the column to change
* @param $column_new
* New name for the column (set to the same as $column if you don't want to change the name)
* @param $type
* Type of column
* @param $attributes
* Additional optional attributes. Recognized attributes:
* not null => TRUE|FALSE
* default => NULL|FALSE|value (with or without '', it won't be added)
* @return
* nothing, but modifies $ret parameter.
*/
function db_change_column(&$ret, $table, $column, $column_new, $type, $attributes = array()) {
if (array_key_exists('not null', $attributes) and $attributes['not null']) {
$not_null = 'NOT NULL';
}
if (array_key_exists('default', $attributes)) {
if (is_null($attributes['default'])) {
$default_val = 'NULL';
$default = 'default NULL';
}
elseif ($attributes['default'] === FALSE) {
$default = '';
}
else {
$default_val = "$attributes[default]";
$default = "default $attributes[default]";
}
}
$ret[] = update_sql("ALTER TABLE {". $table ."} RENAME $column TO ". $column ."_old");
$ret[] = update_sql("ALTER TABLE {". $table ."} ADD $column_new $type");
$ret[] = update_sql("UPDATE {". $table ."} SET $column_new = ". $column ."_old");
if ($default) { $ret[] = update_sql("ALTER TABLE {". $table ."} ALTER $column_new SET $default"); }
if ($not_null) { $ret[] = update_sql("ALTER TABLE {". $table ."} ALTER $column_new SET NOT NULL"); }
$ret[] = update_sql("ALTER TABLE {". $table ."} DROP ". $column ."_old");
}
/**
* Disable anything in the {system} table that is not compatible with the
* current version of Drupal core.
*/
function update_fix_compatibility() {
$ret = array();
$incompatible = array();
$query = db_query("SELECT name, type, status FROM {system} WHERE status = 1 AND type IN ('module','theme')");
while ($result = db_fetch_object($query)) {
if (update_check_incompatibility($result->name, $result->type)) {
$incompatible[] = $result->name;
}
}
if (!empty($incompatible)) {
$ret[] = update_sql("UPDATE {system} SET status = 0 WHERE name IN ('". implode("','", $incompatible) ."')");
}
return $ret;
}
/**
* Helper function to test compatibility of a module or theme.
*/
function update_check_incompatibility($name, $type = 'module') {
static $themes, $modules;
// Store values of expensive functions for future use.
if (empty($themes) || empty($modules)) {
$themes = _system_theme_data();
$modules = module_rebuild_cache();
}
if ($type == 'module' && isset($modules[$name])) {
$file = $modules[$name];
}
else if ($type == 'theme' && isset($themes[$name])) {
$file = $themes[$name];
}
if (!isset($file)
|| !isset($file->info['core'])
|| $file->info['core'] != DRUPAL_CORE_COMPATIBILITY
|| version_compare(phpversion(), $file->info['php']) < 0) {
return TRUE;
}
return FALSE;
}
/**
* Perform Drupal 5.x to 6.x updates that are required for update.php
* to function properly.
*
* This function runs when update.php is run the first time for 6.x,
* even before updates are selected or performed. It is important
* that if updates are not ultimately performed that no changes are
* made which make it impossible to continue using the prior version.
* Just adding columns is safe. However, renaming the
* system.description column to owner is not. Therefore, we add the
* system.owner column and leave it to system_update_6008() to copy
* the data from description and remove description. The same for
* renaming locales_target.locale to locales_target.language, which
* will be finished by locale_update_6002().
*/
function update_fix_d6_requirements() {
$ret = array();
if (drupal_get_installed_schema_version('system') < 6000 && !variable_get('update_d6_requirements', FALSE)) {
$spec = array('type' => 'int', 'size' => 'small', 'default' => 0, 'not null' => TRUE);
db_add_field($ret, 'cache', 'serialized', $spec);
db_add_field($ret, 'cache_filter', 'serialized', $spec);
db_add_field($ret, 'cache_page', 'serialized', $spec);
db_add_field($ret, 'cache_menu', 'serialized', $spec);
db_add_field($ret, 'system', 'info', array('type' => 'text'));
db_add_field($ret, 'system', 'owner', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''));
if (db_table_exists('locales_target')) {
db_add_field($ret, 'locales_target', 'language', array('type' => 'varchar', 'length' => 12, 'not null' => TRUE, 'default' => ''));
}
if (db_table_exists('locales_source')) {
db_add_field($ret, 'locales_source', 'textgroup', array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => 'default'));
db_add_field($ret, 'locales_source', 'version', array('type' => 'varchar', 'length' => 20, 'not null' => TRUE, 'default' => 'none'));
}
variable_set('update_d6_requirements', TRUE);
// Create the cache_block table. See system_update_6027() for more details.
$schema['cache_block'] = array(
'fields' => array(
'cid' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
'data' => array('type' => 'blob', 'not null' => FALSE, 'size' => 'big'),
'expire' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
'created' => array('type' => 'int', 'not null' => TRUE, 'default' => 0),
'headers' => array('type' => 'text', 'not null' => FALSE),
'serialized' => array('type' => 'int', 'size' => 'small', 'not null' => TRUE, 'default' => 0)
),
'indexes' => array('expire' => array('expire')),
'primary key' => array('cid'),
);
db_create_table($ret, 'cache_block', $schema['cache_block']);
}
return $ret;
}
/**
* Check update requirements and report any errors.
*/
function update_check_requirements() {
// Check the system module requirements only.
$requirements = module_invoke('system', 'requirements', 'update');
$severity = drupal_requirements_severity($requirements);
// If there are issues, report them.
if ($severity != REQUIREMENT_OK) {
foreach ($requirements as $requirement) {
if (isset($requirement['severity']) && $requirement['severity'] != REQUIREMENT_OK) {
$message = isset($requirement['description']) ? $requirement['description'] : '';
if (isset($requirement['value']) && $requirement['value']) {
$message .= ' (Currently using '. $requirement['title'] .' '. $requirement['value'] .')';
}
drupal_log($message, 'warning');
}
}
}
}
/**
* Create the batch table.
*
* This is part of the Drupal 5.x to 6.x migration.
*/
function update_create_batch_table() {
// If batch table exists, update is not necessary
if (db_table_exists('batch')) {
return;
}
$schema['batch'] = array(
'fields' => array(
'bid' => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE),
'token' => array('type' => 'varchar', 'length' => 64, 'not null' => TRUE),
'timestamp' => array('type' => 'int', 'not null' => TRUE),
'batch' => array('type' => 'text', 'not null' => FALSE, 'size' => 'big')
),
'primary key' => array('bid'),
'indexes' => array('token' => array('token')),
);
$ret = array();
db_create_table($ret, 'batch', $schema['batch']);
return $ret;
}
ob_start();
$_REQUEST['op'] = 'info';
include_once("update.php");
ob_end_clean();
function update_main() {
// Minimum load of components.
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_CONFIGURATION);
require_once './includes/install.inc';
require_once './includes/file.inc';
require_once './modules/system/system.install';
// Load module basics.
include_once './includes/module.inc';
$module_list['system']['filename'] = 'modules/system/system.module';
$module_list['filter']['filename'] = 'modules/filter/filter.module';
module_list(TRUE, FALSE, FALSE, $module_list);
drupal_load('module', 'system');
drupal_load('module', 'filter');
// Set up $language, since the installer components require it.
drupal_init_language();
// Set up theme system for the maintenance page.
drupal_maintenance_theme();
// Check the update requirements for Drupal.
update_check_requirements();
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_FULL);
drupal_maintenance_theme();
// This must happen *after* drupal_bootstrap(), since it calls
// variable_(get|set), which only works after a full bootstrap.
provision_drupal_install_log(update_create_batch_table());
// Turn error reporting back on. From now on, only fatal errors (which are
// not passed through the error handler) will cause a message to be printed.
ini_set('display_errors', TRUE);
include_once './includes/install.inc';
include_once './includes/batch.inc';
drupal_load_updates();
......@@ -54,7 +350,7 @@ function update_main() {
$updates = drupal_get_schema_versions($module);
$max_version = max($updates);
if ($version <= $max_version) {
drush_log(pt('Updating module @module from schema version @start to schema version @max', array('@module' => $module, '@start' => $version - 1, '@max' => $max_version)));
drush_log(dt('Updating module @module from schema version @start to schema version @max', array('@module' => $module, '@start' => $version - 1, '@max' => $max_version)));
foreach ($updates as $update) {
if ($update >= $version) {
$operations[] = array('_update_do_one', array($module, $update));
......@@ -62,7 +358,7 @@ function update_main() {
}
}
else {
drush_log(pt('No updates for module @module', array('@module' => $module)));
drush_log(dt('No updates for module @module', array('@module' => $module)));
}
}
$batch = array(
......@@ -78,7 +374,7 @@ function update_main() {
batch_process();
}
else {
drush_log(pt('No outstanding updates'));
drush_log(dt('No outstanding updates'));
}
}
......
......@@ -121,7 +121,7 @@ function install_mail($key, &$message, $params) {
function install_main() {
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_CONFIGURATION);
// This must go after drupal_bootstrap(), which unsets globals!
global $profile, $install_locale, $client_email, $conf, $url;
......@@ -231,7 +231,7 @@ function install_main() {
$modules = array_diff(drupal_get_profile_modules($profile, $install_locale), array('system'));
drupal_install_init_database();
drush_drupal_bootstrap_full();
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_FULL);
/**
* Further installation tasks
......
......@@ -2,7 +2,7 @@
// $Id$
$new_url = drush_get_option('site_url');
$old_url = drush_get_option('old_site_url');
$old_url = drush_get_option('site_url', 'site');
/**
......
......@@ -6,8 +6,8 @@
* Enable a site that has been disabled
*/
function provision_drupal_provision_enable_validate() {
_provision_drupal_url_required();
_provision_drupal_valid_installed_site();
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_SITE);
}
function provision_drupal_post_enable() {
......
......@@ -18,7 +18,7 @@ function provision_drupal_provision_import_validate() {
* Import the information about the existing site, and return it in the $data context array
*/
function provision_drupal_provision_import($url = NULL) {
provision_internal_init($url);
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_FULL);
provision_platform_include(dirname(__FILE__), 'import');
}
......@@ -15,8 +15,9 @@
* Check that we are trying to install a new site , and a new site only
*/
function provision_drupal_provision_install_validate() {
_provision_drupal_url_required();
_provision_drupal_valid_not_installed_site();
if (drush_get_option('installed')) {
drush_set_error(PROVISION_SITE_INSTALLED);
}
}
/**
......@@ -36,8 +37,9 @@ function provision_drupal_provision_pre_install($url) {
function provision_drupal_provision_install($url) {
// Requires at least the database settings to complete.
_provision_drupal_create_settings_file($url);
provision_internal_init($url, FALSE);
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_SITE);
provision_platform_include(dirname(__FILE__), 'install');
drush_set_option('installed', TRUE, 'site');
}
/**
......
......@@ -24,8 +24,7 @@
* Make sure we have a valid site being migrated, and that the file being migrated from exists
*/
function provision_drupal_provision_migrate_validate($url = null, $platform = null) {
_provision_drupal_url_required();
_provision_drupal_valid_installed_site();
drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_SITE);
}
/**
......
......@@ -47,10 +47,16 @@ function provision_drupal_drush_help($section) {
* for populating the $data context array
*/
function provision_drupal_provision_init($url = NULL) {
if ($url) {
drush_set_option('site_url', $url);
provision_get_site_data($url); // load the existing site's context into the system.
drush_set_option('uri' , 'http://' . $url);
provision_load_site_data($url);
drush_set_default('site_url', $url);
drush_set_default('profile', 'default');
drush_set_default('language', 'en');
drush_set_default('aliases', array());
}
define('PROVISION_CONTEXT_SITE', ($url) ? TRUE : FALSE);
define('PROVISION_CONTEXT_PLATFORM', !PROVISION_CONTEXT_SITE);
}
......@@ -63,9 +69,11 @@ function provision_drupal_provision_init($url = NULL) {
* files for future runs.
*/
function provision_drupal_provision_finalize($url = NULL) {
if (PROVISION_CONTEXT_SITE) {
if (drush_get_option('installed')) {
drush_set_option('site_url', drush_get_option('site_url'), 'site');
drush_set_option('site_id', drush_get_option('site_id'), 'site');
provision_save_site_data($url);
}
}
......@@ -244,7 +252,8 @@ function _provision_drupal_create_directories($url, $profi