Index: features.admin.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/features/features.admin.inc,v retrieving revision 1.1.2.33 diff -u -p -r1.1.2.33 features.admin.inc --- features.admin.inc 6 Nov 2009 21:30:50 -0000 1.1.2.33 +++ features.admin.inc 7 Nov 2009 14:37:29 -0000 @@ -523,24 +523,47 @@ function features_form_submit(&$form, &$ $form_state['redirect'] = 'admin/build/features/cleanup/clear'; if (!empty($features)) { - foreach ($features as $name => $feature) { - // Enable feature - if ($form_state['values']['status'][$name] && !module_exists($name)) { - if (!empty($feature->info['dependencies'])) { - $dependencies = _features_export_maximize_dependencies($feature->info['dependencies']); - foreach ($dependencies as $dependency) { - if (!module_exists($dependency)) { - $install[] = $dependency; - } + $status = $form_state['values']['status']; + $install = array_keys($status, 1); + $disable = array_keys($status, 0); + + features_features_install($install, $features); + module_disable($disable); + } +} + +/** + * Enables and installs an array of features, ignoring those + * already enabled & installed. + * + * @param $install + * An array of features to install + * @param $features + * Optional array of all features. + */ +function features_features_install($install, $features = NULL) { + if (is_null($features)) { + // Clear & rebuild key caches + module_rebuild_cache(); + features_rebuild(); + + $features = features_get_features('', TRUE); + } + foreach ($install as $key => $name) { + // Check to make sure the feature exists and isn't already enabled. + if (($feature = $features[$name]) && !module_exists($name)) { + if (!empty($feature->info['dependencies'])) { + $dependencies = _features_export_maximize_dependencies($feature->info['dependencies']); + foreach ($dependencies as $dependency) { + if (!module_exists($dependency)) { + $install[] = $dependency; } } - $install[] = $name; - } - // Disable feature - else if (!$form_state['values']['status'][$name] && module_exists($name)) { - $disable[] = $name; } } + else { + unset($install[$key]); + } if (!empty($install)) { $install = array_unique($install); @@ -550,9 +573,6 @@ function features_form_submit(&$form, &$ include_once './includes/install.inc'; drupal_install_modules($install); } - if (!empty($disable)) { - module_disable($disable); - } } }