Index: modules/project/release/package-release-nodes.php
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/release/package-release-nodes.php,v
retrieving revision 1.18
diff -u -p -r1.18 package-release-nodes.php
--- modules/project/release/package-release-nodes.php	14 Jul 2007 15:17:13 -0000	1.18
+++ modules/project/release/package-release-nodes.php	31 Jul 2007 22:32:27 -0000
@@ -153,6 +153,14 @@ else {
   drupal_exec("$rm -rf $tmp_dir");
 }
 
+if ($task == 'branch') {
+  // Clear any cached data set to expire.
+  cache_clear_all(NULL, 'cache_project_release');
+}
+elseif ($task == 'repair') {
+  // Clear all cached data
+  cache_clear_all('*', 'cache_project_release', TRUE);
+}
 
 // ------------------------------------------------------------
 // Functions: main work
@@ -184,15 +192,17 @@ function package_releases($type, $projec
     $args[] = $project_id;
   }
 
-  $query = db_query("SELECT pp.uri, prn.nid, prn.tag, prn.version, c.directory, c.rid FROM {project_release_nodes} prn $rel_node_join INNER JOIN {project_projects} pp ON prn.pid = pp.nid INNER JOIN {node} np ON prn.pid = np.nid INNER JOIN {project_release_projects} prp ON prp.nid = prn.pid INNER JOIN {cvs_projects} c ON prn.pid = c.nid WHERE np.status = 1 AND prp.releases = 1" . $where . ' ORDER BY pp.uri', $args);
+  $query = db_query("SELECT pp.uri, prn.nid, prn.pid, prn.tag, prn.version, c.directory, c.rid FROM {project_release_nodes} prn $rel_node_join INNER JOIN {project_projects} pp ON prn.pid = pp.nid INNER JOIN {node} np ON prn.pid = np.nid INNER JOIN {project_release_projects} prp ON prp.nid = prn.pid INNER JOIN {cvs_projects} c ON prn.pid = c.nid WHERE np.status = 1 AND prp.releases = 1" . $where . ' ORDER BY pp.uri', $args);
 
   $num_built = 0;
   $num_considered = 0;
+  $project_nids = array();
   while ($release = db_fetch_object($query)) {
     $version = $release->version;
     $uri = $release->uri;
     $tag = $release->tag;
     $nid = $release->nid;
+    $pid = $release->pid;
     $rev = ($tag == 'TRUNK') ? '-r HEAD' : "-r $tag";
     $uri = escapeshellcmd($uri);
     $version = escapeshellcmd($version);
@@ -206,6 +216,7 @@ function package_releases($type, $projec
     }
     if ($built) {
       $num_built++;
+      $project_nids[$pid] = TRUE;
     }
     $num_considered++;
   }
@@ -217,6 +228,12 @@ function package_releases($type, $projec
       wd_msg(t("Done packaging releases from !plural: !num_built built, !num_considered considered.", array('!plural' => $plural, '!num_built' => $num_built, '!num_considered' => $num_considered)));
     }
   }
+
+  // Finally, clear the project_release_table() cache for any projects that we
+  // generated new tarballs for, since those tables are now stale.
+  foreach ($project_nids as $pid => $value) {
+    cache_clear_all($pid .':', 'cache_project_release', TRUE);
+  }
 }
 
 function package_release_core($nid, $uri, $version, $rev) {
Index: modules/project/release/project_release.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.install,v
retrieving revision 1.7
diff -u -p -r1.7 project_release.install
--- modules/project/release/project_release.install	13 Jul 2007 03:23:59 -0000	1.7
+++ modules/project/release/project_release.install	31 Jul 2007 22:32:27 -0000
@@ -36,6 +36,15 @@ function project_release_install() {
           major int unsigned NOT NULL default '0',
           PRIMARY KEY (nid, tid)
         ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
+      db_query("CREATE TABLE IF NOT EXISTS {cache_project_release} (
+        cid varchar(255) BINARY NOT NULL default '',
+        data longblob,
+        expire int NOT NULL default '0',
+        created int NOT NULL default '0',
+        headers text,
+        PRIMARY KEY (cid),
+        INDEX expire (expire)
+      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
       break;
 
     case 'pgsql':
@@ -75,6 +84,17 @@ function project_release_install() {
             PRIMARY KEY (nid, tid)
           );"); 
       }
+      if (!db_table_exists('cache_project_release')) {
+        db_query("CREATE TABLE {cache_project_release} (
+          cid varchar(255) NOT NULL default '',
+          data bytea,
+          expire int NOT NULL default '0',
+          created int NOT NULL default '0',
+          headers text,
+          PRIMARY KEY (cid)
+        )");
+        db_query("CREATE INDEX {cache_project_release}_expire_idx ON {cache_project_release} (expire)");
+      }
       break;
   }
   db_query("UPDATE {system} SET weight = 2 WHERE name = 'project_release'");
@@ -144,3 +164,38 @@ function project_release_update_2() {
   }
   return $ret;
 }
+
+/**
+ * Add a cache table {cache_project_release}.
+ */
+function project_release_update_5000() {
+  $ret = array();
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      $ret[] = update_sql("CREATE TABLE IF NOT EXISTS {cache_project_release} (
+        cid varchar(255) BINARY NOT NULL default '',
+        data longblob,
+        expire int NOT NULL default '0',
+        created int NOT NULL default '0',
+        headers text,
+        PRIMARY KEY (cid),
+        INDEX expire (expire)
+      ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
+      break;
+    case 'pgsql':
+      if (!db_table_exists('cache_project_release')) {
+        $ret[] = update_sql("CREATE TABLE {cache_project_release} (
+          cid varchar(255) NOT NULL default '',
+          data bytea,
+          expire int NOT NULL default '0',
+          created int NOT NULL default '0',
+          headers text,
+          PRIMARY KEY (cid)
+        )");
+        $ret[] = update_sql("CREATE INDEX {cache_project_release}_expire_idx ON {cache_project_release} (expire)");
+      }
+      break;
+  }
+  return $ret;
+}
Index: modules/project/release/project_release.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.module,v
retrieving revision 1.35
diff -u -p -r1.35 project_release.module
--- modules/project/release/project_release.module	14 Jul 2007 17:19:09 -0000	1.35
+++ modules/project/release/project_release.module	31 Jul 2007 22:32:28 -0000
@@ -1521,6 +1521,11 @@ function project_release_table($project,
   if (empty($title)) {
     $title = t('Version');
   }
+  // Generate the cache ID.
+  $cid = 'table:'. $project->nid .':'. $table_type .':'. $release_type .':'. $title .':'. (int)$print_size;
+  if ($cached = cache_get($cid, 'cache_project_release')) {
+    return $cached->data;
+  } 
   $select = $join = $where = $order_by = '';
   $tids = project_release_compatibility_list();
   if ($tids) {
@@ -1664,6 +1669,8 @@ function project_release_table($project,
   if (!empty($rows)) {
     $output = theme('table', $header, $rows, array('class' => 'releases'));
   }
+  // Default cache time is 12 hours - will be cleared by the packaging script
+  cache_set($cid, 'cache_project_release', $output, time() + 43200);
   return $output;
 }
 
