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);
-    }
   }
 }
 
