Index: release/project_release.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.module,v
retrieving revision 1.59
diff -u -p -r1.59 project_release.module
--- release/project_release.module	9 Feb 2008 00:26:36 -0000	1.59
+++ release/project_release.module	16 Feb 2008 17:24:23 -0000
@@ -1552,9 +1552,9 @@ function theme_project_release_project_d
     return;
   }
   $output = '<h3>'. t('Releases') .'</h3>';
-  $output .= project_release_table($node, 'recommended', 'official', t('Official releases'));
+  $output .= project_release_table($node, 'supported', 'official', t('Official releases'));
   if ($node->snapshot_table) {
-    $output .= project_release_table($node, 'recommended', 'snapshot', t('Development snapshots'));
+    $output .= project_release_table($node, 'supported', 'snapshot', t('Development snapshots'));
   }
   return $output;
 }
@@ -1604,6 +1604,7 @@ function theme_project_release_table_ove
  * @param $table_type
  *   Indicates what kind of table should be generated. Possible options:
  *    'recommended': Only show the current recommended versions.
+ *    'supported': Only show the latest release from each supported branch.
  *    'all': Include all releases.
  *
  * @param $release_type
@@ -1641,9 +1642,17 @@ function project_release_table($project,
     }
   }
 
-  if ($table_type == 'recommended') {
+  if ($table_type == 'supported' || $table_type == 'recommended') {
     if ($tids) {
-      $join .= ' INNER JOIN {project_release_supported_versions} prsv ON prsv.nid = r.pid AND prsv.tid = tn.tid AND prsv.major = r.version_major AND prsv.recommended = 1 ';
+      $selects[] = 'prsv.recommended';
+      $selects[] = 'prsv.snapshot';
+      $join .= ' INNER JOIN {project_release_supported_versions} prsv ON prsv.nid = r.pid AND prsv.tid = tn.tid AND prsv.major = r.version_major AND ';
+      if ($table_type == 'recommended') {
+        $join .= 'prsv.recommended = 1 ';
+      }
+      else {
+        $join .= 'prsv.supported = 1 ';
+      }
     }
     else {
       // TODO
@@ -1671,15 +1680,15 @@ function project_release_table($project,
   $orderby[] = 'r.file_date';
 
   if ($orderby) {
-    $order_by = ' ORDER BY '. implode(', ', $orderby);
+    $order_by = ' ORDER BY '. implode(' DESC,', $orderby);
   }
   if ($selects) {
     $select = implode(', ', $selects) .',';
   }
   $result = db_query(db_rewrite_sql(
     "SELECT n.nid, n.created, $select r.* FROM {node} n ".
-    "INNER JOIN {project_release_nodes} r ON r.nid = n.nid ". $join .
-    "WHERE (r.pid = %d) AND (n.status = 1) ". $where .' '. $order_by),
+    "INNER JOIN {project_release_nodes} r ON r.nid = n.nid $join ".
+    "WHERE (r.pid = %d) AND (n.status = 1) $where $order_by"),
     $project->nid);
 
   if (!db_num_rows($result) && $release_type != 'official' && $tids) {
@@ -1693,51 +1702,90 @@ function project_release_table($project,
 
   $items = array();
   $can_edit = node_access('update', $project);
+  $stable_version = FALSE;
+  $added_majors = array();
+  $icons = array(
+    'ok' => theme('image', 'misc/watchdog-ok.png', t('ok'), t('ok')),
+    'warning' => theme('image', 'misc/watchdog-warning.png', t('warning'), t('warning')),
+    'error' => theme('image', 'misc/watchdog-error.png', t('error'), t('error')),
+  );
 
   while ($release = db_fetch_object($result)) {
-    $links = array();
-    if (!empty($release->file_path)) {
-      $links['project_release_download'] = theme('project_release_download_link', $release->file_path, t('Download'), TRUE);
-    }
-    $links['project_release_notes'] = array(
-      'title' => t('Release notes'),
-      'href' => "node/$release->nid",
-    );
-    if ($can_edit) {
-      $links['project_release_edit'] = array(
-        'title' => t('Edit'),
-        'href' => "node/$release->nid/edit",
+    if ((!isset($added_majors[$release->tid][$release->version_major]) && ((!$release->snapshot && !$release->rebuild) || ($release->snapshot && $release->rebuild))) && !($recommended && !$release->recommended)) {
+      $links = array();
+      if (!empty($release->file_path)) {
+        $links['project_release_download'] = theme('project_release_download_link', $release->file_path, t('Download'), TRUE);
+      }
+      $links['project_release_notes'] = array(
+        'title' => t('Release notes'),
+        'href' => "node/$release->nid",
       );
-    }
-    if (!isset($items[$release->tid]) || !is_array($items[$release->tid])) {
-      $items[$release->tid] = array();
-    }
-
-    $row = array(
-      // class of <tr>
-      'class' => $release->rebuild ? 'release-dev' : 'release',
-      'data' => array(
-        array(
-          'class' => 'release-title',
-          'data' => l($release->version, "node/$release->nid"),
-        ),
-        array(
-          'class' => 'release-date',
-          'data' => !empty($release->file_path) ? format_date($release->file_date, 'custom', 'Y-M-d') : format_date($release->created, 'custom', 'Y-M-d'),
+      if ($can_edit) {
+        $links['project_release_edit'] = array(
+          'title' => t('Edit'),
+          'href' => "node/$release->nid/edit",
+        );
+      }
+      if (!isset($items[$release->tid]) || !is_array($items[$release->tid])) {
+        $items[$release->tid] = array();
+      }
+      $classification = ($release->rebuild ? 'error' : ($release->recommended ? 'ok' : 'warning'));
+      if ($classification == 'ok') {
+        $stable_version = TRUE;
+      }
+      $row = array(
+        // class of <tr>
+        'class' => ($release->rebuild ? 'release-dev ' : 'release ') . $classification,
+        'data' => array(
+          array(
+            'class' => 'release-title',
+            'data' => l($release->version, "node/$release->nid"),
+          ),
+          array(
+            'class' => 'release-date',
+            'data' => !empty($release->file_path) ? format_date($release->file_date, 'custom', 'Y-M-d') : format_date($release->created, 'custom', 'Y-M-d'),
+          ),
         ),
-      ),
-    );
-    if ($print_size) {
+      );
+      if ($print_size) {
+        $row['data'][] = array(
+          'class' => 'release-size',
+          'data' => !empty($release->file_path) ? format_size(filesize(file_create_path($release->file_path))) : t('n/a'),
+        );
+      }
+      $row['data'][] = array(
+        'class' => 'release-links',
+        'data' => theme('links', $links),
+      );
+      $reason = '';
+      switch ($classification) {
+        case 'ok':
+          $reason = t('Recommended release');
+          break;
+        case 'warning':
+          if ($stable_version) {
+            $reason = t('Supported release');
+          }
+          else {
+            // @TODO: Make a better message here.
+            $reason = t('Supported release');
+          }
+          break;
+        case 'error':
+          $reason = t('Development release');
+          break;
+      }
       $row['data'][] = array(
-        'class' => 'release-size',
-        'data' => !empty($release->file_path) ? format_size(filesize(file_create_path($release->file_path))) : t('n/a'),
+        'class' => 'release-reason',
+        'data' => $reason,
       );
+      $row['data'][] = array(
+        'class' => 'release-icon',
+        'data' => $icons[$classification],
+      );
+      $items[$release->tid][] = $row;
+      $added_majors[$release->tid][$release->version_major] = TRUE;
     }
-    $row['data'][] = array(
-      'class' => 'release-links',
-      'data' => theme('links', $links),
-    );
-    $items[$release->tid][] = $row;
   }
   $header = array(
     array(
@@ -1761,17 +1809,11 @@ function project_release_table($project,
 
   $rows = array();
   foreach ($items as $tid => $item) {
-    if ($table_type == 'recommended') {
-      // We only want the last entry in the array.
-      $rows[] = array_pop($item);
-    }
-    else {
-      $rows = array_merge($rows, $item);
-    }
+    $rows = array_merge($rows, $item);
   }
   $output = '';
   if (!empty($rows)) {
-    $output = theme('table', $header, $rows, array('class' => 'releases'));
+    $output = theme('table', $header, $rows, array('class' => 'releases system-status-report'));
   }
   // Default cache time is 12 hours - will be cleared by the packaging script
   cache_set($cid, 'cache_project_release', $output, time() + 43200);
