* code for task #76438.

This commit is contained in:
王怡栋
2022-11-18 10:53:30 +08:00
parent 93a772e01e
commit db540eb67a
17 changed files with 60 additions and 120 deletions
+1
View File
@@ -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;
+1
View File
@@ -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
View File
@@ -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]);
}
}
}
+2 -2
View File
@@ -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)
+1 -39
View File
@@ -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
*
+7 -8
View File
@@ -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;?>
+1 -3
View File
@@ -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>
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -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');
-1
View File
@@ -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';
-1
View File
@@ -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';
-1
View File
@@ -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';
-1
View File
@@ -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
View File
@@ -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);
}
+12 -8
View File
@@ -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++;?>
+1 -3
View File
@@ -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>
+1 -1
View File
@@ -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>