* code for task #76438.
This commit is contained in:
@@ -5,6 +5,7 @@ ALTER TABLE `zt_repo` ADD `projects` varchar(255) NOT NULL AFTER `product`;
|
||||
ALTER TABLE `zt_release` CHANGE `project` `project` varchar(255) NOT NULL;
|
||||
ALTER TABLE `zt_release` CHANGE `branch` `branch` varchar(255) NOT NULL;
|
||||
ALTER TABLE `zt_release` CHANGE `build` `build` varchar(255) NOT NULL;
|
||||
ALTER TABLE `zt_release` ADD `shadow` mediumint(8) unsigned NOT NULL DEFAULT '0' AFTER `branch`;
|
||||
|
||||
CREATE OR REPLACE VIEW `ztv_normalproduct` AS SELECT * FROM `zt_product` WHERE `shadow` = 0;
|
||||
|
||||
|
||||
@@ -1285,6 +1285,7 @@ CREATE TABLE IF NOT EXISTS `zt_release` (
|
||||
`project` varchar(255) NOT NULL,
|
||||
`product` mediumint(8) unsigned NOT NULL default '0',
|
||||
`branch` varchar(255) NOT NULL default '0',
|
||||
`shadow` mediumint(8) unsigned NOT NULL default '0',
|
||||
`build` varchar(255) NOT NULL,
|
||||
`name` varchar(255) NOT NULL default '',
|
||||
`marker` enum('0','1') NOT NULL default '0',
|
||||
|
||||
+16
-10
@@ -261,18 +261,24 @@ class buildModel extends model
|
||||
/* if the build has been released and replace is true, replace build name with release name. */
|
||||
if($replace)
|
||||
{
|
||||
$releases = $this->dao->select('build, name')->from(TABLE_RELEASE)
|
||||
->where('build')->in(array_keys($builds))
|
||||
->andWhere('product')->in($products)
|
||||
->beginIF($branch !== 'all')->andWhere('branch')->in("$branchs")->fi()
|
||||
->andWhere('deleted')->eq(0)
|
||||
->fetchPairs();
|
||||
foreach($releases as $buildID => $releaseName)
|
||||
$releases = $this->dao->select('t1.id,t1.shadow,t1.build,t1.name')->from(TABLE_RELEASE)->alias('t1')
|
||||
->leftJoin(TABLE_BUILD)->alias('t2')->on('FIND_IN_SET(t2.id, t1.build)')
|
||||
->leftJoin(TABLE_BRANCH)->alias('t3')->on('FIND_IN_SET(t3.id, t1.branch)')
|
||||
->where('t2.id')->in(array_keys($builds))
|
||||
->andWhere('t1.product')->in($products)
|
||||
->beginIF($branch !== 'all')->andWhere('t3.id')->in($branchs)->fi()
|
||||
->andWhere('t1.deleted')->eq(0)
|
||||
->fetchAll('id');
|
||||
foreach($releases as $release)
|
||||
{
|
||||
$branchName = $allBuilds[$buildID]->branchName ? $allBuilds[$buildID]->branchName : $this->lang->branch->main;
|
||||
if($allBuilds[$buildID]->productType != 'normal')
|
||||
$releaseName = $release->name;
|
||||
foreach(explode(',', trim($release->build, ',')) as $buildID)
|
||||
{
|
||||
$builds[$buildID] = (strpos($params, 'withbranch') !== false ? $branchName . '/' : '') . $releaseName;
|
||||
$branchName = $allBuilds[$buildID]->branchName ? $allBuilds[$buildID]->branchName : $this->lang->branch->main;
|
||||
$buildName = $releaseName;
|
||||
if($allBuilds[$buildID]->productType != 'normal') $buildName = (strpos($params, 'withbranch') !== false ? $branchName . '/' : '') . $releaseName;
|
||||
if($release->shadow and !isset($builds[$release->shadow])) $builds[$release->shadow] = $buildName;
|
||||
if(isset($builds[$buildID])) unset($builds[$buildID]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,12 +157,12 @@ class projectrelease extends control
|
||||
$this->loadModel('story');
|
||||
$this->loadModel('bug');
|
||||
$this->loadModel('build');
|
||||
$this->app->loadConfig('release');
|
||||
$this->loadModel('release');
|
||||
$this->config->projectrelease->create = $this->config->release->create;
|
||||
|
||||
if(!empty($_POST))
|
||||
{
|
||||
$changes = $this->projectrelease->update($releaseID);
|
||||
$changes = $this->release->update($releaseID);
|
||||
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
$files = $this->loadModel('file')->saveUpload('release', $releaseID);
|
||||
if($changes or $files)
|
||||
|
||||
@@ -77,6 +77,7 @@ class projectreleaseModel extends model
|
||||
$builds = $this->dao->select("id,project,product,execution,name,scmPath,filePath")->from(TABLE_BUILD)->where('id')->in(array_unique($buildIdList))->fetchAll('id');
|
||||
foreach($releases as $release)
|
||||
{
|
||||
$release->buildInfos = array();
|
||||
foreach(explode(',', $release->build) as $buildID)
|
||||
{
|
||||
if(empty($buildID)) continue;
|
||||
@@ -123,45 +124,6 @@ class projectreleaseModel extends model
|
||||
return $buildIdList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a release.
|
||||
*
|
||||
* @param int $releaseID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function update($releaseID)
|
||||
{
|
||||
/* Init vars. */
|
||||
$releaseID = (int)$releaseID;
|
||||
$oldRelease = $this->dao->select('*')->from(TABLE_RELEASE)->where('id')->eq($releaseID)->fetch();
|
||||
|
||||
/* Check build if build is required. */
|
||||
if(strpos($this->config->release->edit->requiredFields, 'build') !== false and $this->post->build == false) return dao::$errors['build'] = sprintf($this->lang->error->notempty, $this->lang->release->build);
|
||||
|
||||
$release = fixer::input('post')->stripTags($this->config->release->editor->edit['id'], $this->config->allowedTags)
|
||||
->setDefault('mailto', '')
|
||||
->join('build', ',')
|
||||
->join('mailto', ',')
|
||||
->setIF(!$this->post->marker, 'marker', 0)
|
||||
->cleanInt('product')
|
||||
->remove('files,labels,allchecker,uid')
|
||||
->get();
|
||||
|
||||
$release = $this->loadModel('file')->processImgURL($release, $this->config->release->editor->edit['id'], $this->post->uid);
|
||||
$this->dao->update(TABLE_RELEASE)->data($release)
|
||||
->autoCheck()
|
||||
->batchCheck($this->config->release->edit->requiredFields, 'notempty')
|
||||
->check('name', 'unique', "id != '$releaseID' AND product = '{$oldRelease->product}' AND branch = '{$oldRelease->branch}' AND deleted = '0'")
|
||||
->where('id')->eq((int)$releaseID)
|
||||
->exec();
|
||||
if(!dao::isError())
|
||||
{
|
||||
$this->file->updateObjectID($this->post->uid, $releaseID, 'release');
|
||||
return common::createChanges($oldRelease, $release);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Link stories
|
||||
*
|
||||
|
||||
@@ -67,11 +67,12 @@
|
||||
<?php
|
||||
$i = 0;
|
||||
$buildCount = count($release->buildInfos);
|
||||
$rowspan = $buildCount > 1 ? "rowspan='$buildCount'" : '';
|
||||
if($buildCount == 0) $release->buildInfos = array('');
|
||||
foreach($release->buildInfos as $buildID => $build):
|
||||
?>
|
||||
<?php if($i == 0):?>
|
||||
<?php $rowspan = $buildCount > 1 ? "rowspan='$buildCount'" : '';?>
|
||||
<tr data-type='<?php echo $release->status;?>'>
|
||||
<?php if($i == 0):?>
|
||||
<td <?php echo $rowspan?>><?php echo html::a(inlink('view', "releaseID=$release->id"), sprintf('%03d', $release->id));?></td>
|
||||
<td <?php echo $rowspan?>>
|
||||
<?php
|
||||
@@ -82,7 +83,9 @@
|
||||
<?php if($project->hasProduct):?>
|
||||
<td <?php echo $rowspan?> title='<?php echo $release->productName?>'><?php echo $release->productName?></td>
|
||||
<?php endif;?>
|
||||
<td class='c-build' title='<?php echo $build->name;?>'><?php echo html::a($this->createLink($build->execution ? 'build' : 'projectbuild', 'view', "buildID=$buildID"), $build->name, '', "data-app='project'");?></td>
|
||||
<?php endif;?>
|
||||
<td class='c-build'><?php if($buildCount) echo html::a($this->createLink($build->execution ? 'build' : 'projectbuild', 'view', "buildID=$buildID"), $build->name, '', "data-app='project' title='<?php echo $build->name;?>'");?></td>
|
||||
<?php if($i == 0):?>
|
||||
<?php $status = $this->processStatus('release', $release);?>
|
||||
<td <?php echo $rowspan?> class='c-status text-center' title='<?php echo $status;?>'>
|
||||
<span class="status-release status-<?php echo $release->status?>"><?php echo $status;?></span>
|
||||
@@ -90,12 +93,8 @@
|
||||
<td <?php echo $rowspan?> class='text-center'><?php echo $release->date;?></td>
|
||||
<?php foreach($extendFields as $extendField) echo "<td $rowspan>" . $this->loadModel('flow')->getFieldValue($extendField, $release) . "</td>";?>
|
||||
<td <?php echo $rowspan?> class='c-actions'><?php echo $this->projectrelease->buildOperateMenu($release, 'browse');?></td>
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
<?php else:?>
|
||||
<tr>
|
||||
<td class='c-build' title='<?php echo $build->name;?>'><?php echo html::a($this->createLink($build->execution ? 'build' : 'projectbuild', 'view', "buildID=$buildID"), $build->name, '', "data-app='project'");?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<?php $i++; ?>
|
||||
<?php endforeach;?>
|
||||
<?php endforeach;?>
|
||||
|
||||
@@ -52,9 +52,7 @@
|
||||
<tr>
|
||||
<th><?php echo $lang->release->build;?></th>
|
||||
<td id='buildBox'><?php echo html::select('build[]', $builds, '', "class='form-control chosen' multiple");?></td>
|
||||
<td>
|
||||
<icon class='icon icon-help' data-toggle='popover' data-trigger='focus hover' data-placement='right' data-tip-class='text-muted popover-sm' data-content="<?php echo $lang->release->tips;?>"></icon>
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->release->date;?></th>
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->release->build;?></th>
|
||||
<td><?php echo html::select('build[]', $builds, $release->build, "class='form-control chosen' multiple required"); ?></td><td></td>
|
||||
<td><?php echo html::select('build[]', $builds, $release->build, "class='form-control chosen' multiple"); ?></td><td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->release->date;?></th>
|
||||
|
||||
@@ -3,7 +3,7 @@ $config->release = new stdclass();
|
||||
$config->release->create = new stdclass();
|
||||
$config->release->edit = new stdclass();
|
||||
$config->release->create->requiredFields = 'name,date';
|
||||
$config->release->edit->requiredFields = 'name,build,date';
|
||||
$config->release->edit->requiredFields = 'name,date';
|
||||
|
||||
$config->release->editor = new stdclass();
|
||||
$config->release->editor->create = array('id' => 'desc', 'tools' => 'simpleTools');
|
||||
|
||||
@@ -30,7 +30,6 @@ $lang->release->confirmUnlinkBug = "Möchten Sie diesen Bug löschen?";
|
||||
$lang->release->existBuild = '『Build』『%s』 existiert bereits. Sie können den 『name』 ändern oder ein anderes 『build』 wählen.';
|
||||
$lang->release->noRelease = 'Keine Releases. ';
|
||||
$lang->release->errorDate = 'The release date should not be greater than today.';
|
||||
$lang->release->tips = 'If no build is selected for a release, a build with the same name as the release is created by default.';
|
||||
|
||||
$lang->release->basicInfo = 'Basis Info';
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@ $lang->release->confirmUnlinkBug = "Do you want to remove this bug?";
|
||||
$lang->release->existBuild = '『Build』『%s』existed. You could change『name』or choose a『build』.';
|
||||
$lang->release->noRelease = 'No releases yet.';
|
||||
$lang->release->errorDate = 'The release date should not be greater than today.';
|
||||
$lang->release->tips = 'If no build is selected for a release, a build with the same name as the release is created by default.';
|
||||
|
||||
$lang->release->basicInfo = 'Basic Info';
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@ $lang->release->confirmUnlinkBug = "Voulez-vous retirer ce bug de la release ?
|
||||
$lang->release->existBuild = '『Build』『%s』existant. Vous pouvez changer『name』ou choisir un『build』.';
|
||||
$lang->release->noRelease = 'Pas de release à ce jour.';
|
||||
$lang->release->errorDate = "La date de release ne doit pas être supérieure à aujourd'hui.";
|
||||
$lang->release->tips = 'If no build is selected for a release, a build with the same name as the release is created by default.';
|
||||
|
||||
$lang->release->basicInfo = 'Infos de Base';
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@ $lang->release->confirmUnlinkBug = "您确认移除该Bug吗?";
|
||||
$lang->release->existBuild = '『版本』已经有『%s』这条记录了。您可以更改『发布名称』或者选择一个『版本』。';
|
||||
$lang->release->noRelease = '暂时没有发布。';
|
||||
$lang->release->errorDate = '发布日期不能大于今天。';
|
||||
$lang->release->tips = '如果发布未选择任何版本,系统会默认创建一个和该发布同名的版本。';
|
||||
|
||||
$lang->release->basicInfo = '基本信息';
|
||||
|
||||
|
||||
+15
-40
@@ -182,45 +182,19 @@ class releaseModel extends model
|
||||
->remove('allchecker,files,labels,uid,sync')
|
||||
->get();
|
||||
|
||||
/* Auto create build when release is not link build. */
|
||||
if(empty($release->build) and $release->name)
|
||||
/* Auto create shadow build. */
|
||||
if($release->name)
|
||||
{
|
||||
$build = $this->dao->select('*')->from(TABLE_BUILD)
|
||||
->where('deleted')->eq('0')
|
||||
->andWhere('name')->eq($release->name)
|
||||
->andWhere('product')->eq($productID)
|
||||
->andWhere('branch')->eq($branch)
|
||||
->fetch();
|
||||
if($build)
|
||||
{
|
||||
return dao::$errors['build'] = sprintf($this->lang->release->existBuild, $release->name);
|
||||
}
|
||||
else
|
||||
{
|
||||
$build = new stdclass();
|
||||
$build->project = $projectID;
|
||||
$build->product = (int)$productID;
|
||||
$build->branch = (int)$branch;
|
||||
$build->name = $release->name;
|
||||
$build->date = $release->date;
|
||||
$build->builder = $this->app->user->account;
|
||||
$build->desc = $release->desc;
|
||||
$build->execution = 0;
|
||||
$build->createdBy = $this->app->user->account;
|
||||
$build->createdDate = helper::now();
|
||||
$shadowBuild = new stdclass();
|
||||
$shadowBuild->product = $release->product;
|
||||
$shadowBuild->builds = $release->build;
|
||||
$shadowBuild->name = $release->name;
|
||||
$shadowBuild->createdBy = $this->app->user->account;
|
||||
$shadowBuild->createdDate = helper::now();
|
||||
$this->dao->insert(TABLE_BUILD)->data($shadowBuild)->exec();
|
||||
|
||||
$build = $this->loadModel('file')->processImgURL($build, $this->config->release->editor->create['id']);
|
||||
$this->app->loadLang('build');
|
||||
$this->dao->insert(TABLE_BUILD)->data($build)
|
||||
->autoCheck()
|
||||
->check('name', 'unique', "product = {$productID} AND branch = {$branch} AND deleted = '0'")
|
||||
->batchCheck($this->config->release->create->requiredFields, 'notempty')
|
||||
->exec();
|
||||
if(dao::isError()) return false;
|
||||
|
||||
$buildID = $this->dao->lastInsertID();
|
||||
$release->build = $buildID;
|
||||
}
|
||||
if(dao::isError()) return false;
|
||||
$release->shadow = $this->dao->lastInsertID();
|
||||
}
|
||||
|
||||
if($release->build)
|
||||
@@ -249,6 +223,7 @@ class releaseModel extends model
|
||||
$release->branch = ',' . trim(implode(',', $branches), ',') . ',';
|
||||
$release->project = ',' . trim(implode(',', $projects), ',') . ',';
|
||||
}
|
||||
|
||||
$release = $this->loadModel('file')->processImgURL($release, $this->config->release->editor->create['id'], $this->post->uid);
|
||||
$this->dao->insert(TABLE_RELEASE)->data($release)
|
||||
->autoCheck()
|
||||
@@ -258,7 +233,7 @@ class releaseModel extends model
|
||||
|
||||
if(dao::isError())
|
||||
{
|
||||
if(!empty($buildID)) $this->dao->delete()->from(TABLE_BUILD)->where('id')->eq($buildID)->exec();
|
||||
if(!empty($release->shadow)) $this->dao->delete()->from(TABLE_BUILD)->where('id')->eq($release->shadow)->exec();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -266,7 +241,7 @@ class releaseModel extends model
|
||||
|
||||
if(dao::isError())
|
||||
{
|
||||
if(!empty($buildID)) $this->dao->delete()->from(TABLE_BUILD)->where('id')->eq($buildID)->exec();
|
||||
if(!empty($release->shadow)) $this->dao->delete()->from(TABLE_BUILD)->where('id')->eq($release->shadow)->exec();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -310,7 +285,6 @@ class releaseModel extends model
|
||||
$oldRelease = $this->getById($releaseID);
|
||||
|
||||
$release = fixer::input('post')->stripTags($this->config->release->editor->edit['id'], $this->config->allowedTags)
|
||||
->add('id', $releaseID)
|
||||
->setDefault('build', '')
|
||||
->setDefault('mailto', '')
|
||||
->setDefault('deleteFiles', array())
|
||||
@@ -346,6 +320,7 @@ class releaseModel extends model
|
||||
->exec();
|
||||
if(!dao::isError())
|
||||
{
|
||||
if($release->build != $oldRelease->build) $this->dao->update(TABLE_BUILD)->set('builds')->eq($release->build)->where('id')->eq($oldRelease->shadow)->exec();
|
||||
$this->file->processFile4Object('release', $oldRelease, $release);
|
||||
return common::createChanges($oldRelease, $release);
|
||||
}
|
||||
|
||||
@@ -69,13 +69,15 @@
|
||||
?>
|
||||
<?php foreach($releases as $release):?>
|
||||
<?php $canBeChanged = common::canBeChanged('release', $release);?>
|
||||
<?php $buildCount = count($release->builds);?>
|
||||
<?php $buildCount = count($release->builds);?>
|
||||
<?php $rowspan = $buildCount > 1 ? "rowspan='{$buildCount}'" : '';?>
|
||||
<?php $i = 1;?>
|
||||
<?php if($buildCount == 0) $release->builds = array('');?>
|
||||
<?php foreach($release->builds as $build):?>
|
||||
<tr data-type='<?php echo $release->status;?>'>
|
||||
<?php if($i == 1):?>
|
||||
<td rowspan="<?php echo $buildCount;?>"><?php echo html::a(inlink('view', "releaseID=$release->id"), sprintf('%03d', $release->id));?></td>
|
||||
<td rowspan="<?php echo $buildCount;?>">
|
||||
<td <?php echo $rowspan?>><?php echo html::a(inlink('view', "releaseID=$release->id"), sprintf('%03d', $release->id));?></td>
|
||||
<td <?php echo $rowspan?>>
|
||||
<?php
|
||||
$flagIcon = $release->marker ? "<icon class='icon icon-flag red' title='{$lang->release->marker}'></icon> " : '';
|
||||
echo html::a(inlink('view', "release=$release->id"), $release->name, '', "title='$release->name'") . $flagIcon;
|
||||
@@ -83,6 +85,7 @@
|
||||
</td>
|
||||
<?php endif;?>
|
||||
<td>
|
||||
<?php if($buildCount):?>
|
||||
<?php if($product->type != 'normal'):?>
|
||||
<span class='label label-outline label-badge'><?php echo $build->branchName;?></span>
|
||||
<?php endif;?>
|
||||
@@ -93,16 +96,17 @@
|
||||
if($moduleName == 'build' and $this->execution->checkPriv($build->execution)) $canClickable = true;
|
||||
echo $canClickable ? html::a($this->createLink($moduleName, 'view', "buildID=$build->id"), $build->name, '', "data-app='project'") : $build->name;
|
||||
?>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
<td><?php echo $build->projectName;?></td>
|
||||
<td><?php if($buildCount) echo $build->projectName;?></td>
|
||||
<?php if($i == 1):?>
|
||||
<?php $status = $this->processStatus('release', $release);?>
|
||||
<td class='c-status text-center' title='<?php echo $status;?>' rowspan="<?php echo $buildCount;?>">
|
||||
<td class='c-status text-center' title='<?php echo $status;?>' <?php echo $rowspan?>>
|
||||
<span class="status-release status-<?php echo $release->status?>"><?php echo $status;?></span>
|
||||
</td>
|
||||
<td class='text-center' rowspan="<?php echo $buildCount;?>"><?php echo $release->date;?></td>
|
||||
<?php foreach($extendFields as $extendField) echo "<td rowspan='{$buildCount}'>" . $this->loadModel('flow')->getFieldValue($extendField, $release) . "</td>";?>
|
||||
<td class='c-actions' rowspan="<?php echo $buildCount;?>"><?php echo $this->release->buildOperateMenu($release, 'browse');?></td>
|
||||
<td class='text-center' <?php echo $rowspan?>><?php echo $release->date;?></td>
|
||||
<?php foreach($extendFields as $extendField) echo "<td $rowspan>" . $this->loadModel('flow')->getFieldValue($extendField, $release) . "</td>";?>
|
||||
<td class='c-actions' <?php echo $rowspan?>><?php echo $this->release->buildOperateMenu($release, 'browse');?></td>
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
<?php $i++;?>
|
||||
|
||||
@@ -36,9 +36,7 @@
|
||||
<tr>
|
||||
<th><?php echo $lang->release->build;?></th>
|
||||
<td><?php echo html::select('build[]', $builds, '', "class='form-control chosen' multiple");?></td>
|
||||
<td>
|
||||
<icon class='icon icon-help' data-toggle='popover' data-trigger='focus hover' data-placement='right' data-tip-class='text-muted popover-sm' data-content="<?php echo $lang->release->tips;?>"></icon>
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->release->date;?></th>
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->release->build;?></th>
|
||||
<td><?php echo html::select('build[]', $builds, $release->build, "class='form-control chosen' required multiple"); ?></td>
|
||||
<td><?php echo html::select('build[]', $builds, $release->build, "class='form-control chosen' multiple"); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->release->date;?></th>
|
||||
|
||||
Reference in New Issue
Block a user