diff --git a/features.module b/features.module index fe17e4f..ffac8eb 100644 --- a/features.module +++ b/features.module @@ -237,10 +237,7 @@ function features_theme() { */ function features_flush_caches() { features_rebuild(); - // Don't flush the modules cache during installation, for performance reasons. - if (variable_get('install_task') == 'done') { - features_get_modules(NULL, TRUE); - } + features_get_modules(NULL, TRUE); return array(); } @@ -291,38 +288,26 @@ function features_help($path, $arg) { * Implements hook_modules_disabled(). */ function features_modules_disabled($modules) { - // Go through all modules and gather features that can be disabled. - $items = array(); - foreach ($modules as $module) { - if ($feature = features_load_feature($module)) { - $items[$module] = array_keys($feature->info['features']); + // Find any features modules that were disabled. + if ($modules = array_intersect(array_keys(features_get_features()), $modules)) { + foreach ($modules as $module) { + features_disable_feature($module); } } - - if (!empty($items)) { - _features_restore('disable', $items); - // Rebuild the list of features includes. - features_include(TRUE); - } } /** * Implements hook_modules_enabled(). */ function features_modules_enabled($modules) { - // Go through all modules and gather features that can be enabled. - $items = array(); - foreach ($modules as $module) { - if ($feature = features_load_feature($module)) { - $items[$module] = array_keys($feature->info['features']); + // Find any features modules that were enabled. + if ($modules = array_intersect(array_keys(features_get_features()), $modules)) { + foreach ($modules as $module) { + features_enable_feature($module); } } - - if (!empty($items)) { - _features_restore('enable', $items); - // Rebuild the list of features includes. - features_include(TRUE); - } + // Make sure any new files are included now that a new module is enabled. + features_include(TRUE); } /** @@ -409,46 +394,7 @@ function features_include_defaults($components = NULL, $reset = FALSE) { * Feature object loader. DEPRECATED but included for backwards compatibility */ function feature_load($name, $reset = FALSE) { - return features_load_feature($name, $reset); -} - -/** - * Feature object loader. - */ -function features_load_feature($name, $reset = FALSE) { - // Use an alternative code path during installation, for better performance. - if (variable_get('install_task') != 'done') { - static $features; - - if (!isset($features[$name])) { - // Set defaults for module info. - $defaults = array( - 'dependencies' => array(), - 'description' => '', - 'package' => 'Other', - 'version' => NULL, - 'php' => DRUPAL_MINIMUM_PHP, - 'files' => array(), - 'bootstrap' => 0, - ); - $info = drupal_parse_info_file(drupal_get_path('module', $name) . '/' . $name . '.info'); - - $features[$name] = FALSE; - if (!empty($info['features']) && empty($info['hidden'])) { - // Build a fake file object with the data needed during installation. - $features[$name] = new stdClass; - $features[$name]->name = $name; - $features[$name]->filename = drupal_get_path('module', $name) . '/' . $name . '.module'; - $features[$name]->type = 'module'; - $features[$name]->info = $info + $defaults; - } - } - - return $features[$name]; - } - else { - return features_get_features($name, $reset); - } + return features_get_features($name, $reset); } /** @@ -919,6 +865,24 @@ function features_rebuild($rebuild = array()) { } /** + * Wrapper around _features_restore(). + */ +function features_disable_feature($module) { + $feature = feature_load($module); + $items[$module] = array_keys($feature->info['features']); + return _features_restore('disable', $items); +} + +/** + * Wrapper around _features_restore(). + */ +function features_enable_feature($module) { + $feature = feature_load($module); + $items[$module] = array_keys($feature->info['features']); + return _features_restore('enable', $items); +} + +/** * Utility functions ================================================== */ diff --git a/includes/features.user.inc b/includes/features.user.inc index 77f025b..d25054e 100644 --- a/includes/features.user.inc +++ b/includes/features.user.inc @@ -81,7 +81,7 @@ function user_permission_features_export_render($module, $data) { $permission['name'] = $perm_name; if (!empty($permissions[$perm_name])) { sort($permissions[$perm_name]); - $permission['roles'] = drupal_map_assoc($permissions[$perm_name]); + $permission['roles'] = $permissions[$perm_name]; } else { $permission['roles'] = array(); diff --git a/tests/features.test b/tests/features.test index 9c65aae..8da66a3 100644 --- a/tests/features.test +++ b/tests/features.test @@ -280,53 +280,3 @@ public function testModuleEnable() { } } } - -/** - * Tests Features' Drush integration. - */ -class FeaturesDrushExportTest extends DrupalWebTestCase { - protected $profile = 'testing'; - - /** - * Test info. - */ - public static function getInfo() { - return array( - 'name' => t('Drush integration'), - 'description' => t('Run tests on Features\' `drush` commands.'), - 'group' => t('Features'), - ); - } - - /** - * Set up test. - */ - public function setUp() { - parent::setUp(array('features')); - } - - /** - * Test features-export command when module is not present. - */ - public function testModuleExportNew() { - $module = $this->randomName(); - - $stream_wrapper = file_stream_wrapper_get_instance_by_uri("public://$module"); - $destination = $stream_wrapper->getDirectoryPath(); - $directory = "$destination/$module"; - - // Verify the module files are not present. - $module_file_exists = is_dir($directory); - $this->assertFalse($module_file_exists, 'The test module files are not present.'); - - // Run drush command then check that the module was created. - exec("drush fe $module node:page -y --destination=\"$destination\""); - $module_file_exists = is_dir($directory); - $this->assertTrue($module_file_exists, 'The test module has been created'); - - // Verify the component was exported. - $component_exported = is_file("$directory/$module.features.field.inc"); - $this->assertTrue($component_exported, 'The component was exported succesfully.'); - } - -}