From b4bc6abaceea8c97bfb19bba424902caa5f8145c Mon Sep 17 00:00:00 2001 From: Thomas Keller Date: Wed, 17 Nov 2010 00:47:55 +0100 Subject: [PATCH] Make the monotone master branch editable on forge level at least to make it possible to switch the default project branch (partially fixes issue 560) --- src/IDF/Form/Admin/ProjectUpdate.php | 47 ++++++++++++++++++- src/IDF/Views/Project.php | 6 +-- .../templates/idf/gadmin/projects/update.html | 11 ++++- 3 files changed, 58 insertions(+), 6 deletions(-) diff --git a/src/IDF/Form/Admin/ProjectUpdate.php b/src/IDF/Form/Admin/ProjectUpdate.php index 4157851..e15e029 100644 --- a/src/IDF/Form/Admin/ProjectUpdate.php +++ b/src/IDF/Form/Admin/ProjectUpdate.php @@ -37,6 +37,8 @@ class IDF_Form_Admin_ProjectUpdate extends Pluf_Form { $this->project = $extra['project']; $members = $this->project->getMembershipData('string'); + $conf = $this->project->getConf(); + $this->fields['name'] = new Pluf_Form_Field_Varchar( array('required' => true, 'label' => __('Name'), @@ -45,12 +47,22 @@ class IDF_Form_Admin_ProjectUpdate extends Pluf_Form $this->fields['shortdesc'] = new Pluf_Form_Field_Varchar( array('required' => true, - 'label' => __('short description'), + 'label' => __('Short description'), 'help_text' => __('A one line description of the project.'), 'initial' => $this->project->shortdesc, 'widget_attrs' => array('size' => '35'), )); + if ($this->project->getConf()->getVal('scm') == 'mtn') { + $this->fields['mtn_master_branch'] = new Pluf_Form_Field_Varchar( + array('required' => false, + 'label' => __('Master branch'), + 'initial' => $conf->getVal('mtn_master_branch'), + 'widget_attrs' => array('size' => '35'), + 'help_text' => __('This should be a world-wide unique identifier for your project. A reverse DNS notation like "com.my-domain.my-project" is a good idea.'), + )); + } + $this->fields['owners'] = new Pluf_Form_Field_Varchar( array('required' => false, 'label' => __('Project owners'), @@ -69,6 +81,30 @@ class IDF_Form_Admin_ProjectUpdate extends Pluf_Form )); } + public function clean_mtn_master_branch() + { + $mtn_master_branch = mb_strtolower($this->cleaned_data['mtn_master_branch']); + if (!preg_match('/^([\w\d]+([-][\w\d]+)*)(\.[\w\d]+([-][\w\d]+)*)*$/', + $mtn_master_branch)) { + throw new Pluf_Form_Invalid(__( + 'The master branch is empty or contains illegal characters, '. + 'please use only letters, digits, dashs and dots as separators.' + )); + } + + $sql = new Pluf_SQL('vkey=%s AND vdesc=%s AND project!=%s', + array('mtn_master_branch', $mtn_master_branch, + (string)$this->project->id)); + $l = Pluf::factory('IDF_Conf')->getList(array('filter'=>$sql->gen())); + if ($l->count() > 0) { + throw new Pluf_Form_Invalid(__( + 'This master branch is already used. Please select another one.' + )); + } + + return $mtn_master_branch; + } + public function clean_owners() { return IDF_Form_MembersConf::checkBadLogins($this->cleaned_data['owners']); @@ -84,12 +120,19 @@ class IDF_Form_Admin_ProjectUpdate extends Pluf_Form if (!$this->isValid()) { throw new Exception(__('Cannot save the model from an invalid form.')); } - IDF_Form_MembersConf::updateMemberships($this->project, + IDF_Form_MembersConf::updateMemberships($this->project, $this->cleaned_data); $this->project->membershipsUpdated(); $this->project->name = $this->cleaned_data['name']; $this->project->shortdesc = $this->cleaned_data['shortdesc']; $this->project->update(); + + $keys = array('mtn_master_branch'); + foreach ($keys as $key) { + if (!empty($this->cleaned_data[$key])) { + $this->project->getConf()->setVal($key, $this->cleaned_data[$key]); + } + } } } diff --git a/src/IDF/Views/Project.php b/src/IDF/Views/Project.php index 20854d9..0ebcf69 100644 --- a/src/IDF/Views/Project.php +++ b/src/IDF/Views/Project.php @@ -128,7 +128,7 @@ class IDF_Views_Project public function timeline($request, $match) { $prj = $request->project; - + $model_filter = @$match[2]; $all_model_filters = self::getAvailableModelFilters(); if (!array_key_exists($model_filter, $all_model_filters)) { @@ -156,7 +156,7 @@ class IDF_Views_Project $pag->items_per_page = 20; $pag->no_results_text = __('No changes were found.'); $pag->setFromRequest($request); - + if (!$request->user->isAnonymous() and $prj->isRestricted()) { $feedurl = Pluf_HTTP_URL_urlForView('idf_project_timeline_feed_auth', array($prj->shortname, @@ -198,7 +198,7 @@ class IDF_Views_Project $model_filter = 'all'; } $title = $all_model_filters[$model_filter]; - + $classes = self::determineModelClasses($request, $model_filter); $sqls = sprintf('model_class IN (%s)', implode(', ', $classes)); $sql = new Pluf_SQL('project=%s AND '.$sqls, array($prj->id)); diff --git a/src/IDF/templates/idf/gadmin/projects/update.html b/src/IDF/templates/idf/gadmin/projects/update.html index e6a40eb..132336a 100644 --- a/src/IDF/templates/idf/gadmin/projects/update.html +++ b/src/IDF/templates/idf/gadmin/projects/update.html @@ -25,6 +25,15 @@ {$form.f.shortdesc.help_text} +{if $project.getConf().getVal('scm') == 'mtn'} + +{$form.f.mtn_master_branch.labelTag}: +{if $form.f.mtn_master_branch.errors}{$form.f.mtn_master_branch.fieldErrors}{/if} +{$form.f.mtn_master_branch|unsafe}
+{$form.f.mtn_master_branch.help_text} + + +{/if} {$form.f.owners.labelTag}: @@ -44,7 +53,7 @@   {aurl 'url', 'IDF_Views_Admin::projectDelete', array($project.id)} {* float left is a fix for Firefox < 3.5 *} - + | {trans 'Cancel'} {if $isAdmin} {trans 'Trash'} {trans 'Delete this project'}
{trans 'You will be asked to confirm.'}
{/if}