=== modified file 'modules/update/update.compare.inc'
--- modules/update/update.compare.inc	2009-09-29 16:30:29 +0000
+++ modules/update/update.compare.inc	2009-10-05 05:25:00 +0000
@@ -81,7 +81,21 @@ function update_get_projects() {
  */
 function _update_process_info_list(&$projects, $list, $project_type, $status) {
   foreach ($list as $file) {
-    if ($file->status != $status) {
+    // A disabled base theme of an enabled sub-theme still has all of its code
+    // run by the sub-theme, so we include it in our "enabled" projects list.
+    if ($status && !$file->status && !empty($file->sub_themes)) {
+      foreach ($file->sub_themes as $key => $name) {
+        // Build a list of enabled sub-themes.
+        if ($list[$key]->status) {
+          $file->enabled_sub_themes[$key] = $name;
+        }
+      }
+      if (empty($file->enabled_sub_themes)) {
+        continue;
+      }
+    }
+    // Otherwise, just add projects of the proper status to our list.
+    elseif ($file->status != $status) {
       continue;
     }
 
@@ -137,6 +151,19 @@ function _update_process_info_list(&$pro
       // If we're processing disabled modules or themes, append a suffix.
       $project_display_type .= '-disabled';
     }
+    // Add a list of sub-themes that "depend on" the project and a list of base
+    // themes that are "required by" the project.
+    if ($project_name == 'drupal') {
+      // Drupal core is always required, so this extra info would just be noise.
+      $sub_themes = array();
+      $base_themes = array();
+    }
+    else {
+      // Add list of enabled sub-themes.
+      $sub_themes =  !empty($file->enabled_sub_themes) ? $file->enabled_sub_themes : array();
+      // Add list of base themes.
+      $base_themes = !empty($file->base_themes) ? $file->base_themes : array();
+    }
     if (!isset($projects[$project_name])) {
       // Only process this if we haven't done this project, since a single
       // project can have multiple modules or themes.
@@ -147,6 +174,8 @@ function _update_process_info_list(&$pro
         'includes' => array($file->name => $file->info['name']),
         'project_type' => $project_display_type,
         'project_status' => $status,
+        'sub_themes' => $sub_themes,
+        'base_themes' => $base_themes,
       );
     }
     elseif ($projects[$project_name]['project_type'] == $project_display_type) {
@@ -158,6 +187,8 @@ function _update_process_info_list(&$pro
       $projects[$project_name]['includes'][$file->name] = $file->info['name'];
       $projects[$project_name]['info']['_info_file_ctime'] = max($projects[$project_name]['info']['_info_file_ctime'], $file->info['_info_file_ctime']);
       $projects[$project_name]['datestamp'] = max($projects[$project_name]['datestamp'], $file->info['datestamp']);
+      $projects[$project_name]['sub_themes'] = array_merge($projects[$project_name]['sub_themes'], $sub_themes);
+      $projects[$project_name]['base_themes'] = array_merge($projects[$project_name]['base_themes'], $base_themes);
     }
     elseif (empty($status)) {
       // If we have a project_name that matches, but the project_display_type

=== modified file 'modules/update/update.report.inc'
--- modules/update/update.report.inc	2009-10-05 02:26:36 +0000
+++ modules/update/update.report.inc	2009-10-05 08:10:07 +0000
@@ -194,6 +194,20 @@ function theme_update_report($data) {
     }
     $row .= "</div>\n";
 
+    if (!empty($project['base_themes'])) {
+      $row .= '<div class="basethemes">';
+      sort($project['base_themes']);
+      $row .= t('Depends on: %basethemes', array('%basethemes' => implode(', ', $project['base_themes'])));
+      $row .= "</div>\n";
+    }
+
+    if (!empty($project['sub_themes'])) {
+      $row .= '<div class="subthemes">';
+      sort($project['sub_themes']);
+      $row .= t('Required by: %subthemes', array('%subthemes' => implode(', ', $project['sub_themes'])));
+      $row .= "</div>\n";
+    }
+
     $row .= "</div>\n"; // info div.
 
     if (!isset($rows[$project['project_type']])) {

