cvs diff: Diffing .
Index: project.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/project.inc,v
retrieving revision 1.133
diff -u -p -r1.133 project.inc
--- project.inc	13 Jan 2009 00:04:27 -0000	1.133
+++ project.inc	14 Jan 2009 05:42:44 -0000
@@ -92,32 +92,51 @@ function project_project_form($node, $fo
   }
 
   /* Project properties */
-  $form['project'] = array(
+  // We can't put the title and body inside $node->project or core gets
+  // confused (e.g node_body_field() and friends).  So, we put the core node
+  // fields in their own fieldset (for which is #tree is FALSE).
+  $form['project_node'] = array(
     '#type' => 'fieldset',
     '#title' => t('Project information'),
     '#collapsible' => TRUE,
   );
-  $form['project']['title'] = array(
+  $form['project_node']['title'] = array(
     '#type' => 'textfield',
     '#title' => t('Full project name'),
     '#default_value' => isset($node->title) ? $node->title : NULL,
     '#maxlength' => 128,
     '#required' => TRUE,
   );
-  $form['project']['body_field'] = node_body_field($node, t('Full description'), 1);
-  $form['project']['uri'] = array(
+  // This is sort of a hack: We want the 'uri' to be in the $node->project
+  // array during validation and submission of this form, to protect the $node
+  // namespace, even though from a usability standpoint, this field belongs
+  // right up next to the title.  So, we add a 'project' subarray in here
+  // for which #tree is TRUE, and put the 'uri' field in there.  That way, it
+  // still lives inside the "Project information" fieldset as far as the UI is
+  // concerned, but the value shows up in the $node->project array for
+  // validation and submission as far as FAPI is concerned.
+  $form['project_node']['project'] = array('#tree' => TRUE);
+  $form['project_node']['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.'),
     '#required' => TRUE,
   );
+  $form['project_node']['body_field'] = node_body_field($node, t('Full description'), 1);
+
+  $form['project'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Project fields'),
+    '#collapsible' => TRUE,
+    '#tree' => TRUE,
+  );
   $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.'),
@@ -125,7 +144,7 @@ function project_project_form($node, $fo
   $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.'),
@@ -133,7 +152,7 @@ function project_project_form($node, $fo
   $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.'),
@@ -141,7 +160,7 @@ function project_project_form($node, $fo
   $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.'),
@@ -149,7 +168,7 @@ function project_project_form($node, $fo
   $form['project']['changelog'] = array(
     '#type' => 'textfield',
     '#title' => t('Changelog'),
-    '#default_value' => isset($node->changelog) ? $node->changelog : NULL,
+    '#default_value' => isset($node->project['changelog']) ? $node->project['changelog'] : NULL,
     '#size' => 40,
     '#maxlength' => 255,
     '#description' => t('Link to changelog.'),
@@ -157,7 +176,7 @@ function project_project_form($node, $fo
   $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.'),
@@ -165,7 +184,7 @@ function project_project_form($node, $fo
   $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.'),
@@ -174,6 +193,14 @@ function project_project_form($node, $fo
   return $form;
 }
 
+/**
+ * Implementation of hook_validate().
+ *
+ * @param $node
+ *   An object containing values from the project node form.  Note that since
+ *   this isn't a fully-loaded $node object, not all values will necessarily
+ *   be in the same location as they would after a node_load().
+ */
 function project_project_validate(&$node) {
   // Bail if user hasn't done a preview yet.
   if (!isset($node->title)) {
@@ -186,12 +213,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.'));
     }
 
@@ -206,7 +233,7 @@ function project_project_validate(&$node
         }
       }
     }
-    if (in_array(strtolower($node->uri), $reserved_names) || db_result(db_query("SELECT COUNT(*) FROM {project_projects} WHERE uri = '%s' AND nid <> %d", $node->uri, $node->nid))) {
+    if (in_array(strtolower($node->project['uri']), $reserved_names) || db_result(db_query("SELECT COUNT(*) 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.'));
     }
   }
@@ -219,7 +246,7 @@ function project_project_validate(&$node
     'demo' => t('Demo site'),
   );
   foreach ($fields as $uri => $name) {
-    if ($node->$uri && !preg_match('/^(http|https|ftp):\/\//i', $node->$uri)) {
+    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)));
     }
   }
@@ -311,14 +338,14 @@ function project_project_view($node, $te
       'weight' => 4,
     );
     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)) {
-        $all_links['resources']['links'][$uri] = l($name, $node->$uri);
+      if (!empty($node->project[$uri])) {
+        $all_links['resources']['links'][$uri] = l($name, $node->project[$uri]);
       }
     }
 
 
     // Flags that indicate what kind of access to project issues to allow.
-    $has_issues = module_exists('project_issue') && !empty($node->issues);
+    $has_issues = module_exists('project_issue') && !empty($node->project_issue['issues']);
     $view_issues = $has_issues && (user_access('access project issues') || user_access('access own project issues') || user_access('administer projects'));
     $make_issues = $has_issues && node_access('create', 'project_issue');
 
@@ -329,19 +356,19 @@ function project_project_view($node, $te
     );
     $links = array();
     if ($view_issues) {
-      $links['all_support'] = l(t('View all support requests'), 'project/issues/'. $node->uri, array('query' => 'categories=support&states=all'));
-      $links['pending_support'] = l(t('View pending support requests'), 'project/issues/'. $node->uri, array('query' => 'categories=support'));
-      $links['pending_bugs'] = l(t('View pending bug reports'), 'project/issues/'. $node->uri, array('query' => 'categories=bug'));
-      $links['pending_features'] = l(t('View pending feature requests'), 'project/issues/'. $node->uri, array('query' => 'categories=feature'));
-      $links['search_issues'] = l(t('Search issues'), 'project/issues/search/'. $node->uri);
+      $links['all_support'] = l(t('View all support requests'), 'project/issues/'. $node->project['uri'], array('query' => 'categories=support&states=all'));
+      $links['pending_support'] = l(t('View pending support requests'), 'project/issues/'. $node->project['uri'], array('query' => 'categories=support'));
+      $links['pending_bugs'] = l(t('View pending bug reports'), 'project/issues/'. $node->project['uri'], array('query' => 'categories=bug'));
+      $links['pending_features'] = l(t('View pending feature requests'), 'project/issues/'. $node->project['uri'], array('query' => 'categories=feature'));
+      $links['search_issues'] = l(t('Search issues'), 'project/issues/search/'. $node->project['uri']);
     }
     if ($make_issues) {
-      $links['request_support'] = l(t('Request support'), 'node/add/project_issue/'. $node->uri .'/support');
-      $links['report_bug'] = l(t('Report new bug'), 'node/add/project_issue/'. $node->uri .'/bug');
-      $links['request_feature'] = l(t('Request new feature'), 'node/add/project_issue/'. $node->uri .'/feature');
+      $links['request_support'] = l(t('Request support'), 'node/add/project_issue/'. $node->project['uri'] .'/support');
+      $links['report_bug'] = l(t('Report new bug'), 'node/add/project_issue/'. $node->project['uri'] .'/bug');
+      $links['request_feature'] = l(t('Request new feature'), 'node/add/project_issue/'. $node->project['uri'] .'/feature');
     }
     elseif ($has_issues) {
-      $links['create_forbidden'] = theme('project_issue_create_forbidden', $node->uri);
+      $links['create_forbidden'] = theme('project_issue_create_forbidden', $node->project['uri']);
     }
     $all_links['support']['links'] = $links;
 
@@ -353,13 +380,13 @@ function project_project_view($node, $te
     );
     $links = array();
     if ($view_issues) {
-      $links['pending_patches'] = l(t('View pending patches'), 'project/issues/'. $node->uri, array('query' => 'states=8,13', 'absolute' => TRUE, 'html' => TRUE));
-      $links['available_tasks'] = l(t('View available tasks'), 'project/issues/'. $node->uri, array('query' => 'categories=task'));
-      $links['pending_issues'] = l(t('View all pending issues'), 'project/issues/'. $node->uri);
+      $links['pending_patches'] = l(t('View pending patches'), 'project/issues/'. $node->project['uri'], array('query' => 'states=8,13', 'absolute' => TRUE, 'html' => TRUE));
+      $links['available_tasks'] = l(t('View available tasks'), 'project/issues/'. $node->project['uri'], array('query' => 'categories=task'));
+      $links['pending_issues'] = l(t('View all pending issues'), 'project/issues/'. $node->project['uri']);
     }
 
-    if ($node->cvs) {
-      $links['browse_repository'] = l(t('Browse the CVS repository'), $node->cvs);
+    if ($node->project['cvs']) {
+      $links['browse_repository'] = l(t('Browse the CVS repository'), $node->project['cvs']);
     }
 
     if (project_use_cvs($node)) {
@@ -407,8 +434,9 @@ function project_project_view($node, $te
 }
 
 function project_project_load($node) {
-  $project = db_fetch_object(db_query('SELECT * FROM {project_projects} WHERE nid = %d', $node->nid));
-
+  $additions = db_fetch_array(db_query('SELECT * FROM {project_projects} WHERE nid = %d', $node->nid));
+  $project = new stdClass;
+  $project->project = $additions;
   return $project;
 }
 
@@ -422,7 +450,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", NULL, $language);
+        path_set_alias("node/$node->nid", 'project/'. $node->project['uri'], NULL, $language);
       }
       break;
 
@@ -430,20 +458,20 @@ 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", NULL, $language);
+        path_set_alias("node/$node->nid", 'project/'. $node->project['uri'], NULL, $language);
       }
       break;
   }
 }
 
 function project_project_insert($node) {
-  db_query("INSERT INTO {project_projects} (nid, uri, homepage, changelog, cvs, demo, screenshots, documentation, license) VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')", $node->nid, $node->uri, $node->homepage, $node->changelog, $node->cvs, $node->demo, $node->screenshots, $node->documentation, $node->license);
-//  project_release_scan_directory($node->uri);
+  db_query("INSERT INTO {project_projects} (nid, uri, homepage, changelog, cvs, demo, screenshots, documentation, license) VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')", $node->nid, $node->project['uri'], $node->project['homepage'], $node->project['changelog'], $node->project['cvs'], $node->project['demo'], $node->project['screenshots'], $node->project['documentation'], $node->project['license']);
+//  project_release_scan_directory($node->project['uri']);
 }
 
 function project_project_update($node) {
-  db_query("UPDATE {project_projects} SET uri = '%s', homepage = '%s', changelog = '%s', cvs = '%s', demo = '%s', screenshots = '%s', documentation = '%s', license = '%s' WHERE nid = %d", $node->uri, $node->homepage, $node->changelog, $node->cvs, $node->demo, $node->screenshots, $node->documentation, $node->license, $node->nid);
-//  project_release_scan_directory($node->uri);
+  db_query("UPDATE {project_projects} SET uri = '%s', homepage = '%s', changelog = '%s', cvs = '%s', demo = '%s', screenshots = '%s', documentation = '%s', license = '%s' WHERE nid = %d", $node->project['uri'], $node->project['homepage'], $node->project['changelog'], $node->project['cvs'], $node->project['demo'], $node->project['screenshots'], $node->project['documentation'], $node->project['license'], $node->nid);
+//  project_release_scan_directory($node->project['uri']);
 }
 
 function project_project_delete($node) {
@@ -456,7 +484,7 @@ function project_project_access($op, $no
       // Since this function is shared for project_release nodes, we have to
       // be careful what node we pass to project_check_admin_access().
       if ($node->type == 'project_release') {
-        $node = node_load($node->pid);
+        $node = node_load($node->project['pid']);
       }
       if (project_check_admin_access($node)) {
         return TRUE;
Index: project.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/project.module,v
retrieving revision 1.328
diff -u -p -r1.328 project.module
--- project.module	12 Jan 2009 23:40:52 -0000	1.328
+++ project.module	14 Jan 2009 05:42:44 -0000
@@ -885,13 +885,12 @@ function project_use_taxonomy() {
 }
 
 /**
- * Returns whether or not the project uses
- * version control or not
+ * Returns whether or not the project uses version control or not.
  */
 function project_use_cvs($project) {
   if (module_exists('cvs')) {
     $project = is_numeric($project) ? node_load($project) : $project;
-    return isset($project->cvs_repository) && ($project->cvs_repository != 0);
+    return !empty($project->cvs['repository']);
   }
 }
 
cvs diff: Diffing legacy_paths
cvs diff: Diffing release
Index: release/project_release.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/release/project_release.module,v
retrieving revision 1.89
diff -u -p -r1.89 project_release.module
--- release/project_release.module	13 Jan 2009 19:59:29 -0000	1.89
+++ release/project_release.module	14 Jan 2009 05:42:46 -0000
@@ -214,7 +214,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;
@@ -244,20 +244,21 @@ function project_release_form($release) 
     // Initialize variables and $release object properties to prevent notices.
     $is_edit = FALSE;
     $admin = NULL;
-    $release->version_major = NULL;
-    $release->version_minor = NULL;
-    $release->version_patch = NULL;
-    $release->version_extra = NULL;
-    $release->tag = '';
-    $release->version = '';
-    $release->file_path = '';
-    $release->file_hash = '';
-    $release->file_date = 0;
-    $release->version_api_tid = NULL;
-    $release->pid = (integer) arg(3);
-    $project = node_load($release->pid);
+    $release->project_release = array();
+    $release->project_release['version_major'] = NULL;
+    $release->project_release['version_minor'] = NULL;
+    $release->project_release['version_patch'] = NULL;
+    $release->project_release['version_extra'] = NULL;
+    $release->project_release['tag'] = '';
+    $release->project_release['version'] = '';
+    $release->project_release['file_path'] = '';
+    $release->project_release['file_hash'] = '';
+    $release->project_release['file_date'] = 0;
+    $release->project_release['version_api_tid'] = NULL;
+    $release->project_release['pid'] = (integer) arg(3);
+    $project = node_load($release->project_release['pid']);
     if (!isset($project) || $project->type != 'project_project') {
-      drupal_set_message(t('Node %nid is not a valid project.', array('%nid' => $release->pid)), 'error');
+      drupal_set_message(t('Node %nid is not a valid project.', array('%nid' => $release->project_release['pid'])), 'error');
       drupal_goto('node/add/project-release');
     }
     // Make sure this user should have permissions to add releases for
@@ -278,7 +279,7 @@ function project_release_form($release) 
     global $user;
     $admin = user_access('administer projects');
     $is_edit = true;
-    $project = node_load($release->pid);
+    $project = node_load($release->project_release['pid']);
     $breadcrumb[] = l($project->title, 'node/'. $project->nid);
     $breadcrumb[] = l(t('Releases'), 'node/'. $project->nid . '/release');
     project_project_set_breadcrumb($project, $breadcrumb);
@@ -297,11 +298,11 @@ function project_release_form($release) 
     );
   }
   _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['rel_id']['version'], t('Version string'), $release->project_release['version'], $is_edit, $admin, TRUE, 20, 255);
 
   $form['pid'] = array(
     '#type' => 'value',
-    '#value' => $release->pid,
+    '#value' => $release->project_release['pid'],
   );
   $form['version']['num'] = array(
     '#type' => 'fieldset',
@@ -321,7 +322,7 @@ function project_release_form($release) 
     '#title' => t('File information'),
     '#collapsible' => TRUE,
   );
-  if (empty($release->file_path)) {
+  if (empty($release->project_release['file_path'])) {
     $file = file_save_upload('file');
     $form['file']['file'] = array(
       '#title' => t('File'),
@@ -334,14 +335,14 @@ function project_release_form($release) 
   // Add a description to the body field.
   $form['body_field']['body']['#description'] = t('Enter a description of this release, such as a list of the major changes or updates.');
 
-  _project_release_form_add_text_element($form['tag']['tag'], t('Tag'), $release->tag, $is_edit, $admin, TRUE, 40, 255);
+  _project_release_form_add_text_element($form['tag']['tag'], t('Tag'), $release->project_release['tag'], $is_edit, $admin, TRUE, 40, 255);
   $form['tag']['rebuild'] = array(
     '#type' => 'value',
-    '#value' => empty($release->rebuild) ? 0 : $release->rebuild,
+    '#value' => !empty($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, FALSE);
-  _project_release_form_add_text_element($form['file']['file_date'], t('File date'), $release->file_date, $is_edit, FALSE, FALSE);
+  _project_release_form_add_text_element($form['file']['file_path'], t('File path'), $release->project_release['file_path'], $is_edit, $admin, FALSE, 40, 255);
+  _project_release_form_add_text_element($form['file']['file_hash'], t('File md5 hash'), $release->project_release['file_hash'], $is_edit, FALSE, FALSE);
+  _project_release_form_add_text_element($form['file']['file_date'], t('File date'), $release->project_release['file_date'], $is_edit, FALSE, FALSE);
 
   // Add a custom validation function.
   $form['#validate'][] = 'project_release_node_form_validate';
@@ -378,7 +379,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'),
@@ -399,7 +400,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],
     );
   }
 }
@@ -535,22 +536,24 @@ function project_release_node_form_valid
   // title based on changes to the version elements on an edit, but we
   // have to be careful not to break the fancy N-page form when
   // cvs_form_alter() is involved...
-  if (isset($edit->project->uri)) {
-    $project_name = $edit->project->uri;
+  $project = isset($form_state['values']['project']) ? $form_state['values']['project'] : new stdClass;
+
+  if (isset($project->project['uri'])) {
+    $project_name = $project->project['uri'];
   }
-  elseif (isset($edit->pid)) {
-    $project_name = db_result(db_query("SELECT uri FROM {project_projects} WHERE nid = %d", $edit->pid));
+  elseif (isset($form_state['values']['pid'])) {
+    $project_name = db_result(db_query("SELECT uri FROM {project_projects} WHERE nid = %d", $form_state['values']['pid']));
   }
-  if (isset($edit->title)) {
+  if (isset($form_state['values']['title'])) {
     // TODO: Magic re-setting to "%project_name %version" ??
   }
-  elseif (isset($edit->version) && $edit->version !== '') {
-    form_set_value($form['title'], "$project_name $edit->version", $form_state);
+  elseif (isset($form_state['values']['version']) && $form_state['values']['version'] !== '') {
+    form_set_value($form['title'], $project_name .' '. $form_state['values']['version'], $form_state);
   }
-  elseif (isset($edit->project)) {
-    $version = project_release_get_version((object)$edit, $edit->project);
+  elseif (!empty($project)) {
+    $version = project_release_get_version((object)$form_state['values'], $project);
     form_set_value(array('#parents' => array('version')), $version, $form_state);
-    $title = $edit->project->title;
+    $title = $project->title;
     form_set_value($form['title'], "$title $version", $form_state);
   }
 }
@@ -565,7 +568,7 @@ function project_release_node_form_submi
   //}
   //else {
   //  // If there's no upload, save whatever value is already in $node.
-  //  $file_path = $node->file_path;
+  //  $file_path = $node->project_release['file_path'];
   //}
 }
 
@@ -574,16 +577,24 @@ function project_release_node_form_submi
  * @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));
+  $additions = 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;
+  $additions['version_api_tid'] = $api_tid;
+  $release = new stdClass;
+  $release->project_release = $additions;
+  return $release;
 }
 
 /**
  * Implementation of hook_insert().
+ *
+ * @param $node
+ *   Object containing form values from the project_release node form.  This
+ *   is NOT a fully loaded $node object, so the release-related values are
+ *   directly in $node, not in the $node->project_release array.
+ *
  * @ingroup project_release_node
  */
 function project_release_insert($node) {
@@ -603,6 +614,12 @@ function project_release_insert($node) {
 
 /**
  * Implementation of hook_update().
+ *
+ * @param $node
+ *   Object containing form values from the project_release node form.  This
+ *   is NOT a fully loaded $node object, so the release-related values are
+ *   directly in $node, not in the $node->project_release array.
+ *
  * @ingroup project_release_node
  */
 function project_release_update($node) {
@@ -620,7 +637,10 @@ function project_release_update($node) {
  * @see db_query
  * @ingroup project_release_internal
  *
- * @param $node Node object to save
+ * @param $node
+ *   Object containing form values from the project_release node form.  This
+ *   is NOT a fully loaded $node object, so the release-related values are
+ *   directly in $node, not in the $node->project_release array.
  * @param $is_new Is this a new release node, or are we updating?
  */
 function project_release_db_save($node, $is_new) {
@@ -643,13 +663,17 @@ function project_release_db_save($node, 
   //  $file_path = $node->file_path;
   //}
 
-  $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->pid,
+    'version' => $node->version,
+    'tag' => $node->tag,
+    'file_path' => $node->file_path,
+    'file_date' => $node->file_date,
+    'file_hash' => $node->file_hash,
     'rebuild' => $node->rebuild,
   );
   $fields = array('version_major', 'version_minor', 'version_patch');
@@ -761,8 +785,8 @@ function project_release_check_supported
  * @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);
 }
@@ -778,8 +802,8 @@ function project_release_delete($node) {
  * @ingroup project_release_api
  */
 function project_release_get_version_format($project) {
-  if (!empty($project->version_format)) {
-    return $project->version_format;
+  if (!empty($project->project_release['version_format'])) {
+    return $project->project_release['version_format'];
   }
 
   $db_format = db_result(db_query("SELECT version_format FROM {project_release_projects} WHERE nid = %d", $project->nid));
@@ -812,15 +836,15 @@ 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) {
     $var = "version_$field";
-    if (isset($release->$var) && $release->$var !== '') {
-      $variables["!$field"] = $release->$var;
-      $variables["%$field"] = '.'. $release->$var;
-      $variables["#$field"] = '-'. $release->$var;
+    if (isset($release->project_release[$var]) && $release->project_release[$var] !== '') {
+      $variables["!$field"] = $release->project_release[$var];
+      $variables["%$field"] = '.'. $release->project_release[$var];
+      $variables["#$field"] = '-'. $release->project_release[$var];
     }
     else {
       $variables["!$field"] = '';
@@ -833,9 +857,10 @@ 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'];
     }
+    // @TODO: is this right?
     elseif (isset($release->$vid)) {
       $tid = $release->$vid;
     }
@@ -856,7 +881,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
@@ -866,25 +891,25 @@ function project_release_view($node, $te
   }
 
   $output = '';
-  if (project_use_cvs($project) && isset($node->tag)) {
-    if (!empty($node->rebuild)) {
-      $output .= t('Nightly development snapshot from CVS branch: @tag', array('@tag' => $node->tag)) .'<br />';
+  if (project_use_cvs($project) && isset($node->project_release['tag'])) {
+    if (!empty($node->project_release['rebuild'])) {
+      $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 (!empty($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 (!empty($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 (!empty($node->file_date)  && ($node->file_date != $node->created)) {
-    $output .= '<small>'. t('Last updated: !changed', array('!changed' => format_date($node->file_date))) .'</small><br />';
+  if (!empty($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 />';
   }
   if (module_exists('project_usage') && user_access('view project usage')) {
     $output .= '<small>'. l(t('View usage statistics for this release'), 'project/usage/'. $node->nid) .'</small><br />';
@@ -895,7 +920,7 @@ function project_release_view($node, $te
   );
 
   // Display packaging errors to admins.
-  if (project_check_admin_access($node->pid)) {
+  if (project_check_admin_access($node->project_release['pid'])) {
     $rows = array();
     $result = db_query('SELECT * FROM {project_release_package_errors} WHERE nid = %d', $node->nid);
     $error = db_fetch_object($result);
@@ -1227,7 +1252,7 @@ function project_release_project_edit_fo
     '#type' => 'fieldset',
     '#title' => t('Advanced options'),
     '#collapsible' => TRUE,
-    '#collapsed' => $node->releases,
+    '#collapsed' => $node->project_release['releases'],
     '#weight' => 5,
   );
 
@@ -1236,7 +1261,7 @@ function project_release_project_edit_fo
     '#title' => t('Enable releases'),
     '#return_value' => 1,
     '#weight' => -10,
-    '#default_value' => isset($node->releases) ? $node->releases : 1,
+    '#default_value' => isset($node->project_release['releases']) ? $node->project_release['releases'] : 1,
     '#description' => t('Allow releases of this project with specific versions.'),
   );
 
@@ -1244,7 +1269,7 @@ function project_release_project_edit_fo
     $form['advanced']['version_format'] = array(
       '#type' => 'textfield',
       '#title' => t('Version format string'),
-      '#default_value' => $node->version_format,
+      '#default_value' => $node->project_release['version_format'],
       '#size' => 50,
       '#maxlength' => 255,
       '#description' => t('Customize the format of the version strings for releases of this project.') .' '. PROJECT_RELEASE_VERSION_FORMAT_HELP .' '. t('If blank, this project will use the site-wide default (currently set to: %default)', array('%default' => variable_get('project_release_default_version_format', PROJECT_RELEASE_DEFAULT_VERSION_FORMAT))),
@@ -1506,15 +1531,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);
@@ -1615,11 +1640,11 @@ function project_release_project_nodeapi
   if (!empty($project)) {
     $fields = array('releases', 'version_format');
     foreach ($fields as $field) {
-      $node->$field = $project->$field;
+      $node->project_release[$field] = $project->$field;
     }
     $wants_snapshots = db_result(db_query('SELECT tid FROM {project_release_supported_versions} WHERE nid = %d AND snapshot = %d LIMIT %d', $node->nid, 1, 1));
     if (isset($wants_snapshots)) {
-      $node->project_release_show_snapshots = TRUE;
+      $node->project_release['project_release_show_snapshots'] = TRUE;
     }
   }
 }
@@ -1659,8 +1684,8 @@ function project_release_release_nodeapi
       // Since release nodes can be unpublished, we need to make sure that the
       // recommended branch information is still up to date.
       if (module_exists('taxonomy')) {
-        if (isset($node->version_api_tid)) {
-          $tid = $node->version_api_tid;
+        if (isset($node->project_release['version_api_tid'])) {
+          $tid = $node->project_release['version_api_tid'];
         }
         else {
           $vid = _project_release_get_api_vid();
@@ -1669,7 +1694,7 @@ function project_release_release_nodeapi
           }
         }
         if (isset($tid)) {
-          project_release_check_supported_versions($node->pid, $tid, $node->version_major, ($op == 'delete' ? TRUE : FALSE));
+          project_release_check_supported_versions($node->project_release['pid'], $tid, $node->project_release['version_major'], ($op == 'delete' ? TRUE : FALSE));
         }
       }
       break;
@@ -1679,14 +1704,14 @@ function project_release_release_nodeapi
       $node->body = $node->content['release_info']['#value'] . $node->body;
       $node->teaser = $node->content['release_info']['#value'] . $node->teaser;
       // If the release node has a file, include an enclosure attribute for it.
-      if (!empty($node->file_path)) {
-        $file_link = theme('project_release_download_link', $node->file_path, NULL, TRUE);
+      if (!empty($node->project_release['file_path'])) {
+        $file_link = theme('project_release_download_link', $node->project_release['file_path'], NULL, TRUE);
         return array(
           array(
             'key' => 'enclosure',
             'attributes' => array(
               'url' => $file_link['href'],
-              'length' => filesize(file_create_path($node->file_path)),
+              'length' => filesize(file_create_path($node->project_release['file_path'])),
               'type' => 'application/octet-stream',
             )
           )
@@ -1761,12 +1786,12 @@ function project_release_get_current_rec
  * Theme the appropriate release download table for a project node.
  */
 function theme_project_release_project_download_table($node) {
-  if (empty($node->releases)) {
+  if (empty($node->project_release['releases'])) {
     return;
   }
   $output = '<h3>'. t('Releases') .'</h3>';
   $output .= project_release_table($node, 'supported', 'official', t('Official releases'));
-  if ($node->project_release_show_snapshots) {
+  if ($node->project_release['project_release_show_snapshots']) {
     $output .= project_release_table($node, 'supported', 'snapshot', t('Development snapshots'));
   }
   return $output;
@@ -1778,7 +1803,7 @@ function theme_project_release_project_d
  * Note:  This is *not* an implementation of hook_link_alter().
  */
 function project_release_project_page_link_alter($node, &$all_links) {
-  if (empty($node->releases)) {
+  if (empty($node->project_release['releases'])) {
     return;
   }
   $all_links['project_release'] = array(
@@ -2009,7 +2034,9 @@ function project_release_table($project,
  * Helper function to return an individual row for the download table.
  *
  * @param $release
- *   The release object queried from the database.
+ *   The release object queried from the database. Since this is NOT a
+ *   fully-loaded $node object, so the release-related fields are not in a
+ *   'project_release' sub-array.
  * @param $recommended
  *   Boolean indicating if this release is the currently recommended one.
  * @param $can_edit
@@ -2041,14 +2068,14 @@ function theme_project_release_download_
     );
   }
   // Figure out the class for the table row
-  $row_class = $release->rebuild ? 'release-dev' : 'release';
+  $row_class = $release->project_release['rebuild'] ? 'release-dev' : 'release';
   // Now, set the row color and help text, based on the release attributes.
-  if (!$release->supported) {
+  if (!$release->project_release['supported']) {
     $text = theme('project_release_download_text_unsupported', $release, 'summary');
     $message = theme('project_release_download_text_unsupported', $release, 'message');
     $classification = 'error';
   }
-  elseif ($release->rebuild) {
+  elseif ($release->project_release['rebuild']) {
     $reason = theme('project_release_download_text_snapshot', $release, 'summary');
     $message = theme('project_release_download_text_snapshot', $release, 'message');
     $classification = 'error';
@@ -2104,7 +2131,9 @@ function theme_project_release_download_
  * Return the message text for recommended releases in the download table.
  *
  * @param $release
- *   Object with data about the release.
+ *   The release object queried from the database. Since this is NOT a
+ *   fully-loaded $node object, so the release-related fields are not in a
+ *   'project_release' sub-array.
  * @param $text_type
  *   What kind of text to render.  Can be either 'summary' for the summary
  *   text to include directly on the project node, or 'message' for the text
cvs diff: Diffing release/views
cvs diff: Diffing release/views/handlers
cvs diff: Diffing usage
Index: usage/project_usage.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/usage/project_usage.module,v
retrieving revision 1.23
diff -u -p -r1.23 project_usage.module
--- usage/project_usage.module	19 Dec 2008 20:41:59 -0000	1.23
+++ usage/project_usage.module	14 Jan 2009 05:42:47 -0000
@@ -370,7 +370,7 @@ function project_usage_project_page($nod
  */
 function project_usage_release_page($node) {
   drupal_add_css(drupal_get_path('module', 'project_usage') .'/project_usage.css');
-  $project = node_load($node->pid);
+  $project = node_load($node->project_release['pid']);
   $breadcrumb = array(
     l(t('Usage'), 'project/usage'),
     l($project->title, 'project/usage/'. $project->nid),
@@ -650,10 +650,10 @@ function theme_project_usage_release_pag
  */
 function theme_project_usage_header_links($project, $release = NULL) {
   $links = array();
-  $links[] = l(t('%project_name project page', array('%project_name' => $project->title)), 'project/'. $project->uri, array(), NULL, NULL, FALSE, TRUE);
+  $links[] = l(t('%project_name project page', array('%project_name' => $project->title)), 'project/'. $project->project['uri'], array(), NULL, NULL, FALSE, TRUE);
   if (!empty($release)) {
     $links[] = l(t('%release_name release page', array('%release_name' => $release->title)), 'node/' . $release->nid, array(), NULL, NULL, FALSE, TRUE);
-    $links[] = l(t('All %project_name usage statistics', array('%project_name' => $project->title)), 'project/usage/' . $project->uri, array(), NULL, NULL, FALSE, TRUE);
+    $links[] = l(t('All %project_name usage statistics', array('%project_name' => $project->title)), 'project/usage/' . $project->project['uri'], array(), NULL, NULL, FALSE, TRUE);
   }
   $links[] = l(t('Usage statistics for all projects'), 'project/usage');
   return theme('item_list', $links);
@@ -663,8 +663,8 @@ function theme_project_usage_header_link
  * Implementation of hook_project_page_link_alter().
  */
 function project_usage_project_page_link_alter($node, &$links) {
-  if (user_access('view project usage') && $node->releases) {
-    $links['resources']['links']['project_usage'] = l(t('View usage statistics'), 'project/usage/' . $node->uri);
+  if (user_access('view project usage') && $node->project_release['releases']) {
+    $links['resources']['links']['project_usage'] = l(t('View usage statistics'), 'project/usage/'. $node->project['uri']);
   }
 }
 
cvs diff: Diffing usage/tests
cvs diff: Diffing views
cvs diff: Diffing views/handlers
cvs diff: Diffing views/plugins
cvs diff: Diffing views/theme
Index: views/theme/theme.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project/views/theme/theme.inc,v
retrieving revision 1.2
diff -u -p -r1.2 theme.inc
--- views/theme/theme.inc	12 Jan 2009 20:43:34 -0000	1.2
+++ views/theme/theme.inc	14 Jan 2009 05:42:47 -0000
@@ -93,11 +93,11 @@ function template_preprocess_project_vie
 
   // Link to the project's issue queue.
   if (!empty($options['project_issue_issues_link'])) {
-    if (isset($node->issues)) {
+    if (isset($node->project_issue['issues'])) {
       $vars['project_issue']->issues_link = array(
-          'title' => t('Bugs and feature requests'),
-          'href' => "project/issues/$node->uri",
-        );
+        'title' => t('Bugs and feature requests'),
+        'href' => 'project/issues/'. $node->project['uri'],
+      );
     }
   }
 }
