? 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,