Index: modules/cvslog/cvs.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/cvslog/cvs.module,v retrieving revision 1.136 diff -u -p -r1.136 cvs.module --- modules/cvslog/cvs.module 5 Jan 2007 22:52:04 -0000 1.136 +++ modules/cvslog/cvs.module 10 Jan 2007 00:27:53 -0000 @@ -301,24 +301,14 @@ function cvs_settings_form() { '#options' => array(t('Disabled'), t('Enabled')), '#description' => t('When enabled, this will store log messages in a temporary file to reduce memory consumption.'), ); - $result = db_query("SELECT * FROM {cvs_repositories} ORDER BY rid"); - while ($repo = db_fetch_object($result)) { - $options[$repo->rid] = $repo->name; - } + $options = _cvs_get_repository_options('<' . t('none') . '>'); $form['cvs_default_repo'] = array( '#title' => t('Default CVS repository for projects'), '#type' => 'radios', '#options' => $options, - '#default_value' => variable_get('cvs_default_repo', 1), + '#default_value' => variable_get('cvs_default_repo', 0), '#description' => t('Choose the repository that should be used by default when projects are being edited'), ); - $form['cvs_allow_repo_selection'] = array( - '#title' => t('Projects that can select their CVS repository'), - '#type' => 'textfield', - '#autocomplete_path' => 'project/autocomplete', - '#default_value' => variable_get('cvs_allow_repo_selection', ''), - '#description' => t('This comma-separated list of project titles controls which projects are allowed to select their CVS repository. Any projects not listed here will automatically use the default repository.'), - ); $form['cvs_restrict_project_creation'] = array( '#title' => t('Restrict project creation to users with CVS accounts'), '#type' => 'checkbox', @@ -463,6 +453,22 @@ function cvs_nodeapi(&$node, $op, $arg = break; case 'validate': if ($node->title) { + $project = !empty($node->nid) ? node_load($node->nid) : NULL; + if (!empty($node->cvs_repository) && !db_num_rows(db_query('SELECT * FROM {cvs_repositories} WHERE rid=%d', $node->cvs_repository))) { + form_set_error('cvs_repository', t('You must select a valid CVS repository.')); + } + if (!user_access('administer projects') && $project && $node->cvs_repository != $project->cvs_repository) { + form_set_error('cvs_repository', t('You do not have permission to modify the CVS repository for this project.')); + } + if (empty($node->cvs_repository)) { + // The rest of this validation only makes sense if we have + // a CVS repository for this project + if (!empty($node->cvs_directory)) { + form_set_error('cvs_directory', t('You can not specify a CVS directory if there is no CVS repository for this project.')); + } + break; + } + if (!$node->cvs_directory) { form_set_error('cvs_directory', t('You have to specify a valid CVS directory.')); } @@ -482,7 +488,7 @@ function cvs_nodeapi(&$node, $op, $arg = else if (db_result(db_query("SELECT nid FROM {cvs_projects} WHERE nid != %d AND rid = %d AND directory = '%s'", $node->nid, $node->cvs_repository, $node->cvs_directory))) { form_set_error('cvs_directory', t('The specified CVS directory conflicts with that of an existing project.')); } - else if(!in_array(strtolower($node->title), explode(',', strtolower(variable_get('cvs_allow_repo_selection', ''))))) { + else { $path_elems = explode('/', $node->cvs_directory); // Remove empty elements caused by the trailing and leading '/'. $path_elems = array_filter($path_elems); @@ -691,25 +697,19 @@ function cvs_user_edit_form_submit($form */ 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; - } + $repositories = _cvs_get_repository_options(t('')); $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)) { + $default_repo = isset($node->cvs_repository) ? $node->cvs_repository : variable_get('cvs_default_repo', 0); + if (count($repositories) > 1) { $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]), + '#options' => user_access('administer projects') ? $repositories : array($default_repo => $repositories[$default_repo]), '#description' => t("Specify the project's CVS repository."), ); } @@ -719,9 +719,16 @@ function cvs_alter_project_project_form( '#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, + '#description' => t("Specify the project's directory within the selected 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/. If there is no CVS repository associated with the project, this setting should be left blank."), ); + if ($default_repo == 0 || $node->cvs_directory) { + // If the default for the repository selector is (either + // because the project has already been saved with 0 for the + // repository, or because that's the site-wide default), or if we + // already have the value for the CVS directory, we should hide + // these gory details by default. + $form['cvs_nodeapi']['#collapsed'] = TRUE; + } } /** @@ -1270,12 +1277,7 @@ function cvs_page() { function cvs_page_search() { _cvs_styles(); - $repositories = array(t('')); - $result = db_query("SELECT rid, name FROM {cvs_repositories}"); - while ($repository = db_fetch_object($result)) { - $repositories[$repository->rid] = $repository->name; - } - + $repositories = _cvs_get_repository_options(t('')); $output = drupal_get_form('cvs_search_form', $repositories); if ($_REQUEST['rid'] || $_REQUEST['user'] || $_REQUEST['branch'] || $_REQUEST['file'] || $_REQUEST['message']) { @@ -2411,6 +2413,17 @@ function _cvs_get_status_options() { return $status_array; } +function _cvs_get_repository_options($label_for_zero = NULL) { + if (isset($label_for_zero)) { + $options[0] = $label_for_zero; + } + $result = db_query("SELECT * FROM {cvs_repositories} ORDER BY rid"); + while ($repo = db_fetch_object($result)) { + $options[$repo->rid] = $repo->name; + } + return $options; +} + /** * Return strings used in CVS account administration. */