Index: release/project_release.module
===================================================================
RCS file: /Users/wright/drupal/local_repo/contributions/modules/project/release/project_release.module,v
retrieving revision 1.157
diff -u -p -r1.157 project_release.module
--- release/project_release.module	24 Dec 2010 15:43:33 -0000	1.157
+++ release/project_release.module	10 Jan 2011 19:18:02 -0000
@@ -1706,7 +1706,21 @@ function _project_release_get_release_ty
   return variable_get('project_release_release_type_vid', '');
 }
 
+/**
+ * Determine if a release already exists with the given version.
+ *
+ * @param stdClass $version
+ *   An object containing fields that define the version for a release. Must
+ *   include 'pid', the project node ID. Can also include 'version_api_tid',
+ *   'version_major', 'version_minor', 'version_patch', 'version_extra',
+ *   and/or 'version' (the full version string itself).
+ *
+ * @return integer
+ *   The node ID of an existing release with the given version information, or
+ *   FALSE if no such release already exists.
+ */
 function project_release_exists($version) {
+  $values = array();
   $fields = array('version_major', 'version_minor', 'version_patch', 'version_api_tid');
   foreach ($fields as $field) {
     if (isset($version->$field) && is_numeric($version->$field)) {
@@ -1734,7 +1748,7 @@ function project_release_exists($version
     return false;
   }
 
-  $sql = 'SELECT COUNT(*) FROM {project_release_nodes} WHERE pid = %d';
+  $sql = 'SELECT nid FROM {project_release_nodes} WHERE pid = %d';
   if (!empty($types)) {
     foreach ($types as $field => $type) {
       $sql .= " AND $field = $type";
Index: release/includes/release_node_form.inc
===================================================================
RCS file: /Users/wright/drupal/local_repo/contributions/modules/project/release/includes/release_node_form.inc,v
retrieving revision 1.13
diff -u -p -r1.13 release_node_form.inc
--- release/includes/release_node_form.inc	8 Jan 2011 12:35:00 -0000	1.13
+++ release/includes/release_node_form.inc	10 Jan 2011 19:22:36 -0000
@@ -94,7 +94,6 @@ function _project_release_form(&$release
     '#value' => $pid,
   );
 
-  $form['validate_version'] = array('#type' => 'value', '#value' => 1);
   _project_release_form_add_version_element($form, $release, $modify, $format, 'major', t('Major'));
   _project_release_form_add_version_element($form, $release, $modify, $format, 'minor', t('Minor'));
   _project_release_form_add_version_element($form, $release, $modify, $format, 'patch', t('Patch-level'));
@@ -284,24 +283,41 @@ function _project_release_form_add_text_
  */
 function _project_release_node_form_validate(&$form, &$form_state) {
   global $user;
-  $project_release = $form_state['values']['project_release'];
-  if (!empty($form_state['values']['validate_version'])) {
-    if (!isset($project_release['version_major']) && !isset($project_release['version_minor']) &&
-        !isset($project_release['version_patch']) &&
-        (!($project_release['version_extra']) || $project_release['version_extra'] === '')) {
-      form_set_error('project_release][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' => t('Major version number'), 'version_minor' => t('Minor version number')) as $field => $name) {
-      $val = $project_release[$field];
-      if (isset($val) && $val !== '' && !is_numeric($val)) {
-        form_set_error("project_release][$field", t('%name must be a number.', array('%name' => $name)));
-      }
-    }
-    $val = $project_release['version_patch'];
-    if (isset($val) && $val !== '' && !is_numeric($val) && $val != 'x') {
-      form_set_error('project_release][version_patch', t("Patch-level version number must be numeric or the letter 'x'."));
-    }
+
+  // In some cases, the values we need to validate will be in
+  // $form_state['storage'] but not yet in $form_state['values']. For example,
+  // when the cvs.module is enabled and it has altered the release node form
+  // to turn it into a multi-step form, its submit handler will move the
+  // values from $form_state['storage'] to $form_state['values'] but that
+  // happens after we get a chance to validate everything. So, if there are
+  // values in $form_state['storage']['project_release'] we need to validate
+  // those to be safe.
+  if (!empty($form_state['storage']['project_release'])) {
+    $project_release = $form_state['storage']['project_release'];
+  }
+  elseif (!empty($form_state['values']['project_release'])) {
+    $project_release = $form_state['values']['project_release'];
+  }
+  else {
+    form_set_error('project_release][version_major', t('You must fill in some version information.'));
+    // TODO: find a better form value to mark as the error?
+    return;
+  }
+  if (!isset($project_release['version_major']) && !isset($project_release['version_minor']) &&
+      !isset($project_release['version_patch']) &&
+      (!($project_release['version_extra']) || $project_release['version_extra'] === '')) {
+    form_set_error('project_release][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' => t('Major version number'), 'version_minor' => t('Minor version number')) as $field => $name) {
+    $val = $project_release[$field];
+    if (isset($val) && $val !== '' && !is_numeric($val)) {
+      form_set_error("project_release][$field", t('%name must be a number.', array('%name' => $name)));
+    }
+  }
+  $val = $project_release['version_patch'];
+  if (isset($val) && $val !== '' && !is_numeric($val) && $val != 'x') {
+    form_set_error('project_release][version_patch', t("Patch-level version number must be numeric or the letter 'x'."));
   }
 
   $validators = array(
@@ -330,13 +346,13 @@ function _project_release_node_form_vali
     }
   }
 
-  // With cvs.module installed, this validation is already handled.
-  // We only want to do it here if we're *not* doing the N-page form...
-  if (!empty($form_state['values']['validate_version']) && !isset($form_state['values']['nid'])) {
+  if (!isset($form_state['values']['nid'])) {
     $version = (object) $project_release;
-    if (project_release_exists($version)) {
+    $version->pid = $form['project']['#value']->nid;
+    $existing_nid = project_release_exists($version);
+    if (!empty($existing_nid)) {
       // TODO: is there a better form element to mark with this error?
-      form_set_error('project_release][version_patch', t('This version already exists for this project.'));
+      form_set_error('project_release][version_patch', t('This version <a href="@release_url">already exists</a> for this project.', array('@release_url' => url('node/' . $existing_nid))));
     }
   }
 
