? 895250-3-features_override-cache.patch
? 931642-features_override-key-fix.patch
? features_override-key-fix.patch
Index: features_override.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/features_override/features_override.module,v
retrieving revision 1.3
diff -u -p -r1.3 features_override.module
--- features_override.module	21 Oct 2010 04:01:20 -0000	1.3
+++ features_override.module	6 Dec 2010 23:10:25 -0000
@@ -97,17 +97,37 @@ function features_override_load_all($res
  * @return
  *   Array of component types.
  */
-function features_override_supported_components($hooks = FALSE) {
+function features_override_supported_components($hooks = FALSE, $reset = FALSE) {
+
+  if ($reset) {
+    cache_clear_all('features_override:components', 'cache');
+  }
+  else {
+    $components = cache_get('features_override:components');
+    if (isset($components) && is_array($compontents)) {
+      return $hooks ? $components : drupal_map_assoc(array_keys($components));
+    }
+  }
   $components = array();
-  // Exclude values can be component types or modules that supply them.
-  $exclude = array('views', 'panels', 'page_manager', 'features_override');
   foreach (features_get_components() as $component => $info) {
-    if (isset($info['default_hook']) && (!isset($info['overridable']) || !empty($info['overridable'])) && !in_array($component, $exclude) && (!isset($component['module']) || !in_array($component['module'], $exclude))) {
-      $components[$component] = $hooks ? $info['default_hook'] : $component;
+    // Don't offer an override for overriding!
+    // Support an 'overridable' property.
+    if (isset($info['default_hook']) && (!isset($info['overridable']) || !empty($info['overridable'])) && (!isset($component['module']) || !$component['module'] != 'features_override')) {
+      $components[$component] = $info['default_hook'];
     }
   }
-  drupal_alter('features_override_supported_components', $components, $hooks);
-  return $components;
+  // Allow modules to alter the compontents before caching.
+  drupal_alter('features_override_supported_components', $components);
+  cache_set('features_override:components', $components);
+
+  return $hooks ? $components : drupal_map_assoc(array_keys($components));
+}
+
+/**
+ * Clear features_override cache on admin/build/modules form.
+ */
+function features_override_form_system_modules_alter(&$form, $form_state) {
+  features_override_supported_components(FALSE, TRUE);
 }
 
 /**
@@ -149,19 +169,19 @@ function features_override_detect_overri
       // Only accept supported components.
       if (in_array($component, features_override_supported_components()) && $state != FEATURES_DEFAULT) {
         $normal = features_get_normal($component, $module->name);
-        $default = features_get_default($component, $module->name);
+        $default = features_get_default($component, $module->name);
         // Can't use _features_sanitize as that resets some keys.
         _features_override_sanitize($normal);
         _features_override_sanitize($default);
         $component_overrides = array();
         foreach ($normal as $name => $properties) {
           $component_overrides[$name] = array('additions' => array(), 'deletions' => array());
-          // TODO: handle the case of added components.
-          if (isset($default[$name])) {
+          // TODO: handle the case of added components.
+          if (isset($default[$name])) {
             _features_override_set_additions($default[$name], $properties, $component_overrides[$name]['additions']);
-            _features_override_set_deletions($default[$name], $properties, $component_overrides[$name]['deletions']);
-          }
-
+            _features_override_set_deletions($default[$name], $properties, $component_overrides[$name]['deletions']);
+          }
+
           if (empty($component_overrides[$name]['additions']) && empty($component_overrides[$name]['deletions'])) {
             unset($component_overrides[$name]);
           }
@@ -175,26 +195,26 @@ function features_override_detect_overri
   }
   return $cache[$module->name];
 }
-
-/**
- * "Sanitizes" an array recursively, performing:
- * - Sort an array by its keys (assoc) or values (non-assoc).
- */
-function _features_override_sanitize(&$array) {
-  if (is_array($array)) {
-    $is_assoc = (array_keys($array) !== range(0, count($array) - 1));
-    if ($is_assoc) {
-      ksort($array);
-    }
-    else {
-      sort($array);
-    }
-    foreach ($array as $k => $v) {
-      if (is_array($v)) {
-        _features_override_sanitize($array[$k]);
-      }
-    }
-  }
+
+/**
+ * "Sanitizes" an array recursively, performing:
+ * - Sort an array by its keys (assoc) or values (non-assoc).
+ */
+function _features_override_sanitize(&$array) {
+  if (is_array($array)) {
+    $is_assoc = (array_keys($array) !== range(0, count($array) - 1));
+    if ($is_assoc) {
+      ksort($array);
+    }
+    else {
+      sort($array);
+    }
+    foreach ($array as $k => $v) {
+      if (is_array($v)) {
+        _features_override_sanitize($array[$k]);
+      }
+    }
+  }
 }
 /**
  * Override standard ctools export to add dependency data.
@@ -234,6 +254,7 @@ function features_override_features_expo
   return $options;
 }
 
+
 /**
  * Export a set of alters.
  *
@@ -278,12 +299,12 @@ function features_override_export($alter
 function _features_override_set_additions($default, $normal, &$additions, $keys = array()) {
   $object = is_object($normal);
   foreach ($normal as $key => $value) {
-    // Don't register extra fields as an override.
-    // The 'content_has_extra_fields' flag is added to indicate that there are added fields.
-    // However, these should simply be added to a feature as fields; they are not an override.
-    if ($key == 'content_has_extra_fields') {
-      return;
-    }
+    // Don't register extra fields as an override.
+    // The 'content_has_extra_fields' flag is added to indicate that there are added fields.
+    // However, these should simply be added to a feature as fields; they are not an override.
+    if ($key == 'content_has_extra_fields') {
+      return;
+    }
     if ($object) {
       if (!isset($default->$key) || ($default->$key != $value && !(is_array($value) || is_object($value)))) {
         $additions[] = array(
@@ -296,7 +317,7 @@ function _features_override_set_addition
       }
     }
     else {
-      if (!isset($default[$key]) || ($default[$key] != $value && !(is_array($value) || is_object($value)))) {
+      if (!isset($default[$key]) || ($default[$key] != $value && !(is_array($value) || is_object($value)))) {
         $additions[] = array(
           'keys' => array_merge($keys, array(array('type' => 'array', 'key' => $key))),
           'value' => $value,
