diff --git a/db/update17.8.sql b/db/update17.8.sql index 2a034e97e3..e1887d15ce 100644 --- a/db/update17.8.sql +++ b/db/update17.8.sql @@ -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; diff --git a/db/zentao.sql b/db/zentao.sql index 557a6663ad..5ff8e2ae96 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -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', diff --git a/module/build/model.php b/module/build/model.php index 695656a2f1..2f4cb16f88 100644 --- a/module/build/model.php +++ b/module/build/model.php @@ -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]); } } } diff --git a/module/projectrelease/control.php b/module/projectrelease/control.php index 6f9c856621..36992ea307 100644 --- a/module/projectrelease/control.php +++ b/module/projectrelease/control.php @@ -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) diff --git a/module/projectrelease/model.php b/module/projectrelease/model.php index 17bd84efef..476d3a353c 100644 --- a/module/projectrelease/model.php +++ b/module/projectrelease/model.php @@ -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 * diff --git a/module/projectrelease/view/browse.html.php b/module/projectrelease/view/browse.html.php index 7686b8a08e..af383d90df 100644 --- a/module/projectrelease/view/browse.html.php +++ b/module/projectrelease/view/browse.html.php @@ -67,11 +67,12 @@ buildInfos); + $rowspan = $buildCount > 1 ? "rowspan='$buildCount'" : ''; + if($buildCount == 0) $release->buildInfos = array(''); foreach($release->buildInfos as $buildID => $build): ?> - - 1 ? "rowspan='$buildCount'" : '';?> + >id"), sprintf('%03d', $release->id));?> > hasProduct):?> title='productName?>'>productName?> - createLink($build->execution ? 'build' : 'projectbuild', 'view', "buildID=$buildID"), $build->name, '', "data-app='project'");?> + + createLink($build->execution ? 'build' : 'projectbuild', 'view', "buildID=$buildID"), $build->name, '', "data-app='project' title='name;?>'");?> + processStatus('release', $release);?> class='c-status text-center' title=''> @@ -90,12 +93,8 @@ class='text-center'>date;?> " . $this->loadModel('flow')->getFieldValue($extendField, $release) . "";?> class='c-actions'>projectrelease->buildOperateMenu($release, 'browse');?> + - - - createLink($build->execution ? 'build' : 'projectbuild', 'view', "buildID=$buildID"), $build->name, '', "data-app='project'");?> - - diff --git a/module/projectrelease/view/create.html.php b/module/projectrelease/view/create.html.php index d3c905fec9..d9fdff98dd 100644 --- a/module/projectrelease/view/create.html.php +++ b/module/projectrelease/view/create.html.php @@ -52,9 +52,7 @@ release->build;?> - - - + release->date;?> diff --git a/module/projectrelease/view/edit.html.php b/module/projectrelease/view/edit.html.php index 2d287d373a..2164c01dfb 100644 --- a/module/projectrelease/view/edit.html.php +++ b/module/projectrelease/view/edit.html.php @@ -37,7 +37,7 @@ release->build;?> - build, "class='form-control chosen' multiple required"); ?> + build, "class='form-control chosen' multiple"); ?> release->date;?> diff --git a/module/release/config.php b/module/release/config.php index e49f950c9e..7e52377cd7 100644 --- a/module/release/config.php +++ b/module/release/config.php @@ -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'); diff --git a/module/release/lang/de.php b/module/release/lang/de.php index 2b5d9dd9c0..81723c68b5 100644 --- a/module/release/lang/de.php +++ b/module/release/lang/de.php @@ -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'; diff --git a/module/release/lang/en.php b/module/release/lang/en.php index c480cbd021..8afd780c5e 100644 --- a/module/release/lang/en.php +++ b/module/release/lang/en.php @@ -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'; diff --git a/module/release/lang/fr.php b/module/release/lang/fr.php index ca2d60eb54..c27bfe6121 100644 --- a/module/release/lang/fr.php +++ b/module/release/lang/fr.php @@ -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'; diff --git a/module/release/lang/zh-cn.php b/module/release/lang/zh-cn.php index 57af6338f2..1d1db7edca 100644 --- a/module/release/lang/zh-cn.php +++ b/module/release/lang/zh-cn.php @@ -30,7 +30,6 @@ $lang->release->confirmUnlinkBug = "您确认移除该Bug吗?"; $lang->release->existBuild = '『版本』已经有『%s』这条记录了。您可以更改『发布名称』或者选择一个『版本』。'; $lang->release->noRelease = '暂时没有发布。'; $lang->release->errorDate = '发布日期不能大于今天。'; -$lang->release->tips = '如果发布未选择任何版本,系统会默认创建一个和该发布同名的版本。'; $lang->release->basicInfo = '基本信息'; diff --git a/module/release/model.php b/module/release/model.php index 90f4b12acc..786703b0ac 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -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); } diff --git a/module/release/view/browse.html.php b/module/release/view/browse.html.php index 86a23ef7bd..0168a431e5 100644 --- a/module/release/view/browse.html.php +++ b/module/release/view/browse.html.php @@ -69,13 +69,15 @@ ?> - builds);?> + builds);?> + 1 ? "rowspan='{$buildCount}'" : '';?> + builds = array('');?> builds as $build):?> - id"), sprintf('%03d', $release->id));?> - + >id"), sprintf('%03d', $release->id));?> + > marker ? " " : ''; echo html::a(inlink('view', "release=$release->id"), $release->name, '', "title='$release->name'") . $flagIcon; @@ -83,6 +85,7 @@ + type != 'normal'):?> branchName;?> @@ -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; ?> + - projectName;?> + projectName;?> processStatus('release', $release);?> - + > - date;?> - " . $this->loadModel('flow')->getFieldValue($extendField, $release) . "";?> - release->buildOperateMenu($release, 'browse');?> + >date;?> + " . $this->loadModel('flow')->getFieldValue($extendField, $release) . "";?> + >release->buildOperateMenu($release, 'browse');?> diff --git a/module/release/view/create.html.php b/module/release/view/create.html.php index 3b1a30c5e3..b9ef2b61dd 100644 --- a/module/release/view/create.html.php +++ b/module/release/view/create.html.php @@ -36,9 +36,7 @@ release->build;?> - - - + release->date;?> diff --git a/module/release/view/edit.html.php b/module/release/view/edit.html.php index d203e03e18..d973f33ef3 100644 --- a/module/release/view/edit.html.php +++ b/module/release/view/edit.html.php @@ -37,7 +37,7 @@ release->build;?> - build, "class='form-control chosen' required multiple"); ?> + build, "class='form-control chosen' multiple"); ?> release->date;?>