Index: features.export.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/features/features.export.inc,v retrieving revision 1.1.2.47.2.1 diff -u -p -r1.1.2.47.2.1 features.export.inc --- features.export.inc 7 May 2010 17:11:11 -0000 1.1.2.47.2.1 +++ features.export.inc 9 Sep 2010 20:08:23 -0000 @@ -102,11 +102,16 @@ function _features_export_minimize_depen * Iterates over a list of dependencies and maximize the list of modules. */ function _features_export_maximize_dependencies($dependencies, $module_name = '', $first = TRUE) { - $maximized = $dependencies; + static $maximized; + if($first){ + $maximized = array(); + } + $maximized = array_merge($maximized, $dependencies); foreach ($dependencies as $k => $v) { $module = features_get_modules($v); if ($module && !empty($module->info['dependencies'])) { - $maximized = array_merge($maximized, _features_export_maximize_dependencies($module->info['dependencies'], $module_name, FALSE)); + $moreDependencies = array_diff($module->info['dependencies'], $maximized); + _features_export_maximize_dependencies($moreDependencies, $module_name, FALSE); } } return array_unique($maximized); Index: features.info =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/features/features.info,v retrieving revision 1.1.2.1.2.1 diff -u -p -r1.1.2.1.2.1 features.info --- features.info 7 May 2010 17:11:11 -0000 1.1.2.1.2.1 +++ features.info 9 Sep 2010 20:08:23 -0000 @@ -23,3 +23,10 @@ files[] = includes/features.views.inc files[] = theme/features-admin-components.tpl.php files[] = theme/features-form.tpl.php files[] = theme/theme.inc + +; Information added by drupal.org packaging script on 2010-07-11 +version = "7.x-1.x-dev" +core = "7.x" +project = "features" +datestamp = "1278834211" + Index: features.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/features/features.module,v retrieving revision 1.1.2.63.2.1 diff -u -p -r1.1.2.63.2.1 features.module --- features.module 7 May 2010 17:11:11 -0000 1.1.2.63.2.1 +++ features.module 9 Sep 2010 20:08:23 -0000 @@ -202,7 +202,7 @@ function features_theme() { $items['features_component_key'] = $base; $items['features_component_list'] = array( - 'variables' => array('components' => array(), 'source' => null), + 'variables' => array('components' => array(), 'source' => array()), ) + $base; $items['features_storage_link'] = array( @@ -290,6 +290,14 @@ function features_permission() { } /** + * Implements hook_hook_info(). + */ +function features_hook_info() { + $info['features_api'] = array('group' => 'features_api'); + return $info; +} + +/** * Load includes for any modules that implement the features API and * load includes for those provided by features. */ Index: includes/features.field.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/features/includes/Attic/features.field.inc,v retrieving revision 1.1.2.1 diff -u -p -r1.1.2.1 features.field.inc --- includes/features.field.inc 7 May 2010 17:11:11 -0000 1.1.2.1 +++ includes/features.field.inc 9 Sep 2010 20:08:23 -0000 @@ -18,20 +18,20 @@ function field_features_export($data, &$ // The field_default_fields() hook integration is provided by the // features module so we need to add it as a dependency. $export['dependencies']['features'] = 'features'; - - // Collect a module to style map + + // Collect a module to style map $map = array(); $modules = module_implements('field_default_fields'); foreach ($modules as $module) { $fields = module_invoke($module, 'field_default_fields'); foreach ($fields as $name => $field) { - $map["{$field['bundle']}-{$field['field_name']}"] = $module; + $instance = reset($field['field_instance']); + $map["{$instance['entity_type']}-{$instance['bundle']}-{$field['field_config']['field_name']}"] = $module; } } - foreach ($data as $instance) { - list($bundle, $field) = explode('-', $instance); + list($entity_type, $bundle, $field) = explode('-', $instance); // If this field is already provided by another module, remove the field // and add the other module as a dependency. if (isset($map[$instance]) && $map[$instance] != $module_name) { @@ -46,7 +46,7 @@ function field_features_export($data, &$ $export['features']['field'][$instance] = $instance; - $field_info = field_info_field($field); + $field_info = field_info_field($field); if ($field_info) { $export['dependencies'][$field_info['module']] = $field_info['module']; @@ -54,11 +54,12 @@ function field_features_export($data, &$ $export['dependencies'][$storage_module] = $storage_module; } - $instance_info = field_info_instance('node', $field, $bundle); + $instance_info = field_info_instance($entity_type, $field, $bundle); if ($instance_info) { $export['dependencies'][$instance_info['widget']['module']] = $instance_info['widget']['module']; foreach ($instance_info['display'] as $key => $display) { - $export['dependencies'][$display['module']] = $display['module']; + $module = (isset($display['module']))? $display['module'] : NULL; + $export['dependencies'][$module] = $module; // todo : handle the pipe to image styles } @@ -70,22 +71,33 @@ function field_features_export($data, &$ /** * Implementation of hook_features_export_render(). */ -function field_features_export_render($module = 'foo', $data) { +function field_features_export_render($module, $data) { $translatables = $code = array(); $code[] = ' $fields = array();'; $code[] = ''; + $i = 0; foreach ($data as $instance) { - list($bundle, $field_name) = explode('-', $instance); - - $field = field_info_field($field_name); + list($entity_type, $bundle, $field_name) = explode('-', $instance); + $field = field_info_field($field_name); + if (!$field) { + // Outch - something is wrong :| + // Jump to next field to keep the code clean + continue; + } + unset($field['columns']); unset($field['locked']); unset($field['storage']); + $dataArray = array( + 'field_config' => $field, + 'field_instance' => field_info_instance($entity_type, $field_name, $bundle), + ); + $code[] = ' // Exported field: ' . $field_name; - $code[] = ' $fields[] = ' . features_var_export($field, ' ') . ';'; + $code[] = ' $fields[] = ' . features_var_export($dataArray, ' ') . ';'; $code[] = ''; // Add any labels to translatables array. @@ -119,23 +131,74 @@ function field_features_rebuild($module) field_info_cache_clear(); foreach ($fields as $field) { - $existing_field = field_info_field($field['field_name']); - if ($existing_field) { - field_update_field($field); + // Legacy handling + if (!isset($field['field_config'])) { + _legacy_field_features_rebuild($field); + variable_set('menu_rebuild_needed', TRUE); + continue; + } + $field_config = $field['field_config']; + $field_instance = $field['field_instance']; + + $existing_field = field_info_field($field_config['field_name']); + + unset($field_config['id']);// Make sure no foreign field is overwritten + if (!empty($existing_field)) { + field_update_field($field_config); } else { - field_create_field($field); + field_create_field($field_config); } - $existing_instance = field_info_instance($field['entity_type'], $field['type_name'], $field['bundle']); - if ($existing_instance) { - field_update_instance($field); - } - else { - field_create_instance($field); + unset($field_instance['id']);// Make sure no foreign field is overwritten + $instance = field_info_instance( + $field_instance['entity_type'], + $field_instance['field_name'], + $field_instance['bundle'] + ); + + if ($instance) { + field_update_instance($instance); + } else { + field_create_instance($field_instance); } + variable_set('menu_rebuild_needed', TRUE); } } } +/** + * Legacy method to support the former dev release format + * @TODO Is this really necessary - should be removed before the first beta/RC release + */ +function _legacy_field_features_rebuild($field) { + + $existing_field = field_info_field($field['field_name']); + unset($field['id']); + if (!empty($existing_field)) { + field_update_field($field); + } + else { + field_create_field($field); + } + + // update/create field instances + if (!empty($field['bundles'])) { + foreach ($field['bundles'] as $entity_type => $bundles) { + if (is_array($bundles)) { + foreach ($bundles as $bundle) { + $instance = field_info_instance($entity_type, $field['field_name'], $bundle); + if ($instance) { + field_update_instance($instance); + } + else { + $field['entity_type'] = $entity_type; + $field['bundle'] = $bundle; + field_create_instance($field); + } + } + } + } + } +} -\ No newline at end of file Index: includes/features.node.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/features/includes/features.node.inc,v retrieving revision 1.1.2.17.2.1 diff -u -p -r1.1.2.17.2.1 features.node.inc --- includes/features.node.inc 7 May 2010 17:11:11 -0000 1.1.2.17.2.1 +++ includes/features.node.inc 9 Sep 2010 20:08:23 -0000 @@ -43,8 +43,6 @@ function node_features_export($data, &$e } } - - foreach ($data as $type) { // Poll node module to determine who provides the node type. if ($info = $type_map[$type]->base) { @@ -63,13 +61,10 @@ function node_features_export($data, &$e $fields = field_info_instances('node', $type); foreach ($fields as $name => $field) { - $pipe['field'][] = "{$field['bundle']}-{$field['field_name']}"; - } - + $pipe['field'][] = "node-{$field['bundle']}-{$field['field_name']}"; + } } } - - return $pipe; } @@ -83,8 +78,6 @@ function node_features_export_render($mo 'description' => TRUE, 'has_title' => FALSE, 'title_label' => TRUE, - 'has_body' => FALSE, - 'body_label' => TRUE, 'help' => TRUE, ); $output = array();