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)
This commit is contained in:
Thomas Keller 2010-11-17 00:47:55 +01:00
parent e6f255bc56
commit b4bc6abace
3 changed files with 58 additions and 6 deletions

View File

@ -37,6 +37,8 @@ class IDF_Form_Admin_ProjectUpdate extends Pluf_Form
{ {
$this->project = $extra['project']; $this->project = $extra['project'];
$members = $this->project->getMembershipData('string'); $members = $this->project->getMembershipData('string');
$conf = $this->project->getConf();
$this->fields['name'] = new Pluf_Form_Field_Varchar( $this->fields['name'] = new Pluf_Form_Field_Varchar(
array('required' => true, array('required' => true,
'label' => __('Name'), 'label' => __('Name'),
@ -45,12 +47,22 @@ class IDF_Form_Admin_ProjectUpdate extends Pluf_Form
$this->fields['shortdesc'] = new Pluf_Form_Field_Varchar( $this->fields['shortdesc'] = new Pluf_Form_Field_Varchar(
array('required' => true, array('required' => true,
'label' => __('short description'), 'label' => __('Short description'),
'help_text' => __('A one line description of the project.'), 'help_text' => __('A one line description of the project.'),
'initial' => $this->project->shortdesc, 'initial' => $this->project->shortdesc,
'widget_attrs' => array('size' => '35'), '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( $this->fields['owners'] = new Pluf_Form_Field_Varchar(
array('required' => false, array('required' => false,
'label' => __('Project owners'), '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() public function clean_owners()
{ {
return IDF_Form_MembersConf::checkBadLogins($this->cleaned_data['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()) { if (!$this->isValid()) {
throw new Exception(__('Cannot save the model from an invalid form.')); 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->cleaned_data);
$this->project->membershipsUpdated(); $this->project->membershipsUpdated();
$this->project->name = $this->cleaned_data['name']; $this->project->name = $this->cleaned_data['name'];
$this->project->shortdesc = $this->cleaned_data['shortdesc']; $this->project->shortdesc = $this->cleaned_data['shortdesc'];
$this->project->update(); $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]);
}
}
} }
} }

View File

@ -128,7 +128,7 @@ class IDF_Views_Project
public function timeline($request, $match) public function timeline($request, $match)
{ {
$prj = $request->project; $prj = $request->project;
$model_filter = @$match[2]; $model_filter = @$match[2];
$all_model_filters = self::getAvailableModelFilters(); $all_model_filters = self::getAvailableModelFilters();
if (!array_key_exists($model_filter, $all_model_filters)) { if (!array_key_exists($model_filter, $all_model_filters)) {
@ -156,7 +156,7 @@ class IDF_Views_Project
$pag->items_per_page = 20; $pag->items_per_page = 20;
$pag->no_results_text = __('No changes were found.'); $pag->no_results_text = __('No changes were found.');
$pag->setFromRequest($request); $pag->setFromRequest($request);
if (!$request->user->isAnonymous() and $prj->isRestricted()) { if (!$request->user->isAnonymous() and $prj->isRestricted()) {
$feedurl = Pluf_HTTP_URL_urlForView('idf_project_timeline_feed_auth', $feedurl = Pluf_HTTP_URL_urlForView('idf_project_timeline_feed_auth',
array($prj->shortname, array($prj->shortname,
@ -198,7 +198,7 @@ class IDF_Views_Project
$model_filter = 'all'; $model_filter = 'all';
} }
$title = $all_model_filters[$model_filter]; $title = $all_model_filters[$model_filter];
$classes = self::determineModelClasses($request, $model_filter); $classes = self::determineModelClasses($request, $model_filter);
$sqls = sprintf('model_class IN (%s)', implode(', ', $classes)); $sqls = sprintf('model_class IN (%s)', implode(', ', $classes));
$sql = new Pluf_SQL('project=%s AND '.$sqls, array($prj->id)); $sql = new Pluf_SQL('project=%s AND '.$sqls, array($prj->id));

View File

@ -25,6 +25,15 @@
<span class="helptext">{$form.f.shortdesc.help_text}</span> <span class="helptext">{$form.f.shortdesc.help_text}</span>
</td> </td>
</tr> </tr>
{if $project.getConf().getVal('scm') == 'mtn'}
<tr class="mtn-form">
<th><strong>{$form.f.mtn_master_branch.labelTag}:</strong></th>
<td>{if $form.f.mtn_master_branch.errors}{$form.f.mtn_master_branch.fieldErrors}{/if}
{$form.f.mtn_master_branch|unsafe}<br />
<span class="helptext">{$form.f.mtn_master_branch.help_text}</span>
</td>
</tr>
{/if}
<tr> <tr>
<th><strong>{$form.f.owners.labelTag}:</strong></th> <th><strong>{$form.f.owners.labelTag}:</strong></th>
<td> <td>
@ -44,7 +53,7 @@
<td>&nbsp;</td> <td>&nbsp;</td>
<td> {aurl 'url', 'IDF_Views_Admin::projectDelete', array($project.id)} <td> {aurl 'url', 'IDF_Views_Admin::projectDelete', array($project.id)}
{* float left is a fix for Firefox < 3.5 *} {* float left is a fix for Firefox < 3.5 *}
<span style="float: left;"><input type="submit" value="{trans 'Update Project'}" name="submit" /> <span style="float: left;"><input type="submit" value="{trans 'Update Project'}" name="submit" />
| <a href="{url 'IDF_Views_Admin::projects'}">{trans 'Cancel'}</a></span> {if $isAdmin} | <a href="{url 'IDF_Views_Admin::projects'}">{trans 'Cancel'}</a></span> {if $isAdmin}
<span class="dellink"><a href="{$url}" title="{trans 'Delete this project'}"><img src="{media '/idf/img/trash.png'}" style="vertical-align: text-bottom;" alt="{trans 'Trash'}" /></a> <a href="{$url}" title="{trans 'Delete this project'}">{trans 'Delete this project'}</a><br /><span class="note helptext">{trans 'You will be asked to confirm.'}</span></span>{/if} <span class="dellink"><a href="{$url}" title="{trans 'Delete this project'}"><img src="{media '/idf/img/trash.png'}" style="vertical-align: text-bottom;" alt="{trans 'Trash'}" /></a> <a href="{$url}" title="{trans 'Delete this project'}">{trans 'Delete this project'}</a><br /><span class="note helptext">{trans 'You will be asked to confirm.'}</span></span>{/if}
</td> </td>