? 650292_features_limit_export_options.patch
Index: features.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/features/features.admin.inc,v
retrieving revision 1.1.2.43
diff -u -p -r1.1.2.43 features.admin.inc
--- features.admin.inc	6 Feb 2010 02:59:05 -0000	1.1.2.43
+++ features.admin.inc	7 Feb 2010 06:23:33 -0000
@@ -97,7 +97,7 @@ function features_export_form($form_stat
       $component = 'dependencies';
     }
     else {
-      $options = features_invoke($component, 'features_export_options');
+      $options = features_invoke($component, 'features_export_options', isset($feature->name) ? $feature->name : NULL);
       $default_value = !empty($feature->info['features'][$component]) ? $feature->info['features'][$component] : array();
     }
     if ($options) {
Index: includes/features.ctools.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/features/includes/Attic/features.ctools.inc,v
retrieving revision 1.1.2.16
diff -u -p -r1.1.2.16 features.ctools.inc
--- includes/features.ctools.inc	6 Feb 2010 02:16:45 -0000	1.1.2.16
+++ includes/features.ctools.inc	7 Feb 2010 06:23:34 -0000
@@ -14,7 +14,7 @@ foreach (_ctools_features_get_info() as 
     $code .= 'function '. $component .'_features_export($data, &$export, $module_name = "") { return ctools_component_features_export("'. $component .'", $data, $export, $module_name); }';
   }
   if (!function_exists("{$component}_features_export_options")) {
-    $code .= 'function '. $component .'_features_export_options() { return ctools_component_features_export_options("'. $component .'"); }';
+    $code .= 'function '. $component .'_features_export_options($module = NULL) { return ctools_component_features_export_options("'. $component .'", $module); }';
   }
   if (!function_exists("{$component}_features_export_render")) {
     $code .= 'function '. $component .'_features_export_render($module = "foo", $data) { return ctools_component_features_export_render("'. $component .'", $module, $data); }';
@@ -103,7 +103,7 @@ function ctools_component_features_api($
 /**
  * Master implementation of hook_features_export_options() for all ctools components.
  */
-function ctools_component_features_export_options($component) {
+function ctools_component_features_export_options($component, $module = NULL) {
   $options = array();
 
   ctools_include('export');
@@ -119,6 +119,19 @@ function ctools_component_features_expor
     else if ($objects = ctools_export_load_object($component, 'all')) {
       $options = drupal_map_assoc(array_keys($objects));
     }
+
+    // Exclude all default or disabled objects besides those that already belong
+    // to the current feature.
+    $exclude = array();
+    foreach (ctools_export_load_object($component, 'all') as $name => $object) {
+      if ($object->export_type | EXPORT_IN_DATABASE || !empty($object->disabled)) {
+        $exclude[] = $name;
+      }
+    }
+    if (!empty($module) && ($feature = features_get_features($module)) && !empty($feature->info['features'][$component])) {
+      $exclude = array_diff($exclude, $feature->info['features'][$component]);
+    }
+    $options = drupal_map_assoc(array_diff($options, $exclude));
   }
   ksort($options);
   return $options;
Index: includes/features.filter.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/features/includes/Attic/features.filter.inc,v
retrieving revision 1.1.2.9
diff -u -p -r1.1.2.9 features.filter.inc
--- includes/features.filter.inc	7 Feb 2010 05:12:08 -0000	1.1.2.9
+++ includes/features.filter.inc	7 Feb 2010 06:23:34 -0000
@@ -14,6 +14,31 @@ function filter_features_api() {
 }
 
 /**
+ * Implementation of hook_features_export_options().
+ */
+function filter_features_export_options($module = NULL) {
+  // Exclude all default formats from export options besides those that
+  // already belong to the current feature.
+  $exclude = array();
+  if (($defaults = module_invoke_all('filter_default_formats')) && !empty($defaults)) {
+    foreach ($defaults as $format) {
+      $exclude[] = $format['name'];
+    }
+    if (isset($module) && ($feature = features_get_features($module)) && !empty($feature->info['features']['filter'])) {
+      $exclude = array_diff($exclude, $feature->info['features']['filter']);
+    }
+  }
+
+  $options = array();
+  foreach (_filter_get_formats() as $format) {
+    if (!in_array($format['name'], $exclude, TRUE)) {
+      $options[$format['name']] = $format['name'];
+    }
+  }
+  return $options;
+}
+
+/**
  * Implementation of hook_features_export().
  */
 function filter_features_export($data, &$export, $module_name = '') {
Index: includes/features.imagecache.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/features/includes/features.imagecache.inc,v
retrieving revision 1.1.2.13
diff -u -p -r1.1.2.13 features.imagecache.inc
--- includes/features.imagecache.inc	21 Dec 2009 22:26:17 -0000	1.1.2.13
+++ includes/features.imagecache.inc	7 Feb 2010 06:23:34 -0000
@@ -16,10 +16,24 @@ function imagecache_features_api() {
 /**
  * Implementation of hook_features_export_options().
  */
-function imagecache_features_export_options() {
+function imagecache_features_export_options($module = NULL) {
+  // Exclude all default presets from export options besides those that
+  // already belong to the current feature.
+  $exclude = array();
+  if (($defaults = module_invoke_all('imagecache_default_presets')) && !empty($defaults)) {
+    foreach ($defaults as $preset) {
+      $exclude[] = $preset['presetname'];
+    }
+    if (isset($module) && ($feature = features_get_features($module)) && !empty($feature->info['features']['imagecache'])) {
+      $exclude = array_diff($exclude, $feature->info['features']['imagecache']);
+    }
+  }
+
   $options = array();
   foreach (imagecache_presets() as $preset) {
-    $options[$preset['presetname']] = $preset['presetname'];
+    if (!in_array($preset['presetname'], $exclude, TRUE)) {
+      $options[$preset['presetname']] = $preset['presetname'];
+    }
   }
   return $options;
 }
Index: includes/features.menu.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/features/includes/features.menu.inc,v
retrieving revision 1.1.2.6
diff -u -p -r1.1.2.6 features.menu.inc
--- includes/features.menu.inc	18 Nov 2009 04:36:36 -0000	1.1.2.6
+++ includes/features.menu.inc	7 Feb 2010 06:23:34 -0000
@@ -16,11 +16,25 @@ function menu_features_api() {
 /**
  * Implementation of hook_features_export_options().
  */
-function menu_features_export_options() {
+function menu_features_export_options($module = NULL) {
+  // Exclude all default menu items from export options besides those that
+  // already belong to the current feature.
+  $exclude = array();
+  if (($defaults = module_invoke_all('menu_default_items')) && !empty($defaults)) {
+    foreach ($defaults as $item) {
+      $exclude[] = $item['path'];
+    }
+    if (isset($module) && ($feature = features_get_features($module)) && !empty($feature->info['features']['menu'])) {
+      $exclude = array_diff($exclude, $feature->info['features']['menu']);
+    }
+  }
+
   $options = array();
   $result = db_query("SELECT * FROM {menu_links} WHERE menu_name = 'features' AND depth = 1");
   while ($row = db_fetch_array($result)) {
-    $options[$row['link_path']] = $row['link_title'];
+    if (!in_array($row['link_path'], $exclude, TRUE)) {
+      $options[$row['link_path']] = $row['link_title'];
+    }
   }
   return $options;
 }
Index: includes/features.node.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/features/includes/features.node.inc,v
retrieving revision 1.1.2.17
diff -u -p -r1.1.2.17 features.node.inc
--- includes/features.node.inc	7 Feb 2010 05:04:43 -0000	1.1.2.17
+++ includes/features.node.inc	7 Feb 2010 06:23:34 -0000
@@ -18,8 +18,24 @@ function node_features_api() {
 /**
  * Implementation of hook_features_export_options().
  */
-function node_features_export_options() {
-  return node_get_types('names');
+function node_features_export_options($module = NULL) {
+  // Exclude all default node types from export options besides those that
+  // already belong to the current feature.
+  $exclude = array();
+  if (($defaults = module_invoke_all('node_info')) && !empty($defaults)) {
+    $exclude = array_keys($defaults);
+    if (isset($module) && ($feature = features_get_features($module)) && !empty($feature->info['features']['node'])) {
+      $exclude = array_diff($exclude, $feature->info['features']['node']);
+    }
+  }
+
+  $options = array();
+  foreach (node_get_types('names') as $type => $name) {
+    if (!in_array($type, $exclude, TRUE)) {
+      $options[$type] = $name;
+    }
+  }
+  return $options;
 }
 
 /**
Index: includes/features.user.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/features/includes/Attic/features.user.inc,v
retrieving revision 1.1.2.11
diff -u -p -r1.1.2.11 features.user.inc
--- includes/features.user.inc	7 Feb 2010 04:45:22 -0000	1.1.2.11
+++ includes/features.user.inc	7 Feb 2010 06:23:34 -0000
@@ -39,12 +39,26 @@ function user_features_export($data, &$e
 /**
  * Implementation of hook_features_export_options().
  */
-function user_features_export_options() {
+function user_features_export_options($module = NULL) {
   $options = array();
+
+  // Exclude all default permissions from export options besides those that
+  // already belong to the current feature.
+  $exclude = array();
+  $defaults = module_invoke_all('user_default_permissions');
+  if (!empty($defaults)) {
+    foreach ($defaults as $perm) {
+      $exclude[] = $perm['name'];
+    }
+  }
+  if (isset($module) && ($feature = features_get_features($module)) && !empty($feature->info['features']['user'])) {
+    $exclude = array_diff($exclude, $feature->info['features']['user']);
+  }
+
   foreach (module_list() as $module) {
     $prefix = check_plain($module) .': ';
     if ($permissions = module_invoke($module, 'perm')) {
-      foreach ($permissions as $permission) {
+      foreach (array_diff($permissions, $exclude) as $permission) {
         $options[$permission] = $prefix . check_plain($permission);
       }
     }
Index: includes/features.views.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/features/includes/features.views.inc,v
retrieving revision 1.1.2.16
diff -u -p -r1.1.2.16 features.views.inc
--- includes/features.views.inc	21 Dec 2009 22:25:52 -0000	1.1.2.16
+++ includes/features.views.inc	7 Feb 2010 06:23:34 -0000
@@ -18,11 +18,24 @@ function views_features_api() {
 /**
  * Implementation of hook_features_export_options().
  */
-function views_features_export_options() {
+function views_features_export_options($module = NULL) {
   $enabled_views = array();
   $views = views_get_all_views();
+
+  // Exclude all default or disabled Views besides those that already belong
+  // to the current feature.
+  $exclude = array();
+  foreach ($views as $view) {
+    if ($view->type !== t('Normal') || !empty($view->disabled)) {
+      $exclude[] = $view->name;
+    }
+  }
+  if (!empty($module) && ($feature = features_get_features($module)) && !empty($feature->info['features']['views'])) {
+    $exclude = array_diff($exclude, $feature->info['features']['views']);
+  }
+
   foreach ($views as $view) {
-    if (!isset($views[$view->name]->disabled) || !$views[$view->name]->disabled) {
+    if (!in_array($view->name, $exclude, TRUE)) {
       $enabled_views[$view->name] = $view->name;
     }
   }
