? test.patch
Index: project.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/project.inc,v
retrieving revision 1.115
diff -u -p -u -p -r1.115 project.inc
--- project.inc	25 Aug 2007 17:54:54 -0000	1.115
+++ project.inc	20 Sep 2007 17:28:05 -0000
@@ -75,6 +75,7 @@ function project_project_form($node) {
     '#type' => 'fieldset',
     '#title' => t('Project information'),
     '#collapsible' => TRUE,
+    '#tree' => TRUE,
   );
   $form['project']['title'] = array(
     '#type' => 'textfield',
@@ -95,7 +96,7 @@ function project_project_form($node) {
   $form['project']['uri'] = array(
     '#type' => 'textfield',
     '#title' => t('Short project name'),
-    '#default_value' => isset($node->uri) ? $node->uri : NULL,
+    '#default_value' => isset($node->project['uri']) ? $node->project['uri'] : NULL,
     '#size' => 40,
     '#maxlength' => 50,
     '#description' => t('This will be used to generate a /project/&lt;shortname&gt;/ URL for your project.'),
@@ -104,7 +105,7 @@ function project_project_form($node) {
   $form['project']['mail'] = array(
     '#type' => 'textfield',
     '#title' => t('Project e-mail'),
-    '#default_value' => isset($node->mail) ? $node->mail : $user->mail,
+    '#default_value' => isset($node->project['mail']) ? $node->project['mail'] : $user->mail,
     '#size' => 40,
     '#maxlength' => 255,
     '#description' => t('E-mail address where the project owners can be contacted.'),
@@ -113,7 +114,7 @@ function project_project_form($node) {
   $form['project']['homepage'] = array(
     '#type' => 'textfield',
     '#title' => t('Homepage'),
-    '#default_value' => isset($node->homepage) ? $node->homepage : NULL,
+    '#default_value' => isset($node->project['homepage']) ? $node->project['homepage'] : NULL,
     '#size' => 40,
     '#maxlength' => 255,
     '#description' => t('Link to project homepage.'),
@@ -121,7 +122,7 @@ function project_project_form($node) {
   $form['project']['documentation'] = array(
     '#type' => 'textfield',
     '#title' => t('Documentation'),
-    '#default_value' => isset($node->documentation) ? $node->documentation : NULL,
+    '#default_value' => isset($node->project['documentation']) ? $node->project['documentation'] : NULL,
     '#size' => 40,
     '#maxlength' => 255,
     '#description' => t('Link to project documentation.'),
@@ -129,7 +130,7 @@ function project_project_form($node) {
   $form['project']['license'] = array(
     '#type' => 'textfield',
     '#title' => t('License'),
-    '#default_value' => isset($node->license) ? $node->license : NULL,
+    '#default_value' => isset($node->project['license']) ? $node->project['license'] : NULL,
     '#size' => 40,
     '#maxlength' => 255,
     '#description' => t('Link to project license.'),
@@ -137,15 +138,15 @@ function project_project_form($node) {
   $form['project']['screenshots'] = array(
     '#type' => 'textfield',
     '#title' => t('Screenshots'),
-    '#default_value' => isset($node->screenshots) ? $node->screenshots : NULL,
+    '#default_value' => isset($node->project['screenshots']) ? $node->project['screenshots'] : NULL,
     '#size' => 40,
     '#maxlength' => 255,
     '#description' => t('Link to project screenshots.'),
   );
   $form['project']['changelog'] = array(
     '#type' => 'textfield',
-    '#title' => t('Changelog'),
-    '#default_value' => isset($node->changelog) ? $node->changelog : NULL,
+    '#title' => t('Change log'),
+    '#default_value' => isset($node->project['changelog']) ? $node->project['changelog'] : NULL,
      '#size' => 40,
     '#maxlength' => 255,
     '#description' => t('Link to changelog.'),
@@ -153,7 +154,7 @@ function project_project_form($node) {
   $form['project']['cvs'] = array(
     '#type' => 'textfield',
     '#title' => t('CVS tree'),
-    '#default_value' => isset($node->cvs) ? $node->cvs : NULL,
+    '#default_value' => isset($node->project['cvs']) ? $node->project['cvs'] : NULL,
     '#size' => 40,
     '#maxlength' => 255,
     '#description' => t('Link to webcvs/viewcvs.'),
@@ -161,7 +162,7 @@ function project_project_form($node) {
   $form['project']['demo'] = array(
     '#type' => 'textfield',
     '#title' => t('Demo site'),
-    '#default_value' => isset($node->demo) ? $node->demo : NULL,
+    '#default_value' => isset($node->project['demo']) ? $node->project['demo'] : NULL,
     '#size' => 40,
     '#maxlength' => 255,
     '#description' => t('Link to a live demo.'),
@@ -187,12 +188,12 @@ function project_project_validate(&$node
   }
 
   // Validate uri.
-  if (empty($node->uri)) {
+  if (empty($node->project['uri'])) {
     form_set_error('uri', t('A short project name is required.'));
   }
   else {
     // Make sure uri only includes valid characters
-    if (!preg_match('/^[a-zA-Z0-9_-]+$/', $node->uri)) {
+    if (!preg_match('/^[a-zA-Z0-9_-]+$/', $node->project['uri'])) {
       form_set_error('uri', t('Please only use alphanumerical characters for the project name.'));
     }
 
@@ -207,7 +208,7 @@ function project_project_validate(&$node
         }
       }
     }
-    if (in_array(strtolower($node->uri), $reserved_names) || db_num_rows(db_query("SELECT nid FROM {project_projects} WHERE uri = '%s' AND nid <> %d", $node->uri, $node->nid))) {
+    if (in_array(strtolower($node->project['uri']), $reserved_names) || db_num_rows(db_query("SELECT nid FROM {project_projects} WHERE uri = '%s' AND nid <> %d", $node->project['uri'], $node->nid))) {
       form_set_error('uri', t('This project name is already in use.'));
     }
   }
@@ -218,10 +219,10 @@ function project_project_validate(&$node
   }
 
   // Validate emails
-  if (empty($node->mail)) {
+  if (empty($node->project['mail'])) {
     form_set_error('mail', t('You must specify a project e-mail.'));
   }
-  elseif ($data = user_validate_mail($node->mail)) {
+  elseif ($data = user_validate_mail($node->project['mail'])) {
     form_set_error('mail', $data);
   }
 
@@ -242,14 +243,14 @@ function project_project_validate(&$node
   }
 
   // Make sure all URL fields actually contain URLs.
-  $fields = array(
+  $url_fields = array(
     'homepage' => t('Homepage'),
-    'changelog' => t('Changelog'),
+    'changelog' => t('Change log'),
     'cvs' => t('CVS tree'),
     'demo' => t('Demo site'),
   );
-  foreach ($fields as $uri => $name) {
-    if ($node->$uri && !preg_match('/^(http|https|ftp):\/\//i', $node->$uri)) {
+  foreach ($url_fields as $uri => $name) {
+    if ($node->project[$uri] && !preg_match('/^(http|https|ftp):\/\//i', $node->project[$uri])) {
       form_set_error($uri, t('!field is not a valid URL.', array('!field' => $name)));
     }
   }
@@ -323,9 +324,10 @@ function project_project_view($node, $te
     // Misc section
     $links = array();
 
-    foreach (array('homepage' => t('Home page'), 'documentation' => t('Read documentation'), 'license' => t('Read license'), 'changelog' => t('Read complete log of changes'), 'demo' => t('Try out a demonstration'), 'screenshots' => t('Look at screenshots')) as $uri => $name) {
-      if (!empty($node->$uri)) {
-        $links[] = l($name, $node->$uri);
+    $url_fields = array('homepage' => t('Home page'), 'documentation' => t('Read documentation'), 'license' => t('Read license'), 'changelog' => t('Read complete log of changes'), 'demo' => t('Try out a demonstration'), 'screenshots' => t('Look at screenshots'));
+    foreach ($url_fields as $uri => $name) {
+      if (!empty($node->project[$uri])) {
+        $links[] = l($name, $node->project[$uri]);
       }
     }
 
@@ -344,18 +346,18 @@ function project_project_view($node, $te
     // Support section.
     $links = array();
     if ($view_issues) {
-      $links[] = l(t('View all support requests'), 'project/issues/'. $node->uri, null, 'categories=support&states=all', null);
-      $links[] = l(t('View pending support requests'), 'project/issues/'. $node->uri, null, 'categories=support', null);
-      $links[] = l(t('View pending bug reports'), 'project/issues/'. $node->uri, null, 'categories=bug', null);
-      $links[] = l(t('View pending feature requests'), 'project/issues/'. $node->uri, null, 'categories=feature', null);
+      $links[] = l(t('View all support requests'), 'project/issues/'. $node->project['uri'], null, 'categories=support&states=all', null);
+      $links[] = l(t('View pending support requests'), 'project/issues/'. $node->project['uri'], null, 'categories=support', null);
+      $links[] = l(t('View pending bug reports'), 'project/issues/'. $node->project['uri'], null, 'categories=bug', null);
+      $links[] = l(t('View pending feature requests'), 'project/issues/'. $node->project['uri'], null, 'categories=feature', null);
     }
     if ($make_issues) {
-      $links[] = l(t('Request support'), 'node/add/project_issue/'. $node->uri .'/support');
-      $links[] = l(t('Report new bug'), 'node/add/project_issue/'. $node->uri .'/bug');
-      $links[] = l(t('Request new feature'), 'node/add/project_issue/'. $node->uri .'/feature');
+      $links[] = l(t('Request support'), 'node/add/project_issue/'. $node->project['uri'] .'/support');
+      $links[] = l(t('Report new bug'), 'node/add/project_issue/'. $node->project['uri'] .'/bug');
+      $links[] = l(t('Request new feature'), 'node/add/project_issue/'. $node->project['uri'] .'/feature');
     }
     else {
-      $links[] = theme('project_issue_create_forbidden', $node->uri);
+      $links[] = theme('project_issue_create_forbidden', $node->project['uri']);
     }
 
     if ($links) {
@@ -368,13 +370,13 @@ function project_project_view($node, $te
     // Developer section
     $links = array();
     if ($view_issues) {
-      $links[] = l(t('View pending patches'), 'project/issues/'. $node->uri, null, 'states=8,13,14', null);
-      $links[] = l(t('View available tasks'), 'project/issues/'. $node->uri, null, 'categories=task', null);
-      $links[] = l(t('View all pending issues'), 'project/issues/'. $node->uri);
+      $links[] = l(t('View pending patches'), 'project/issues/'. $node->project['uri'], null, 'states=8,13,14', null);
+      $links[] = l(t('View available tasks'), 'project/issues/'. $node->project['uri'], null, 'categories=task', null);
+      $links[] = l(t('View all pending issues'), 'project/issues/'. $node->project['uri']);
     }
 
-    if ($node->cvs) {
-      $links[] = l(t('Browse the CVS repository'), $node->cvs);
+    if ($node->project['cvs']) {
+      $links[] = l(t('Browse the CVS repository'), $node->project['cvs']);
     }
 
     if (project_use_cvs($node)) {
@@ -392,10 +394,14 @@ function project_project_view($node, $te
   return $node;
 }
 
+/**
+ * Implementation of hook_load().
+ */
 function project_project_load($node) {
-  $project = db_fetch_object(db_query('SELECT * FROM {project_projects} WHERE nid = %d', $node->nid));
-
-  return $project;
+  $object = new stdClass();
+  $object->project = db_fetch_array(db_query('SELECT * FROM {project_projects} WHERE nid = %d', $node->nid));
+  unset($object->project['nid']);
+  return $object;
 }
 
 /**
@@ -407,7 +413,7 @@ function project_project_nodeapi(&$node,
     case 'insert':
       _project_save_taxonomy($node);
       if (module_exists('path')) {
-        path_set_alias("node/$node->nid", "project/$node->uri");
+        path_set_alias("node/$node->nid", 'project/'. $node->project['uri']);
       }
       break;
 
@@ -415,22 +421,33 @@ function project_project_nodeapi(&$node,
       _project_save_taxonomy($node);
       if (module_exists('path')) {
         path_set_alias("node/$node->nid");  // Clear existing alias.
-        path_set_alias("node/$node->nid", "project/$node->uri");
+        path_set_alias("node/$node->nid", 'project/'. $node->project['uri']);
       }
       break;
   }
 }
 
+/**
+ * Implementation of hook_insert().
+ */
 function project_project_insert($node) {
-  db_query("INSERT INTO {project_projects} (nid, uri, homepage, changelog, cvs, demo, release_directory, mail, version, screenshots, documentation, license) VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s')", $node->nid, $node->uri, $node->homepage, $node->changelog, $node->cvs, $node->demo, $node->release_directory, $node->mail, $node->version, $node->screenshots, $node->documentation, $node->license);
-//  project_release_scan_directory($node->uri);
+  $p = $node->project;
+  db_query("INSERT INTO {project_projects} (nid, uri, homepage, changelog, cvs, demo, release_directory, mail, version, screenshots, documentation, license) VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s')", $node->nid, $p['uri'], $p['homepage'], $p['changelog'], $p['cvs'], $p['demo'], $p['release_directory'], $p['mail'], $p['version'], $p['screenshots'], $p['documentation'], $p['license']);
+//  project_release_scan_directory($node->project['uri']);
 }
 
+/**
+ * Implementation of hook_update().
+ */
 function project_project_update($node) {
-  db_query("UPDATE {project_projects} SET uri = '%s', homepage = '%s', changelog = '%s', cvs = '%s', demo = '%s', release_directory = '%s', mail = '%s', version = %d, screenshots = '%s', documentation = '%s', license = '%s' WHERE nid = %d", $node->uri, $node->homepage, $node->changelog, $node->cvs, $node->demo, $node->release_directory, $node->mail, $node->version, $node->screenshots, $node->documentation, $node->license, $node->nid);
-//  project_release_scan_directory($node->uri);
+  $p = $node->project;
+  db_query("UPDATE {project_projects} SET uri = '%s', homepage = '%s', changelog = '%s', cvs = '%s', demo = '%s', release_directory = '%s', mail = '%s', version = %d, screenshots = '%s', documentation = '%s', license = '%s' WHERE nid = %d", $p['uri'], $p['homepage'], $p['changelog'], $p['cvs'], $p['demo'], $p['release_directory'], $p['mail'], $p['version'], $p['screenshots'], $p['documentation'], $p['license'], $node->nid);
+//  project_release_scan_directory($node->project['uri']);
 }
 
+/**
+ * Implementation of hook_delete().
+ */
 function project_project_delete($node) {
   db_query('DELETE FROM {project_projects} WHERE nid = %d', $node->nid);
 }
Index: release/project_release.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.module,v
retrieving revision 1.48
diff -u -p -u -p -r1.48 project_release.module
--- release/project_release.module	20 Sep 2007 00:12:32 -0000	1.48
+++ release/project_release.module	20 Sep 2007 17:41:10 -0000
@@ -184,7 +184,7 @@ function project_release_access($op, $no
       // We can't just use project_project_access() here, since we
       // need to check access to the project itself, not the release
       // node, so we use the helper method and pass the project id.
-      return project_check_admin_access($node->pid);
+      return project_check_admin_access($node->project_release['pid']);
     case 'delete':
       // No one should ever delete a release node, only unpublish it.
       return FALSE;
@@ -217,11 +217,11 @@ function project_release_form($release) 
       module_invoke_all('exit');
       exit;
     }
-    $release->pid = arg(3);
-    $project = node_load($release->pid);
+    $release->project_release['pid'] = arg(3);
+    $project = node_load($release->project_release['pid']);
     project_project_set_breadcrumb($project, TRUE);
     if (!isset($project) || $project->type != 'project_project') {
-      drupal_set_message(t('Node !nid is not a valid project.', array('!nid' => $release->pid)));
+      drupal_set_message(t('Node !nid is not a valid project.', array('!nid' => $release->project_release['pid'])));
       drupal_not_found();
       module_invoke_all('exit');
       exit;
@@ -243,7 +243,7 @@ function project_release_form($release) 
     global $user;
     $admin = user_access('administer projects');
     $is_edit = true;
-    $project->nid = $release->pid;
+    $project->nid = $release->project_release['pid'];
     $project = node_load($project);
     $breadcrumb[] = l($project->title, 'node/'. $project->nid);
     $breadcrumb[] = l(t('Releases'), 'node/'. $project->nid . '/release');
@@ -254,9 +254,12 @@ function project_release_form($release) 
   $form['#attributes'] = array("enctype" => "multipart/form-data");
   $form['#prefix'] = '<div class="project-release">';
   $form['#suffix'] = '</div>';
+  $form['project_release'] = array(
+    '#tree' => TRUE,
+  );
 
   if ($is_edit) {
-    $form['rel_id'] = array(
+    $form['project_release']['rel_id'] = array(
       '#type' => 'fieldset',
       '#title' => t('Release identification'),
       '#prefix' => '<div class="version-elements">',
@@ -265,14 +268,14 @@ function project_release_form($release) 
       '#collapsible' => TRUE,
     );
   }
-  _project_release_form_add_text_element($form['rel_id']['title'], t('Title'), $release->title, $is_edit, $admin, true, 40, 128);
-  _project_release_form_add_text_element($form['rel_id']['version'], t('Version string'), $release->version, $is_edit, $admin, true, 20, 255);
+  _project_release_form_add_text_element($form['project_release']['rel_id']['title'], t('Title'), $release->title, $is_edit, $admin, true, 40, 128);
+  _project_release_form_add_text_element($form['project_release']['rel_id']['version'], t('Version string'), $release->project_release['version'], $is_edit, $admin, true, 20, 255);
 
-  $form['pid'] = array(
+  $form['project_release']['pid'] = array(
     '#type' => 'value',
-    '#value' => $release->pid,
+    '#value' => $release->project_release['pid'],
   );
-  $form['version']['num'] = array(
+  $form['project_release']['version']['num'] = array(
     '#type' => 'fieldset',
     '#title' => t('Version number elements'),
     '#collapsible' => TRUE,
@@ -280,26 +283,28 @@ function project_release_form($release) 
     '#suffix' => '</div>',
   );
   $modify = $admin || !$is_edit;
-  $form['validate_version'] = array('#type' => 'hidden', '#value' => 1);
-  _project_release_form_add_version_element($form, $release, $modify, $format,
+  $form['project_release']['validate_version'] = array('#type' => 'hidden', '#value' => 1);
+  _project_release_form_add_version_element($form['project_release'], $release, $modify, $format,
     'major', t('Major'));
-  _project_release_form_add_version_element($form, $release, $modify, $format,
+  _project_release_form_add_version_element($form['project_release'], $release, $modify, $format,
     'minor', t('Minor'));
-  _project_release_form_add_version_element($form, $release, $modify, $format,
+  _project_release_form_add_version_element($form['project_release'], $release, $modify, $format,
     'patch', t('Patch-level'));
-  _project_release_form_add_version_element($form, $release, $modify, $format,
+  _project_release_form_add_version_element($form['project_release'], $release, $modify, $format,
     'extra', t('Extra identifier'), t('Optionally specify other identifying information for this version, for example "beta-1", "rc-1" or "dev". In most cases, this should be left blank.'), 40);
 
-  $form['file'] = array(
+  $form['project_release']['file'] = array(
     '#type' => 'fieldset',
     '#title' => t('File information'),
     '#collapsible' => TRUE,
+    '#tree' => FALSE,
   );
   if (empty($release->file_path)) {
-    $form['file']['file'] = array(
+    $form['project_release']['file']['file'] = array(
       '#title' => t('File'),
       '#type' => 'file',
       '#description' => t('Choose the file that will be associated with this release.'),
+      '#tree' => FALSE,
     );
   }
 
@@ -317,16 +322,16 @@ function project_release_form($release) 
     '#required' => $admin ? FALSE : TRUE,
     '#description' => t('Enter a description of this release, such as a list of the major changes or updates.'),
   );
-  $form['body_filter']['format'] = filter_form($node->format);
+  $form['body_filter']['format'] = filter_form($release->format);
 
-  _project_release_form_add_text_element($form['tag']['tag'], t('Tag'), $release->tag, $is_edit, $admin, true, 40, 255);
-  $form['tag']['rebuild'] = array(
+  _project_release_form_add_text_element($form['project_release']['tag']['tag'], t('Tag'), $release->project_release['tag'], $is_edit, $admin, true, 40, 255);
+  $form['project_release']['tag']['rebuild'] = array(
     '#type' => 'value',
-    '#value' => $release->rebuild,
+    '#value' => $release->project_release['rebuild'],
   );
-  _project_release_form_add_text_element($form['file']['file_path'], t('File path'), $release->file_path, $is_edit, $admin, false, 40, 255);
-  _project_release_form_add_text_element($form['file']['file_hash'], t('File md5 hash'), $release->file_hash, $is_edit, false);
-  _project_release_form_add_text_element($form['file']['file_date'], t('File date'), $release->file_date, $is_edit, false);
+  _project_release_form_add_text_element($form['project_release']['file']['file_path'], t('File path'), $release->project_release['file_path'], $is_edit, $admin, false, 40, 255);
+  _project_release_form_add_text_element($form['project_release']['file']['file_hash'], t('File md5 hash'), $release->project_release['file_hash'], $is_edit, false);
+  _project_release_form_add_text_element($form['project_release']['file']['file_date'], t('File date'), $release->project_release['file_date'], $is_edit, false);
 
   return $form;
 }
@@ -359,7 +364,7 @@ function _project_release_form_add_versi
     $form['version']['num'][$var_name] = array(
       '#type' => 'textfield',
       '#title' => $title,
-      '#default_value' => $release->$var_name,
+      '#default_value' => $release->project_release[$var_name],
       '#size' => $size,
       '#maxlength' => $size+10,
       '#attributes' => array('style' => 'width:auto'),
@@ -380,7 +385,7 @@ function _project_release_form_add_versi
   else {
     $form['version']['num'][$var_name] = array(
       '#type' => 'value',
-      '#value' => $release->$var_name,
+      '#value' => $release->project_release[$var_name],
     );
   }
 }
@@ -428,19 +433,19 @@ function _project_release_form_add_text_
  */
 function project_release_validate(&$edit, $form) {
   if ($_POST['validate_version']) {
-    if (!isset($edit->version_major) && !isset($edit->version_minor) &&
-        !isset($edit->version_patch) &&
-        (!($edit->version_extra) || $edit->version_extra === '')) {
+    if (!isset($edit->project_release['version_major']) && !isset($edit->project_release['version_minor']) &&
+        !isset($edit->project_release['version_patch']) &&
+        (!($edit->project_release['version_extra']) || $edit->project_release['version_extra'] === '')) {
       form_set_error('version_major', t('You must fill in some version information.'));
       // TODO: find a better form value to mark as the error?
     }
     foreach (array('version_major' => 'Major version number', 'version_minor' => 'Minor version number') as $field => $name) {
-      $val = $edit->$field;
+      $val = $edit->project_release[$field];
       if (isset($val) && $val !== '' && !is_numeric($val)) {
         form_set_error($field, t('!name must be a number.', array('!name' => $name)));
       }
     }
-    $val = $edit->version_patch;
+    $val = $edit->project_release['version_patch'];
     if (isset($val) && $val !== '' && !is_numeric($val) && $val != 'x') {
       form_set_error('version_patch', t("Patch-level version number must be numeric or the letter 'x'."));
     }
@@ -450,9 +455,9 @@ function project_release_validate(&$edit
     $file = file_save_upload('file', file_directory_path());
     if ($file) {
       $filepath = file_create_path($file->filepath);
-      form_set_value($form['file']['file_path'], $file->filepath);
-      form_set_value($form['file']['file_date'], filemtime($filepath));
-      form_set_value($form['file']['file_hash'], md5_file($filepath));
+      form_set_value($form['project_release']['file']['file_path'], $file->filepath);
+      form_set_value($form['project_release']['file']['file_date'], filemtime($filepath));
+      form_set_value($form['project_release']['file']['file_hash'], md5_file($filepath));
     }
     else {
       form_set_error('file', t('There was a problem uploading the specified file.'));
@@ -507,12 +512,13 @@ function project_release_validate(&$edit
  * @ingroup project_release_node
  */
 function project_release_load($node) {
-  $additions = db_fetch_object(db_query("SELECT * FROM {project_release_nodes} WHERE nid = %d", $node->nid));
+  $object = new stdClass();
+  $object->project_release = db_fetch_array(db_query("SELECT * FROM {project_release_nodes} WHERE nid = %d", $node->nid));
   // Add the API term associated with the release.
   $api_vid = _project_release_get_api_vid();
   $api_tid = db_result(db_query("SELECT tn.tid FROM {term_node} tn INNER JOIN {term_data} td ON tn.tid = td.tid WHERE td.vid = %d AND tn.nid = %d", $api_vid, $node->nid));
-  $additions->version_api_tid = $api_tid;
-  return $additions;
+  $object->project_release['version_api_tid'] = $api_tid;
+  return $object;
 }
 
 /**
@@ -559,28 +565,28 @@ function project_release_update($node) {
 function project_release_db_save($node, $is_new) {
   // If the patch field is set to a non-numeric value, we just want to
   // keep it as a NULL in the DB, instead of casting it to a 0.
-  if (isset($node->version_patch) && !is_numeric($node->version_patch)) {
-    unset($node->version_patch);
+  if (isset($node->project_release['version_patch']) && !is_numeric($node->project_release['version_patch'])) {
+    unset($node->project_release['version_patch']);
   }
-  $types = array( 'pid' => "%d", 'version' => "'%s'", 'tag' => "'%s'",
+  $types = array('pid' => "%d", 'version' => "'%s'", 'tag' => "'%s'",
     'file_path' => "'%s'", 'file_date' => "%d", 'file_hash' => "'%s'",
     'rebuild' => "%d",
   );
-  $values = array( 'pid' => $node->pid, 'version' => $node->version,
-    'tag' => $node->tag, 'file_path' => $node->file_path,
-    'file_date' => $node->file_date, 'file_hash' => $node->file_hash,
+  $values = array('pid' => $node->project_release['pid'], 'version' => $node->version,
+    'tag' => $node->project_release['tag'], 'file_path' => $node->project_release['file_path'],
+    'file_date' => $node->project_release['file_date'], 'file_hash' => $node->project_release['file_hash'],
     'rebuild' => $node->rebuild,
   );
   $fields = array('version_major', 'version_minor', 'version_patch');
   foreach ($fields as $field) {
-    if (isset($node->$field) && is_numeric($node->$field)) {
+    if (isset($node->project_release[$field]) && is_numeric($node->project_release[$field])) {
       $types[$field] = "%d";
-      $values[$field] = $node->$field;
+      $values[$field] = $node->project_release[$field];
     }
   }
-  if (!empty($node->version_extra)) {
+  if (!empty($node->project_release['version_extra'])) {
     $types['version_extra'] = "'%s'";
-    $values['version_extra'] = $node->version_extra;
+    $values['version_extra'] = $node->project_release['version_extra'];
   }
 
   if ($is_new) {
@@ -603,16 +609,16 @@ function project_release_db_save($node, 
     $vid = _project_release_get_api_vid();
     if (isset($node->taxonomy[$vid])) {
       $tid = $node->taxonomy[$vid];
-      $has_default = db_result(db_query("SELECT COUNT(*) FROM {project_release_default_versions} WHERE nid = %d AND tid = %d", $node->pid, $tid));
+      $has_default = db_result(db_query("SELECT COUNT(*) FROM {project_release_default_versions} WHERE nid = %d AND tid = %d", $node->project_release['pid'], $tid));
       if (!$has_default) {
-        db_query("INSERT INTO {project_release_default_versions} (nid, tid, major) VALUES (%d, %d, %d)", $node->pid, $tid, $node->version_major);
+        db_query("INSERT INTO {project_release_default_versions} (nid, tid, major) VALUES (%d, %d, %d)", $node->project_release['pid'], $tid, $node->project_release['version_major']);
       }
     }
   }
 
   // Finally, clear the cache for the release table whenever a release node is
   // added or updated, since what we want to display might have changed, too.
-  $cid = 'table:'. $node->pid .':';
+  $cid = 'table:'. $node->project_release['pid'] .':';
   cache_clear_all($cid, 'cache_project_release', TRUE);
 }
 
@@ -621,14 +627,14 @@ function project_release_db_save($node, 
  * @ingroup project_release_node
  */
 function project_release_delete($node) {
-  if ($node->file_path) {
-    file_delete(file_create_path($node->file_path));
+  if ($node->project_release['file_path']) {
+    file_delete(file_create_path($node->project_release['file_path']));
   }
   db_query("DELETE FROM {project_release_nodes} WHERE nid = %d", $node->nid);
 
   // Finally, clear the cache for the release table whenever a release node is
   // deleted, since what we want to display might have changed, too.
-  $cid = 'table:'. $node->pid .':';
+  $cid = 'table:'. $node->project_release['pid'] .':';
   cache_clear_all($cid, 'cache_project_release', TRUE);
 }
 
@@ -677,7 +683,7 @@ function project_release_get_version($re
     $node = $project;
   }
   else {
-    $node->nid = $release->pid;
+    $node->nid = $release->project_release['pid'];
   }
   $variables = array();
   foreach (array('major', 'minor', 'patch', 'extra') as $field) {
@@ -698,8 +704,8 @@ function project_release_get_version($re
   $variables["#api"] = '';
   $vid = _project_release_get_api_vid();
   if (project_release_get_api_taxonomy()) {
-    if (isset($release->version_api_tid)) {
-      $tid = $release->version_api_tid;
+    if (isset($release->project_release['version_api_tid'])) {
+      $tid = $release->project_release['version_api_tid'];
     }
     elseif (isset($release->$vid)) {
       $tid = $release->$vid;
@@ -721,7 +727,7 @@ function project_release_get_version($re
  */
 function project_release_view($node, $teaser = FALSE, $page = FALSE) {
   $node = node_prepare($node, $teaser);
-  $project = node_load($node->pid);
+  $project = node_load($node->project_release['pid']);
 
   if ($page) {
     // Breadcrumb navigation
@@ -730,25 +736,25 @@ function project_release_view($node, $te
     project_project_set_breadcrumb($project, $breadcrumb);
   }
 
-  if (project_use_cvs($project) && isset($node->tag)) {
+  if (project_use_cvs($project) && isset($node->project_release['tag'])) {
     if ($node->rebuild) {
-      $output .= t('Nightly development snapshot from CVS branch: @tag', array('@tag' => $node->tag)) .'<br />';
+      $output .= t('Nightly development snapshot from CVS branch: @tag', array('@tag' => $node->project_release['tag'])) .'<br />';
     }
     else {
-      $output .= t('Official release from CVS tag: @tag', array('@tag' => $node->tag)) .'<br />';      
+      $output .= t('Official release from CVS tag: @tag', array('@tag' => $node->project_release['tag'])) .'<br />';      
     }
   }
 
-  if ($node->file_path) {
-    $output .= '<small>'. t('Download: !file', array('!file' => theme('project_release_download_link', $node->file_path))) .'</small><br />';
-    $output .= '<small>'. t('Size: !size', array('!size' => format_size(filesize(file_create_path($node->file_path))))) .'</small><br />';
-    $output .= '<small>'. t('md5_file hash: !file_hash', array('!file_hash' => $node->file_hash)) .'</small><br />';
+  if ($node->project_release['file_path']) {
+    $output .= '<small>'. t('Download: !file', array('!file' => theme('project_release_download_link', $node->project_release['file_path']))) .'</small><br />';
+    $output .= '<small>'. t('Size: !size', array('!size' => format_size(filesize(file_create_path($node->project_release['file_path']))))) .'</small><br />';
+    $output .= '<small>'. t('md5_file hash: !file_hash', array('!file_hash' => $node->project_release['file_hash'])) .'</small><br />';
   }
   if ($node->created) {
     $output .= '<small>'. t('First released: !created', array('!created' => format_date($node->created))) .'</small><br />';
   }
-  if ($node->file_date  && ($node->file_date != $node->created)) {
-    $output .= '<small>'. t('Last updated: !changed', array('!changed' => format_date($node->file_date))) .'</small><br />';
+  if ($node->project_release['file_date']  && ($node->project_release['file_date'] != $node->created)) {
+    $output .= '<small>'. t('Last updated: !changed', array('!changed' => format_date($node->project_release['file_date']))) .'</small><br />';
   }
   $node->content['release_info'] = array(
     '#value' => '<div class="project-release">'. $output .'</div>',
@@ -1137,15 +1143,15 @@ function project_release_project_edit_fo
 function project_release_alter_release_form(&$form) {
   global $user;
   $node = $form['#node'];
-  $tid = $node->version_api_tid;
+  $tid = $node->project_release['version_api_tid'];
   $vid = _project_release_get_api_vid();
   if (!project_release_get_api_taxonomy() && isset($form['taxonomy'][$vid])) {
     unset($form['taxonomy'][$vid]);
   }
   else {
 /*
-    if (isset($node->pid)) {
-      $project->nid = $node->pid;
+    if (isset($node->project_release['pid'])) {
+      $project->nid = $node->project_release['pid'];
     }
     elseif (arg(1) == 'add' && is_numeric(arg(3))) {
       $project->nid = arg(3);
