cvs diff: Diffing modules/cvslog Index: modules/cvslog/cvs.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/cvslog/cvs.module,v retrieving revision 1.106.2.18 diff -u -p -r1.106.2.18 cvs.module --- modules/cvslog/cvs.module 10 Sep 2006 06:33:49 -0000 1.106.2.18 +++ modules/cvslog/cvs.module 18 Sep 2006 02:48:09 -0000 @@ -384,39 +384,155 @@ function cvs_nodeapi(&$node, $op, $arg = */ function cvs_form_alter($form_id, &$form) { if ($form_id == 'project_project_node_form') { - $node = $form['#node']; - $result = db_query("SELECT rid, name FROM {cvs_repositories}"); - while ($repository = db_fetch_object($result)) { - $repositories[$repository->rid] = $repository->name; - } - $form['cvs_nodeapi'] = array( - '#type' => 'fieldset', - '#title' => t('CVS integration'), - '#collapsible' => TRUE, - '#collapsed' => $node->cvs_directory ? TRUE : FALSE, + return cvs_alter_project_project_form($form); + } + if ($form_id == 'project_release_node_form') { + return cvs_alter_project_release_form($form); + } +} + +/** + * Alters the project_project node form to add CVS integration + * @see cvs_form_alter + */ +function cvs_alter_project_project_form(&$form) { + $node = $form['#node']; + $result = db_query("SELECT rid, name FROM {cvs_repositories}"); + while ($repository = db_fetch_object($result)) { + $repositories[$repository->rid] = $repository->name; + } + $form['cvs_nodeapi'] = array( + '#type' => 'fieldset', + '#title' => t('CVS integration'), + '#collapsible' => TRUE, + '#collapsed' => $node->cvs_directory ? TRUE : FALSE, + ); + $projects_allowing_repo = explode(',', strtolower(variable_get('cvs_allow_repo_selection', ''))); + $allow_repo = in_array(strtolower($node->title), $projects_allowing_repo); + $default_repo = $node->cvs_repository ? $node->cvs_repository : variable_get('cvs_default_repo', ''); + if (!empty($repositories)) { + $form['cvs_nodeapi']['cvs_repository'] = array( + '#type' => 'select', + '#title' => t('Repository'), + '#default_value' => $default_repo, + '#options' => $allow_repo ? $repositories : array($default_repo => $repositories[$default_repo]), + '#description' => t("Specify the project's CVS repository."), ); - $projects_allowing_repo = explode(',', strtolower(variable_get('cvs_allow_repo_selection', ''))); - $allow_repo = in_array(strtolower($node->title), $projects_allowing_repo); - $default_repo = $node->cvs_repository ? $node->cvs_repository : variable_get('cvs_default_repo', ''); - if (!empty($repositories)) { - $form['cvs_nodeapi']['cvs_repository'] = array( - '#type' => 'select', - '#title' => t('Repository'), - '#default_value' => $default_repo, - '#options' => $allow_repo ? $repositories : array($default_repo => $repositories[$default_repo]), - '#description' => t("Specify the project's CVS repository."), - ); - } - $form['cvs_nodeapi']['cvs_directory'] = array( - '#type' => 'textfield', - '#title' => t('CVS directory'), - '#default_value' => $node->cvs_directory, - '#size' => 40, - '#maxlength' => 255, - '#description' => t("Specify the project's directory within the specified CVS repository. Directory names should start with a leading slash and end with a trailing slash, and must be unique for each project. For example: /modules/foo/, /themes/foo/ or /translations/foo/."), + } + $form['cvs_nodeapi']['cvs_directory'] = array( + '#type' => 'textfield', + '#title' => t('CVS directory'), + '#default_value' => $node->cvs_directory, + '#size' => 40, + '#maxlength' => 255, + '#description' => t("Specify the project's directory within the specified CVS repository. Directory names should start with a leading slash and end with a trailing slash, and must be unique for each project. For example: /modules/foo/, /themes/foo/ or /translations/foo/."), + '#required' => TRUE, + ); +} + +/** + * Alters the project_release node to add build tag UI + * @see cvs_form_alter + */ +function cvs_alter_project_release_form(&$form) { + $release = $form['#node']; + $project = $form['project']['#value']; + + if (!isset($project->releases)) { + // This project has no releases, nothing to alter + return $form; + } + + $tags = array(); + $result = db_query("SELECT c.nid, c.tag, c.branch FROM {cvs_tags} c LEFT JOIN {project_release_nodes} p ON c.nid = p.pid AND p.tag = c.tag WHERE c.nid = %d AND p.tag IS NULL ORDER BY branch DESC", $release->pid); + while ($tag = db_fetch_object($result)) { + $version = project_release_get_version(cvs_get_version_from_tag($tag), $project); + $tags[$tag->tag] = $tag->tag .' ('. $version .')'; + } + + if (!empty($tags)) { + $form['cvs_tag'] = array( + '#type' => 'select', + '#title' => t('CVS tag'), + '#options' => $tags, + '#weight' => -10, '#required' => TRUE, + '#description' => t("Select the CVS tag (and therefore version number) for this release."), ); } + else { + // TODO: print out something reasonable + } + + // Clear out all the existing verison number field UI elements + $form['version_super_major'] = array( + '#type' => 'value', + '#value' => $release->version_super_major, + ); + $form['version_super_minor'] = array( + '#type' => 'value', + '#value' => $release->version_super_minor, + ); + $form['version_major'] = array( + '#type' => 'value', + '#value' => $release->version_major, + ); + $form['version_minor'] = array( + '#type' => 'value', + '#value' => $release->version_minor, + ); + $form['version_patch'] = array( + '#type' => 'value', + '#value' => $release->version_patch, + ); + $form['version_extra'] = array( + '#type' => 'value', + '#value' => $release->version_extra, + ); +} + +/** + * Returns an array of version number values based on the given tag. + */ +function cvs_get_version_from_tag($tag) { + + // TODO: make all of this flexible with settable regular expressions? + /* + if ($project->tag_regexp) { + $regexp = $project->tag_regexp; + } + elseif ($regexp_setting = variable_get('cvs_tag_version_regexp', '')) { + $regexp = $regexp_setting; + } + else { + // TODO: default regexp? + } + */ + + // BEWARE: this is entirely drupal.org specific. Other sites should + // modify this logic for their own needs. + + // First, split on '_' to separate "super" version from "base" version. + list($super_ver, $base_ver) = explode('_', $tag->tag); + $super = explode('-', $super_ver, 5); + $base = empty($base_ver) ? array() : explode('-', $base_ver); + if (!empty($super[3])) { + // Has the form "DRUPAL-X-Y-Z", it must be a core release tag + // Ignore the 'DRUPAL' part in $super[0] + $version->version_major = $super[1]; + $version->version_minor = $super[2]; + $version->version_patch = $super[3]; + $version->version_extra = $super[4]; + } + else { + $version->version_super_major = $super[1]; + $version->version_super_minor = $super[2]; + $version->version_major = $base[0] ? $base[0] : 1; + $version->version_minor = $tag->branch ? 'X' : $base[1]; + $version->version_extra = $tag->branch ? '-branch' : $base[2]; + } + // TODO: add code to validate we parsed something reasonable, and ignore bad tags. + return $version; } /** cvs diff: Diffing modules/cvslog/xcvs