From 01bfc4f928ebeea648bedddb2f72c58b82226c50 Mon Sep 17 00:00:00 2001 From: zenggang Date: Fri, 24 Dec 2021 08:24:05 +0000 Subject: [PATCH 01/36] * Fix bug#17941 --- module/mr/lang/en.php | 2 +- module/mr/lang/zh-cn.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/mr/lang/en.php b/module/mr/lang/en.php index 22bdd4d3b4..154f68e365 100644 --- a/module/mr/lang/en.php +++ b/module/mr/lang/en.php @@ -113,7 +113,7 @@ $lang->mr->apiErrorMap[1] = "You can't use same project/branch for source and ta $lang->mr->apiErrorMap[2] = "/Another open merge request already exists for this source branch: !([0-9]+)/"; $lang->mr->errorLang[1] = 'The source project branch cannot be the same as the target project branch'; -$lang->mr->errorLang[2] = 'Another open merge request already exists for this source branch: !%u'; +$lang->mr->errorLang[2] = 'Another open merge request already exists for this source branch: ID%u'; $lang->mr->from = "from"; $lang->mr->to = "to"; diff --git a/module/mr/lang/zh-cn.php b/module/mr/lang/zh-cn.php index a3cf83111e..3d59b59dbc 100644 --- a/module/mr/lang/zh-cn.php +++ b/module/mr/lang/zh-cn.php @@ -113,7 +113,7 @@ $lang->mr->apiErrorMap[1] = "You can't use same project/branch for source and ta $lang->mr->apiErrorMap[2] = "/Another open merge request already exists for this source branch: !([0-9]+)/"; $lang->mr->errorLang[1] = '源项目分支与目标项目分支不能相同'; -$lang->mr->errorLang[2] = '存在另外一个同样的合并请求在源项目分支中: !%u'; +$lang->mr->errorLang[2] = '存在另外一个同样的合并请求在源项目分支中: ID%u'; $lang->mr->from = "从"; $lang->mr->to = "合并到"; From dc46e684fefdec22af6603d7f473be2a16f37d7c Mon Sep 17 00:00:00 2001 From: liyuchun Date: Tue, 28 Dec 2021 14:10:59 +0800 Subject: [PATCH 02/36] * Fix bug #18023. --- lib/scm/gitlab.class.php | 1 + module/mr/model.php | 2 +- module/product/control.php | 2 +- module/story/control.php | 8 ++++---- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/scm/gitlab.class.php b/lib/scm/gitlab.class.php index 044b12e610..2ac9958d55 100644 --- a/lib/scm/gitlab.class.php +++ b/lib/scm/gitlab.class.php @@ -617,6 +617,7 @@ class gitlab $param = new stdclass(); $param->path = urldecode($path); + $param->ref_name = $this->branch; $fromDate = $this->getCommittedDate($fromRevision); $toDate = $this->getCommittedDate($toRevision); diff --git a/module/mr/model.php b/module/mr/model.php index b1b900ed44..a62b597c90 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -1325,7 +1325,7 @@ class mrModel extends model $commits = array(); foreach($DiffCommits as $DiffCommit) { - $commits[] = substr($DiffCommit->id, 0, 10); + if(isset($DiffCommit->id)) $commits[] = substr($DiffCommit->id, 0, 10); } return $this->dao->select('objectID')->from(TABLE_ACTION)->where('objectType')->eq($type)->andWhere('extra')->in($commits)->fetchPairs('objectID'); diff --git a/module/product/control.php b/module/product/control.php index 5c028d8df9..272fa4ea0d 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -1048,7 +1048,7 @@ class product extends control /* Get product reviewers. */ $product = $this->product->getByID($productID); $productReviewers = $product->reviewer; - if(!$productReviewers) $productReviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', ''); + if(!$productReviewers and $product->acl != 'open') $productReviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', ''); $storyReviewers = ''; if($storyID) diff --git a/module/story/control.php b/module/story/control.php index aa00d7b601..d7bd5edc46 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -305,7 +305,7 @@ class story extends control /* Get reviewers. */ $reviewers = $product->reviewer; - if(!$reviewers) $reviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', ''); + if(!$reviewers and $product->acl != 'open') $reviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', ''); /* Set Custom. */ foreach(explode(',', $this->config->story->list->customCreateFields) as $field) $customFields[$field] = $this->lang->story->$field; @@ -469,7 +469,7 @@ class story extends control /* Get reviewers. */ $reviewers = $product->reviewer; - if(!$reviewers) $reviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', ''); + if(!$reviewers and $product->acl != 'open') $reviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', ''); /* Init vars. */ $planID = $plan; @@ -685,7 +685,7 @@ class story extends control /* Get product reviewers. */ $productReviewers = $product->reviewer; - if(!$productReviewers) $productReviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', ''); + if(!$productReviewers and $product->acl != 'open') $productReviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', ''); $this->story->replaceURLang($story->type); @@ -937,7 +937,7 @@ class story extends control /* Get product reviewers. */ $productReviewers = $product->reviewer; - if(!$productReviewers) $productReviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', ''); + if(!$productReviewers and $product->acl != 'open') $productReviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', ''); /* Assign. */ $this->view->title = $this->lang->story->change . "STORY" . $this->lang->colon . $this->view->story->title; From 7713ab8f29aa175bea9992e97d650aee3cace525 Mon Sep 17 00:00:00 2001 From: zenggang Date: Tue, 28 Dec 2021 07:00:36 +0000 Subject: [PATCH 03/36] * Finish task#46554 --- module/gitlab/lang/en.php | 1 + module/gitlab/lang/zh-cn.php | 1 + module/gitlab/view/browseproject.html.php | 3 ++- module/group/lang/resource.php | 2 ++ 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/module/gitlab/lang/en.php b/module/gitlab/lang/en.php index 6449725eb1..48b3fadaec 100644 --- a/module/gitlab/lang/en.php +++ b/module/gitlab/lang/en.php @@ -32,6 +32,7 @@ $lang->gitlab->browseUser = "User List"; $lang->gitlab->browseGroup = "Group List"; $lang->gitlab->browseBranch = "GitLab Branch List"; $lang->gitlab->browseTag = "GitLab Tag List"; +$lang->gitlab->browseTagPriv = "GitLab Tag protected List"; $lang->gitlab->gitlabIssue = "GitLab Issue"; $lang->gitlab->zentaoProduct = 'Zentao Product'; $lang->gitlab->objectType = 'Type'; // task, bug, story diff --git a/module/gitlab/lang/zh-cn.php b/module/gitlab/lang/zh-cn.php index fd02373ded..4a147bb5bc 100644 --- a/module/gitlab/lang/zh-cn.php +++ b/module/gitlab/lang/zh-cn.php @@ -32,6 +32,7 @@ $lang->gitlab->browseUser = "用户列表"; $lang->gitlab->browseGroup = "群组列表"; $lang->gitlab->browseBranch = "GitLab分支列表"; $lang->gitlab->browseTag = "GitLab标签列表"; +$lang->gitlab->browseTagPriv = "GitLab标签保护列表"; $lang->gitlab->gitlabIssue = "{$lang->gitlab->common} issue"; $lang->gitlab->zentaoProduct = '禅道产品'; $lang->gitlab->objectType = '类型'; // task, bug, story diff --git a/module/gitlab/view/browseproject.html.php b/module/gitlab/view/browseproject.html.php index 6a2e47bdda..845778cc9a 100644 --- a/module/gitlab/view/browseproject.html.php +++ b/module/gitlab/view/browseproject.html.php @@ -52,7 +52,7 @@ gitlab->project->name);?> gitlab->lastUpdate;?> - actions;?> + actions;?> @@ -70,6 +70,7 @@ common::printLink('gitlab', 'browseBranch', "gitlabID=$gitlabID&projectID=$gitlabProject->id", " ", '', "title='{$lang->gitlab->browseBranch}' class='btn btn-primary'"); common::printLink('gitlab', 'browseBranchPriv', "gitlabID=$gitlabID&projectID=$gitlabProject->id", " ", '', "title='{$lang->gitlab->branch->accessLevel}' class='btn btn-primary'"); common::printLink('gitlab', 'browseTag', "gitlabID=$gitlabID&projectID=$gitlabProject->id", " ", '', "title='{$lang->gitlab->browseTag}' class='btn btn-primary'"); + common::printLink('gitlab', 'browseTagPriv', "gitlabID=$gitlabID&projectID=$gitlabProject->id", " ", '', "title='{$lang->gitlab->browseTagPriv}' class='btn btn-primary'"); common::printLink('gitlab', 'editProject', "gitlabID=$gitlabID&projectID=$gitlabProject->id", " ", '', "title='{$lang->gitlab->project->edit}' class='btn btn-primary'"); if(common::hasPriv('gitlab', 'delete')) echo html::a($this->createLink('gitlab', 'deleteProject', "gitlabID=$gitlabID&projectID=$gitlabProject->id"), '', 'hiddenwin', "title='{$lang->gitlab->deleteProject}' class='btn'"); ?> diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index d3b5df595d..6f33dc7a05 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1340,6 +1340,7 @@ $lang->resource->gitlab->deleteBranchPriv = 'deleteBranchPriv'; $lang->resource->gitlab->browseTag = 'browseTag'; $lang->resource->gitlab->createTag = 'createTag'; $lang->resource->gitlab->deleteTag = 'deleteTag'; +$lang->resource->gitlab->browseTagPriv = 'browseTagPriv'; $lang->gitlab->methodOrder[5] = 'browse'; $lang->gitlab->methodOrder[10] = 'create'; @@ -1367,6 +1368,7 @@ $lang->gitlab->methodOrder[120] = 'webhook'; $lang->gitlab->methodOrder[125] = 'createWebhook'; $lang->gitlab->methodOrder[130] = 'manageProjectMembers'; $lang->gitlab->methodOrder[135] = 'browseTag'; +$lang->gitlab->methodOrder[140] = 'browseTagPriv'; /* merge request. */ $lang->resource->mr = new stdclass(); From 667cf60e421cd042eec0189201407d99cb8d9a1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A1=E6=A0=8B?= Date: Tue, 28 Dec 2021 15:16:08 +0800 Subject: [PATCH 04/36] * code for task #46552. --- module/mr/control.php | 15 +++++++++++++++ module/mr/js/create.js | 19 +++++++++++++++++++ module/mr/js/edit.js | 20 ++++++++++---------- module/mr/lang/en.php | 9 +++++---- module/mr/lang/zh-cn.php | 10 ++++++---- module/mr/model.php | 32 ++++++++++++++++++++++++++++++++ module/product/model.php | 2 +- 7 files changed, 88 insertions(+), 19 deletions(-) diff --git a/module/mr/control.php b/module/mr/control.php index fb54593a39..5905fff006 100644 --- a/module/mr/control.php +++ b/module/mr/control.php @@ -937,4 +937,19 @@ class mr extends control foreach($compileList as $compile) $options .= ""; $this->send($options); } + + /** + * Ajax check opened mr. + * + * @param int $gitlabID + * @param int $projectID + * @access public + * @return void + */ + public function ajaxCheckOpened($gitlabID, $projectID) + { + $sourceBranch = $this->post->sourceBranch; + $result = $this->mr->hasOpened($gitlabID, $projectID, $sourceBranch); + die(json_encode($result)); + } } diff --git a/module/mr/js/create.js b/module/mr/js/create.js index 5999afdfa9..a929fd61ad 100644 --- a/module/mr/js/create.js +++ b/module/mr/js/create.js @@ -44,6 +44,25 @@ $(function() }); }); + $('#sourceBranch').change(function() + { + var gitlabID = $('#gitlabID').val(); + var sourceProject = $('#sourceProject').val(); + repoUrl = createLink('mr', 'ajaxCheckOpened', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); + + var sourceBranch = $(this).val(); + $.post(repoUrl, {"sourceBranch": sourceBranch}, function(response) + { + response = $.parseJSON(response); + if(response.result == 'fail') + { + alert(response.message); + $('#sourceBranch').val('').trigger('chosen:updated'); + return false; + } + }); + }); + /* $('#targetProject').change(function() { diff --git a/module/mr/js/edit.js b/module/mr/js/edit.js index 9c443fa984..332f0425bc 100644 --- a/module/mr/js/edit.js +++ b/module/mr/js/edit.js @@ -1,26 +1,26 @@ $(function () - { +{ $('#repoID').change(function () - { + { repoID = $(this).val(); jobUrl = createLink('mr', 'ajaxGetJobList', "repoID=" + repoID); $.get(jobUrl, function (response) - { + { $('#jobID').html('').append(response); $('#jobID').chosen().trigger("chosen:updated");; - }); - }); + }); + }); $('#jobID').change(function () - { + { jobID = $(this).val(); compileUrl = createLink('mr', 'ajaxGetCompileList', "job=" + jobID); $.get(compileUrl, function (response) - { + { $('#compile').html('').append(response); $('#compile').chosen().trigger("chosen:updated");; - }); - }); + }); + }); $("#needCI").change(function() { @@ -28,4 +28,4 @@ $(function () if(this.checked == true) $("#jobID").parent().parent().removeClass('hidden'); }); $("#needCI").trigger('change'); - }); +}); diff --git a/module/mr/lang/en.php b/module/mr/lang/en.php index 22bdd4d3b4..a7ba3050cc 100644 --- a/module/mr/lang/en.php +++ b/module/mr/lang/en.php @@ -105,6 +105,7 @@ $lang->mr->apiError->createMR = "Failed to create a merge request through API. R $lang->mr->apiError->sudo = "Unable to operate with the GitLab account bound to the current user. Reason: %s"; $lang->mr->createFailedFromAPI = "Failed to create Merge Request."; +$lang->mr->hasOpenedMR = "There are other unclosed merge requests in the current source branch."; $lang->mr->accessGitlabFailed = "Unable to connect to the GitLab server."; $lang->mr->reopenSuccess = "The merge request was reopened."; $lang->mr->closeSuccess = "Merge request closed."; @@ -119,11 +120,11 @@ $lang->mr->from = "from"; $lang->mr->to = "to"; $lang->mr->at = "at"; -$lang->mr->pipeline = "Pipeline"; -$lang->mr->pipelineSuccess = "Success"; -$lang->mr->pipelineFailed = "Failed"; +$lang->mr->pipeline = "Pipeline"; +$lang->mr->pipelineSuccess = "Success"; +$lang->mr->pipelineFailed = "Failed"; $lang->mr->pipelineCanceled = "Canceled"; -$lang->mr->pipelineUnknown = "Unknown"; +$lang->mr->pipelineUnknown = "Unknown"; $lang->mr->pipelineStatus = array(); $lang->mr->pipelineStatus['success'] = "success"; diff --git a/module/mr/lang/zh-cn.php b/module/mr/lang/zh-cn.php index a3cf83111e..f64efc541c 100644 --- a/module/mr/lang/zh-cn.php +++ b/module/mr/lang/zh-cn.php @@ -105,6 +105,7 @@ $lang->mr->apiError->createMR = "通过API创建合并请求失败,失败原 $lang->mr->apiError->sudo = "无法以当前用户绑定的GitLab账户进行操作,失败原因:%s"; $lang->mr->createFailedFromAPI = "创建合并请求失败。"; +$lang->mr->hasOpenedMR = "当前源分支存在其他未关闭的合并请求"; $lang->mr->accessGitlabFailed = "当前无法连接到GitLab服务器。"; $lang->mr->reopenSuccess = "已重新打开合并请求。"; $lang->mr->closeSuccess = "已关闭合并请求。"; @@ -119,11 +120,11 @@ $lang->mr->from = "从"; $lang->mr->to = "合并到"; $lang->mr->at = "于"; -$lang->mr->pipeline = "流水线"; -$lang->mr->pipelineSuccess = "已通过"; -$lang->mr->pipelineFailed = "未通过"; +$lang->mr->pipeline = "流水线"; +$lang->mr->pipelineSuccess = "已通过"; +$lang->mr->pipelineFailed = "未通过"; $lang->mr->pipelineCanceled = "已取消"; -$lang->mr->pipelineUnknown = "未知"; +$lang->mr->pipelineUnknown = "未知"; $lang->mr->pipelineStatus = array(); $lang->mr->pipelineStatus['success'] = "已通过"; @@ -136,6 +137,7 @@ $lang->mr->hasNoConflict = "可以合并"; $lang->mr->acceptMR = "合并"; $lang->mr->mergeFailed = "无法合并,请核对合并请求状态"; $lang->mr->mergeSuccess = "已成功合并"; +$lang->mr->mergeSuccess = "已成功合并"; $lang->mr->todomessage = "项目中指派给你了"; diff --git a/module/mr/model.php b/module/mr/model.php index b1b900ed44..00d2fc94c3 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -93,6 +93,9 @@ class mrModel extends model ->add('createdDate', helper::now()) ->get(); + $result = $this->hasOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch); + if($result['result'] == 'fail') return $result; + /* Exec Job */ if(isset($MR->jobID) && $MR->jobID) { @@ -1398,4 +1401,33 @@ class mrModel extends model $this->action->create('task', $task->id, 'mergedmr', '', helper::createLink('mr', 'view', "mr={$MR->id}")); } } + + /** + * Check has opened mr + * + * @param int $gitlabID + * @param int $projectID + * @param string $sourceBranch + * @access public + * @return array + */ + public function hasOpened($gitlabID, $projectID, $sourceBranch) + { + if(empty($sourceBranch)) return array('result' => 'success'); + + $dbOpenedCount = $this->dao->select('count(*) as count')->from(TABLE_MR) + ->where('gitlabID')->eq($gitlabID) + ->andWhere('sourceProject')->eq($projectID) + ->andWhere('sourceBranch')->eq($sourceBranch) + ->andWhere('status')->eq('opened') + ->andWhere('deleted')->eq('0') + ->fetch('count'); + if($dbOpenedCount > 0) return array('result' => 'fail', 'message' => $this->lang->mr->hasOpenedMR); + + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/$projectID/merge_requests") . "&view=simple&state=opened&source_branch={$sourceBranch}"; + $response = json_decode(commonModel::http($url)); + if(!empty($response)) return array('result' => 'fail', 'message' => $this->lang->mr->hasOpenedMR); + + return array('result' => 'success'); + } } diff --git a/module/product/model.php b/module/product/model.php index 8d5c25ca81..f510624b06 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -852,7 +852,7 @@ class productModel extends model * @access public * @return array */ - public function getStories($productID, $branch, $browseType, $queryID, $moduleID, $type = 'story', $sort, $pager) + public function getStories($productID, $branch, $browseType, $queryID, $moduleID, $type = 'story', $sort = 'id_desc', $pager = null) { if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getStories(); From 9da21e20f0b8927dd0d1476737da172917341820 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Tue, 28 Dec 2021 15:45:09 +0800 Subject: [PATCH 05/36] * Finish task #46550. --- db/update16.0.sql | 1 + db/zentao.sql | 2 +- module/bug/lang/en.php | 1 + module/bug/lang/zh-cn.php | 1 + module/bug/lang/zh-tw.php | 1 + module/bug/model.php | 1 + module/bug/view/view.html.php | 15 +++++++++++++-- module/mr/model.php | 17 +++++++++++++++++ 8 files changed, 36 insertions(+), 3 deletions(-) diff --git a/db/update16.0.sql b/db/update16.0.sql index 53d062a7c2..670d7fa379 100644 --- a/db/update16.0.sql +++ b/db/update16.0.sql @@ -1 +1,2 @@ ALTER TABLE zt_productplan ADD `status` enum('wait','doing','done','closed') NOT NULL default 'wait' AFTER `title`; +ALTER TABLE zt_product modify column `reviewer` text NOT NULL; diff --git a/db/zentao.sql b/db/zentao.sql index 2b864ada9c..c733278613 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -933,7 +933,7 @@ CREATE TABLE IF NOT EXISTS `zt_product` ( `RD` varchar(30) NOT NULL, `acl` enum('open','private','custom') NOT NULL default 'open', `whitelist` text NOT NULL, - `reviewer` varchar(255) NOT NULL, + `reviewer` text NOT NULL, `createdBy` varchar(30) NOT NULL, `createdDate` datetime NOT NULL, `createdVersion` varchar(20) NOT NULL, diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php index 52773b0205..cceaed9529 100644 --- a/module/bug/lang/en.php +++ b/module/bug/lang/en.php @@ -164,6 +164,7 @@ $lang->bug->labelConfirmed = 'Confirmed'; $lang->bug->labelPostponed = 'Postponed'; $lang->bug->changed = 'Changed'; $lang->bug->storyChanged = 'Story Changed'; +$lang->bug->linkMR = 'Related MRs'; /* Page tags. */ $lang->bug->lblAssignedTo = 'AssignTo'; diff --git a/module/bug/lang/zh-cn.php b/module/bug/lang/zh-cn.php index aadb1f1fc8..2e2233ae5b 100644 --- a/module/bug/lang/zh-cn.php +++ b/module/bug/lang/zh-cn.php @@ -164,6 +164,7 @@ $lang->bug->labelConfirmed = '已确认'; $lang->bug->labelPostponed = '被延期'; $lang->bug->changed = '已变动'; $lang->bug->storyChanged = '需求变动'; +$lang->bug->linkMR = '相关合并请求'; /* 页面标签。*/ $lang->bug->lblAssignedTo = '当前指派'; diff --git a/module/bug/lang/zh-tw.php b/module/bug/lang/zh-tw.php index 4e6f711d3e..3a4e4f26c6 100644 --- a/module/bug/lang/zh-tw.php +++ b/module/bug/lang/zh-tw.php @@ -164,6 +164,7 @@ $lang->bug->labelConfirmed = '已確認'; $lang->bug->labelPostponed = '被延期'; $lang->bug->changed = '已變動'; $lang->bug->storyChanged = '需求變動'; +$lang->bug->linkMR = '相關合并請求'; /* 頁面標籤。*/ $lang->bug->lblAssignedTo = '當前指派'; diff --git a/module/bug/model.php b/module/bug/model.php index f1518ab47e..4258a0b02d 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -495,6 +495,7 @@ class bugModel extends model if($bug->linkBug) $bug->linkBugTitles = $this->dao->select('id,title')->from(TABLE_BUG)->where('id')->in($bug->linkBug)->fetchPairs(); if($bug->toStory > 0) $bug->toStoryTitle = $this->dao->findById($bug->toStory)->from(TABLE_STORY)->fields('title')->fetch('title'); if($bug->toTask > 0) $bug->toTaskTitle = $this->dao->findById($bug->toTask)->from(TABLE_TASK)->fields('name')->fetch('name'); + $bug->linkMRTitles = $this->loadModel('mr')->getLinkedMRPairs($bugID, 'bug'); $bug->toCases = array(); $toCases = $this->dao->select('id, title')->from(TABLE_CASE)->where('`fromBug`')->eq($bugID)->fetchAll(); diff --git a/module/bug/view/view.html.php b/module/bug/view/view.html.php index d5e2d774f2..f49ecaf530 100644 --- a/module/bug/view/view.html.php +++ b/module/bug/view/view.html.php @@ -374,7 +374,7 @@ - + case):?> - + @@ -418,6 +418,17 @@ + + + +
bug->linkBug;?>bug->linkBug;?> linkBugTitles)) @@ -389,7 +389,7 @@
bug->fromCase;?>bug->fromCase;?> createLink('testcase', 'view', "caseID=$bug->case&caseVersion=" . ($bug->testtask ? "&from=testtask&taskID={$bug->testtask}" : ''), '', true), "#$bug->case $bug->caseTitle", '', "class='iframe' data-width='80%'");?>
createLink('task', 'view', "taskID=$bug->toTask", '', true), "#$bug->toTask $bug->toTaskTitle", '', "class='iframe' data-width='80%'");?>
bug->linkMR;?> + linkMRTitles as $MRID => $linkMRTitle) + { + echo html::a($this->createLink('mr', 'view', "MRID=$MRID"), "#$MRID $linkMRTitle") . '
'; + } + ?> +
diff --git a/module/mr/model.php b/module/mr/model.php index a62b597c90..b04bbc65e2 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -1252,6 +1252,23 @@ class mrModel extends model return $links; } + /** + * Get linked MR pairs. + * + * @param int $objectID + * @param string $objectType + * @access public + * @return array + */ + public function getLinkedMRPairs($objectID, $objectType = 'story') + { + return $this->dao->select("t2.id,t2.title")->from(TABLE_RELATION)->alias('t1') + ->leftJoin(TABLE_MR)->alias('t2')->on('t1.AID = t2.id') + ->where('t1.AType')->eq('mr') + ->andWhere('t1.BID')->eq($objectID) + ->fetchPairs(); + } + /** * Create an mr link. * From 601e4498b0eee9e90c793ee3cf3f4fa7e329fd7b Mon Sep 17 00:00:00 2001 From: zenggang Date: Tue, 28 Dec 2021 08:10:12 +0000 Subject: [PATCH 06/36] * Finish task#46547 --- module/repo/control.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/repo/control.php b/module/repo/control.php index 2cca58e03b..2af03a2ee3 100644 --- a/module/repo/control.php +++ b/module/repo/control.php @@ -563,6 +563,7 @@ class repo extends control $this->commonAction($repoID, $objectID); $this->scm->setEngine($repo); $log = $this->scm->log('', $revision, $revision); + $log[0]->comment = $this->repo->replaceCommentLink($log[0]->comment); $history = $this->dao->select('*')->from(TABLE_REPOHISTORY)->where('revision')->eq($log[0]->revision)->andWhere('repo')->eq($repoID)->fetch(); if($history) From 293c00235eb53b311a9d3f4c7f09e98522090c6c Mon Sep 17 00:00:00 2001 From: Wenrui LI Date: Tue, 28 Dec 2021 16:22:16 +0800 Subject: [PATCH 07/36] * tweak repos rules api, send raw rules only. --- module/repo/control.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/module/repo/control.php b/module/repo/control.php index 2cca58e03b..8d936e8b70 100644 --- a/module/repo/control.php +++ b/module/repo/control.php @@ -1206,12 +1206,6 @@ class repo extends control */ public function ajaxGetRules() { - $regRules = $this->repo->processRules(); - $rawRules = $this->config->repo->rules; - - $data = array(); - $data['reg'] = $regRules; - $data['raw'] = $rawRules; - return $this->send(array('status' => 'success', 'rules' => json_encode($data))); + return $this->send(array('status' => 'success', 'rules' => $this->config->repo->rules)); } } From 2a4c3cfa0ee48c51ed77a4516685a7db2bf10959 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A1=E6=A0=8B?= Date: Tue, 28 Dec 2021 16:55:35 +0800 Subject: [PATCH 08/36] * code for task #46552. --- module/mr/model.php | 57 +++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/module/mr/model.php b/module/mr/model.php index 00d2fc94c3..0ce3787f0c 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -140,21 +140,8 @@ class mrModel extends model { $this->dao->delete()->from(TABLE_MR)->where('id')->eq($MRID)->exec(); - foreach($this->lang->mr->apiErrorMap as $key => $errorMsg) - { - if(strpos($errorMsg, '/') === 0) - { - $result = preg_match($errorMsg, $rawMR->message[0], $matches); - if($result) $errorMessage = sprintf(zget($this->lang->mr->errorLang, $key), $matches[1]); - } - else - { - if($rawMR->message[0] == $errorMsg) $errorMessage = zget($this->lang->mr->errorLang, $key, $rawMR->message[0]); - } - - if(isset($errorMessage)) break; - } - return array('result' => 'fail', 'message' => sprintf($this->lang->mr->apiError->createMR, isset($errorMessage) ? $errorMessage : $rawMR->message[0])); + $errorMessage = $this->convertApiError($rawMR->message); + return array('result' => 'fail', 'message' => sprintf($this->lang->mr->apiError->createMR, $errorMessage)); } /* Create MR failed. */ @@ -218,6 +205,13 @@ class mrModel extends model $MR->createdBy = $this->app->user->account; $MR->createdDate = date('Y-m-d H:i:s'); + $result = $this->hasOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch); + if($result['result'] == 'fail') + { + dao::$errors[] = $result['message']; + return false; + } + $this->dao->insert(TABLE_MR)->data($MR, $this->config->mr->create->skippedFields) ->batchCheck($this->config->mr->apicreate->requiredFields, 'notempty') ->autoCheck() @@ -274,6 +268,7 @@ class mrModel extends model ->get(); $oldMR = $this->getByID($MRID); + $this->dao->update(TABLE_MR)->data($MR)->checkIF($MR->needCI, 'jobID', 'notempty'); if(dao::isError()) return array('result' => 'fail', 'message' => dao::getError()); @@ -304,6 +299,11 @@ class mrModel extends model /* Known issue: `reviewer_ids` takes no effect. */ $rawMR = $this->apiUpdateMR($oldMR->gitlabID, $oldMR->targetProject, $oldMR->mriid, $newMR); + if(!isset($rawMR->id) and isset($rawMR->message)) + { + $errorMessage = $this->convertApiError($rawMR->message); + return array('result' => 'fail', 'message' => $errorMessage); + } /* Update MR in Zentao database. */ $this->dao->update(TABLE_MR)->data($MR, $this->config->mr->edit->skippedFields) @@ -1430,4 +1430,31 @@ class mrModel extends model return array('result' => 'success'); } + + /** + * Convert API error. + * + * @param array $message + * @access public + * @return string + */ + public function convertApiError($message) + { + foreach($this->lang->mr->apiErrorMap as $key => $errorMsg) + { + if(strpos($errorMsg, '/') === 0) + { + $result = preg_match($errorMsg, $message[0], $matches); + if($result) $errorMessage = sprintf(zget($this->lang->mr->errorLang, $key), $matches[1]); + } + else + { + if($message[0] == $errorMsg) $errorMessage = zget($this->lang->mr->errorLang, $key, $message[0]); + } + + if(isset($errorMessage)) break; + } + + return isset($errorMessage) ? $errorMessage : $message[0]; + } } From 0ba53391eb30682b183ecffe204385dbe92d4c48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A1=E6=A0=8B?= Date: Wed, 29 Dec 2021 08:36:58 +0800 Subject: [PATCH 09/36] * adjust for error. --- module/mr/control.php | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/module/mr/control.php b/module/mr/control.php index 5905fff006..87ff04889d 100644 --- a/module/mr/control.php +++ b/module/mr/control.php @@ -150,21 +150,19 @@ class mr extends control $this->loadModel('job'); $this->loadModel('compile'); - $repoList = array(); + $repoList = array(); $rawRepoList = $this->repo->getGitLabRepoList($MR->gitlabID, $MR->sourceProject); foreach($rawRepoList as $rawRepo) $repoList[$rawRepo->id] = "[$rawRepo->id] $rawRepo->name"; $jobList = array(); - $rawJobList = $this->job->getListByRepoID($MR->repoID); - foreach($rawJobList as $rawJob) $jobList[$rawJob->id] = "[$rawJob->id] $rawJob->name"; + if($MR->repoID) + { + $rawJobList = $this->job->getListByRepoID($MR->repoID); + foreach($rawJobList as $rawJob) $jobList[$rawJob->id] = "[$rawJob->id] $rawJob->name"; + } - $compileList = array(); - $rawCompileList = $this->compile->getListByJobID($MR->jobID); - foreach($rawCompileList as $rawCompile) $compileList[$rawCompile->id] = "[$rawCompile->id] [{$this->lang->compile->statusList[$rawCompile->status]}] $rawCompile->name"; - - $this->view->repoList = $repoList; - $this->view->jobList = !empty($MR->repoID) ? $jobList : array(); - $this->view->compileList = !empty($MR->jobID) ? $compileList : array(); + $this->view->repoList = $repoList; + $this->view->jobList = !empty($MR->repoID) ? $jobList : array(); $this->view->title = $this->lang->mr->edit; $this->view->MR = $MR; From 2e7530441ba7d4cf348e30ab9c65f13f508504b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A1=E6=A0=8B?= Date: Wed, 29 Dec 2021 09:49:43 +0800 Subject: [PATCH 10/36] * adjust for task #46552. --- module/gitlab/model.php | 2 +- module/mr/control.php | 6 ++--- module/mr/js/create.js | 55 ++++++++++++++++++++-------------------- module/mr/lang/en.php | 2 +- module/mr/lang/zh-cn.php | 2 +- module/mr/model.php | 13 +++++----- 6 files changed, 39 insertions(+), 41 deletions(-) diff --git a/module/gitlab/model.php b/module/gitlab/model.php index 94669970c6..6878bbd7fa 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -608,7 +608,7 @@ class gitlabModel extends model * @access public * @return array */ - public function apiGetProjectsPager($gitlabID, $keyword = '', $orderBy, $pager) + public function apiGetProjectsPager($gitlabID, $keyword = '', $orderBy = 'id_desc', $pager = null) { $gitlab = $this->getByID($gitlabID); if(!$gitlab) return array(); diff --git a/module/mr/control.php b/module/mr/control.php index 87ff04889d..9f444d984a 100644 --- a/module/mr/control.php +++ b/module/mr/control.php @@ -937,17 +937,17 @@ class mr extends control } /** - * Ajax check opened mr. + * Ajax check same opened mr for source branch. * * @param int $gitlabID * @param int $projectID * @access public * @return void */ - public function ajaxCheckOpened($gitlabID, $projectID) + public function ajaxCheckSameOpened($gitlabID, $projectID) { $sourceBranch = $this->post->sourceBranch; - $result = $this->mr->hasOpened($gitlabID, $projectID, $sourceBranch); + $result = $this->mr->hasSameOpened($gitlabID, $projectID, $sourceBranch); die(json_encode($result)); } } diff --git a/module/mr/js/create.js b/module/mr/js/create.js index a929fd61ad..8d13b154b3 100644 --- a/module/mr/js/create.js +++ b/module/mr/js/create.js @@ -2,10 +2,10 @@ $(function() { $('#gitlabID').change(function() { - gitlabID = $('#gitlabID').val(); + var gitlabID = $('#gitlabID').val(); if(gitlabID == '') return false; - url = createLink('repo', 'ajaxgetgitlabprojects', "gitlabID=" + gitlabID); + var url = createLink('repo', 'ajaxgetgitlabprojects', "gitlabID=" + gitlabID); $.get(url, function(response) { $('#sourceProject').html('').append(response); @@ -15,9 +15,9 @@ $(function() $('#sourceProject,#targetProject').change(function() { - sourceProject = $(this).val(); + var sourceProject = $(this).val(); var branchSelect = $(this).parents('td').find('select[name*=Branch]'); - branchUrl = createLink('gitlab', 'ajaxgetprojectbranches', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); + var branchUrl = createLink('gitlab', 'ajaxgetprojectbranches', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); $.get(branchUrl, function(response) { branchSelect.html('').append(response); @@ -28,15 +28,15 @@ $(function() $('#sourceProject').change(function() { - sourceProject = $(this).val(); - projectUrl = createLink('mr', 'ajaxGetMRTargetProjects', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); + var sourceProject = $(this).val(); + var projectUrl = createLink('mr', 'ajaxGetMRTargetProjects', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); $.get(projectUrl, function(response) { $('#targetProject').html('').append(response); $('#targetProject').chosen().trigger("chosen:updated");; }); - repoUrl = createLink('mr', 'ajaxGetRepoList', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); + var repoUrl = createLink('mr', 'ajaxGetRepoList', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); $.get(repoUrl, function(response) { $('#repoID').html('').append(response); @@ -48,7 +48,7 @@ $(function() { var gitlabID = $('#gitlabID').val(); var sourceProject = $('#sourceProject').val(); - repoUrl = createLink('mr', 'ajaxCheckOpened', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); + var repoUrl = createLink('mr', 'ajaxCheckSameOpened', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); var sourceBranch = $(this).val(); $.post(repoUrl, {"sourceBranch": sourceBranch}, function(response) @@ -82,8 +82,8 @@ $(function() $('#repoID').change(function() { - repoID = $(this).val(); - jobUrl = createLink('mr', 'ajaxGetJobList', "repoID=" + repoID); + var repoID = $(this).val(); + var jobUrl = createLink('mr', 'ajaxGetJobList', "repoID=" + repoID); $.get(jobUrl, function(response) { $('#jobID').html('').append(response); @@ -93,8 +93,8 @@ $(function() $('#jobID').change(function() { - jobID = $(this).val(); - compileUrl = createLink('mr', 'ajaxGetCompileList', "job=" + jobID); + var jobID = $(this).val(); + var compileUrl = createLink('mr', 'ajaxGetCompileList', "job=" + jobID); $.get(compileUrl, function(response) { $('#compile').html('').append(response); @@ -102,20 +102,19 @@ $(function() }); }); - $("#needCI").change(function() - { - if(this.checked == false) - { - $("#jobID").prop("disabled", true); - $('#jobID').chosen().trigger("chosen:updated");; - $("#jobID").parent().parent().addClass('hidden'); - } - if(this.checked == true) - { - $("#jobID").prop("disabled", false); - $('#jobID').chosen().trigger("chosen:updated");; - $("#jobID").parent().parent().removeClass('hidden'); - } - }); - + $("#needCI").change(function() + { + if(this.checked == false) + { + $("#jobID").prop("disabled", true); + $('#jobID').chosen().trigger("chosen:updated");; + $("#jobID").parent().parent().addClass('hidden'); + } + if(this.checked == true) + { + $("#jobID").prop("disabled", false); + $('#jobID').chosen().trigger("chosen:updated");; + $("#jobID").parent().parent().removeClass('hidden'); + } + }); }); diff --git a/module/mr/lang/en.php b/module/mr/lang/en.php index a7ba3050cc..eeb57fffa4 100644 --- a/module/mr/lang/en.php +++ b/module/mr/lang/en.php @@ -105,7 +105,7 @@ $lang->mr->apiError->createMR = "Failed to create a merge request through API. R $lang->mr->apiError->sudo = "Unable to operate with the GitLab account bound to the current user. Reason: %s"; $lang->mr->createFailedFromAPI = "Failed to create Merge Request."; -$lang->mr->hasOpenedMR = "There are other unclosed merge requests in the current source branch."; +$lang->mr->hasSameOpenedMR = "There are other unclosed merge requests in the current source branch."; $lang->mr->accessGitlabFailed = "Unable to connect to the GitLab server."; $lang->mr->reopenSuccess = "The merge request was reopened."; $lang->mr->closeSuccess = "Merge request closed."; diff --git a/module/mr/lang/zh-cn.php b/module/mr/lang/zh-cn.php index f64efc541c..c8e00e8635 100644 --- a/module/mr/lang/zh-cn.php +++ b/module/mr/lang/zh-cn.php @@ -105,7 +105,7 @@ $lang->mr->apiError->createMR = "通过API创建合并请求失败,失败原 $lang->mr->apiError->sudo = "无法以当前用户绑定的GitLab账户进行操作,失败原因:%s"; $lang->mr->createFailedFromAPI = "创建合并请求失败。"; -$lang->mr->hasOpenedMR = "当前源分支存在其他未关闭的合并请求"; +$lang->mr->hasSameOpenedMR = "当前源分支存在其他未关闭的合并请求"; $lang->mr->accessGitlabFailed = "当前无法连接到GitLab服务器。"; $lang->mr->reopenSuccess = "已重新打开合并请求。"; $lang->mr->closeSuccess = "已关闭合并请求。"; diff --git a/module/mr/model.php b/module/mr/model.php index 0ce3787f0c..61cf6cf0d6 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -93,7 +93,7 @@ class mrModel extends model ->add('createdDate', helper::now()) ->get(); - $result = $this->hasOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch); + $result = $this->hasSameOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch); if($result['result'] == 'fail') return $result; /* Exec Job */ @@ -205,7 +205,7 @@ class mrModel extends model $MR->createdBy = $this->app->user->account; $MR->createdDate = date('Y-m-d H:i:s'); - $result = $this->hasOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch); + $result = $this->hasSameOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch); if($result['result'] == 'fail') { dao::$errors[] = $result['message']; @@ -268,7 +268,6 @@ class mrModel extends model ->get(); $oldMR = $this->getByID($MRID); - $this->dao->update(TABLE_MR)->data($MR)->checkIF($MR->needCI, 'jobID', 'notempty'); if(dao::isError()) return array('result' => 'fail', 'message' => dao::getError()); @@ -1403,7 +1402,7 @@ class mrModel extends model } /** - * Check has opened mr + * Has same opened mr for source branch. * * @param int $gitlabID * @param int $projectID @@ -1411,7 +1410,7 @@ class mrModel extends model * @access public * @return array */ - public function hasOpened($gitlabID, $projectID, $sourceBranch) + public function hasSameOpened($gitlabID, $projectID, $sourceBranch) { if(empty($sourceBranch)) return array('result' => 'success'); @@ -1422,11 +1421,11 @@ class mrModel extends model ->andWhere('status')->eq('opened') ->andWhere('deleted')->eq('0') ->fetch('count'); - if($dbOpenedCount > 0) return array('result' => 'fail', 'message' => $this->lang->mr->hasOpenedMR); + if($dbOpenedCount > 0) return array('result' => 'fail', 'message' => $this->lang->mr->hasSameOpenedMR); $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/$projectID/merge_requests") . "&view=simple&state=opened&source_branch={$sourceBranch}"; $response = json_decode(commonModel::http($url)); - if(!empty($response)) return array('result' => 'fail', 'message' => $this->lang->mr->hasOpenedMR); + if(!empty($response)) return array('result' => 'fail', 'message' => $this->lang->mr->hasSameOpenedMR); return array('result' => 'success'); } From 8e98e9831e257acf7869614ddb084bbb78a25dee Mon Sep 17 00:00:00 2001 From: liyuchun Date: Wed, 29 Dec 2021 10:02:25 +0800 Subject: [PATCH 11/36] * Finish task #46551. --- module/bug/view/view.html.php | 3 +- module/mr/model.php | 1 + module/task/control.php | 1 + module/task/css/view.css | 3 +- module/task/lang/en.php | 2 + module/task/lang/zh-cn.php | 2 + module/task/lang/zh-tw.php | 2 + module/task/view/view.html.php | 93 +++++++++++++++++++++------------- 8 files changed, 69 insertions(+), 38 deletions(-) diff --git a/module/bug/view/view.html.php b/module/bug/view/view.html.php index f49ecaf530..e78543347a 100644 --- a/module/bug/view/view.html.php +++ b/module/bug/view/view.html.php @@ -422,9 +422,10 @@ bug->linkMR;?> linkMRTitles as $MRID => $linkMRTitle) { - echo html::a($this->createLink('mr', 'view', "MRID=$MRID"), "#$MRID $linkMRTitle") . '
'; + echo ($canViewMR ? html::a($this->createLink('mr', 'view', "MRID=$MRID"), "#$MRID $linkMRTitle") : "#$MRID $linkMRTitle"). '
'; } ?> diff --git a/module/mr/model.php b/module/mr/model.php index b04bbc65e2..9dde940a95 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -208,6 +208,7 @@ class mrModel extends model $MR->title = $this->lang->mr->common . ' ' . $postData->RepoSrcBranch . $this->lang->mr->to . $postData->RepoDistBranch ; $MR->repoID = $repo->id; $MR->jobID = isset($repo->job->id) ? $repo->job->id : 0; + $MR->status = 'opened'; $MR->synced = '0'; $MR->needCI = '1'; $MR->hasNoConflict = $postData->MergeStatus ? '0' : '1'; diff --git a/module/task/control.php b/module/task/control.php index 5e4706d579..ec2a2c18e3 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -717,6 +717,7 @@ class task extends control $taskID = (int)$taskID; $task = $this->task->getById($taskID, true); + $task->linkMRTitles = $this->loadModel('mr')->getLinkedMRPairs($taskID, 'task'); if(!$task) { if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'code' => 404, 'message' => '404 Not found')); diff --git a/module/task/css/view.css b/module/task/css/view.css index e605f6862d..184f37b904 100644 --- a/module/task/css/view.css +++ b/module/task/css/view.css @@ -2,4 +2,5 @@ .side-col #legendProjectAndTask .list-unstyled {padding: 10px; border: 1px solid #ddd; border-top: 0px; margin: 0px;} .tab-pane table {border: 1px solid #ddd; border-top: none;} .page-title{max-width: 80%; overflow: hidden; white-space: nowrap; text-overflow: ellipsis;} -.pull-left{max-width: 80%;} +.pull-left{max-width: 80%;} +.MRThWidth {width: 90px !important;} diff --git a/module/task/lang/en.php b/module/task/lang/en.php index b2c4b83bd8..3bcf8c4d71 100644 --- a/module/task/lang/en.php +++ b/module/task/lang/en.php @@ -160,6 +160,7 @@ $lang->task->noFinished = 'Unfinished'; $lang->task->noClosed = 'Unclosed'; $lang->task->yesterdayFinished = 'Task Finished Yesterday'; $lang->task->allTasks = 'Task'; +$lang->task->linkMR = 'Related MRs'; $lang->task->statusList[''] = ''; $lang->task->statusList['wait'] = 'Waiting'; @@ -199,6 +200,7 @@ $lang->task->legendEffort = 'Effort'; $lang->task->legendLife = 'Task Life'; $lang->task->legendDesc = 'Task Description'; $lang->task->legendDetail = 'Task Detail'; +$lang->task->legendMisc = 'Misc.'; $lang->task->confirmDelete = "Do you want to delete this task?"; $lang->task->confirmDeleteEstimate = "Do you want to delete it?"; diff --git a/module/task/lang/zh-cn.php b/module/task/lang/zh-cn.php index 58f414913c..4fb358e04c 100644 --- a/module/task/lang/zh-cn.php +++ b/module/task/lang/zh-cn.php @@ -160,6 +160,7 @@ $lang->task->noFinished = '未完成'; $lang->task->noClosed = '未关闭'; $lang->task->yesterdayFinished = '昨日完成任务数'; $lang->task->allTasks = '总任务'; +$lang->task->linkMR = '相关合并请求'; $lang->task->statusList[''] = ''; $lang->task->statusList['wait'] = '未开始'; @@ -199,6 +200,7 @@ $lang->task->legendEffort = '工时信息'; $lang->task->legendLife = '任务的一生'; $lang->task->legendDesc = '任务描述'; $lang->task->legendDetail = '任务详情'; +$lang->task->legendMisc = '其他相关'; $lang->task->confirmDelete = "您确定要删除这个任务吗?"; $lang->task->confirmDeleteEstimate = "您确定要删除这个记录吗?"; diff --git a/module/task/lang/zh-tw.php b/module/task/lang/zh-tw.php index acee6d80c1..fd1e4663c8 100644 --- a/module/task/lang/zh-tw.php +++ b/module/task/lang/zh-tw.php @@ -160,6 +160,7 @@ $lang->task->noFinished = '未完成'; $lang->task->noClosed = '未關閉'; $lang->task->yesterdayFinished = '昨日完成任務數'; $lang->task->allTasks = '總任務'; +$lang->task->linkMR = '相關合并請求'; $lang->task->statusList[''] = ''; $lang->task->statusList['wait'] = '未開始'; @@ -199,6 +200,7 @@ $lang->task->legendEffort = '工時信息'; $lang->task->legendLife = '任務的一生'; $lang->task->legendDesc = '任務描述'; $lang->task->legendDetail = '任務詳情'; +$lang->task->legendMisc = '其他相關'; $lang->task->confirmDelete = "您確定要刪除這個任務嗎?"; $lang->task->confirmDeleteEstimate = "您確定要刪除這個記錄嗎?"; diff --git a/module/task/view/view.html.php b/module/task/view/view.html.php index f01ccc738f..e1cd5919d2 100644 --- a/module/task/view/view.html.php +++ b/module/task/view/view.html.php @@ -359,43 +359,64 @@ -
-
- task->legendEffort;?> -
- - - - - - - - - - - - - - - - - - - - - - - - - -
task->estimate;?>estimate . $lang->workingHour;?>
task->consumed;?>consumed, 2) . $lang->workingHour;?>
task->left;?>left . $lang->workingHour;?>
task->estStarted;?>estStarted;?>
task->realStarted;?>realStarted) ? '' : $task->realStarted; ?>
task->deadline;?> - deadline; - if(isset($task->delay)) printf($lang->task->delayWarning, $task->delay); - ?> -
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
task->estimate;?>estimate . $lang->workingHour;?>
task->consumed;?>consumed, 2) . $lang->workingHour;?>
task->left;?>left . $lang->workingHour;?>
task->estStarted;?>estStarted;?>
task->realStarted;?>realStarted) ? '' : $task->realStarted; ?>
task->deadline;?> + deadline; + if(isset($task->delay)) printf($lang->task->delayWarning, $task->delay); + ?> +
+
+
+ + + + + +
task->linkMR;?> + linkMRTitles as $MRID => $linkMRTitle) + { + echo ($canViewMR ? html::a($this->createLink('mr', 'view', "MRID=$MRID"), "#$MRID $linkMRTitle") : "#$MRID $linkMRTitle"). '
'; + } + ?> +
+
-
+
printExtendFields($task, 'div', "position=right&inForm=0&inCell=1");?> From 2b44879ba25c81dcdd5f54f07534dfaee2db930c Mon Sep 17 00:00:00 2001 From: liyuchun Date: Wed, 29 Dec 2021 10:24:39 +0800 Subject: [PATCH 12/36] * Adjust code style. --- module/bug/view/view.html.php | 2 +- module/task/view/view.html.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/bug/view/view.html.php b/module/bug/view/view.html.php index e78543347a..92b6ac9fe1 100644 --- a/module/bug/view/view.html.php +++ b/module/bug/view/view.html.php @@ -425,7 +425,7 @@ $canViewMR = common::hasPriv('mr', 'view'); foreach($bug->linkMRTitles as $MRID => $linkMRTitle) { - echo ($canViewMR ? html::a($this->createLink('mr', 'view', "MRID=$MRID"), "#$MRID $linkMRTitle") : "#$MRID $linkMRTitle"). '
'; + echo ($canViewMR ? html::a($this->createLink('mr', 'view', "MRID=$MRID"), "#$MRID $linkMRTitle") : "#$MRID $linkMRTitle") . '
'; } ?> diff --git a/module/task/view/view.html.php b/module/task/view/view.html.php index e1cd5919d2..4419a122a1 100644 --- a/module/task/view/view.html.php +++ b/module/task/view/view.html.php @@ -408,7 +408,7 @@ $canViewMR = common::hasPriv('mr', 'view'); foreach($task->linkMRTitles as $MRID => $linkMRTitle) { - echo ($canViewMR ? html::a($this->createLink('mr', 'view', "MRID=$MRID"), "#$MRID $linkMRTitle") : "#$MRID $linkMRTitle"). '
'; + echo ($canViewMR ? html::a($this->createLink('mr', 'view', "MRID=$MRID"), "#$MRID $linkMRTitle") : "#$MRID $linkMRTitle") . '
'; } ?> From 8e4cfa874472d533be0f374bbafe5317b0aff1e7 Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 29 Dec 2021 02:29:19 +0000 Subject: [PATCH 13/36] * Finish task#46549 --- module/mr/model.php | 1 + module/mr/view/link.html.php | 2 +- module/story/control.php | 2 ++ module/story/lang/en.php | 1 + module/story/lang/zh-cn.php | 1 + module/story/view/view.html.php | 25 +++++++++++++++++++++++-- 6 files changed, 29 insertions(+), 3 deletions(-) diff --git a/module/mr/model.php b/module/mr/model.php index 935bfdc44e..2bb641bc74 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -1267,6 +1267,7 @@ class mrModel extends model return $this->dao->select("t2.id,t2.title")->from(TABLE_RELATION)->alias('t1') ->leftJoin(TABLE_MR)->alias('t2')->on('t1.AID = t2.id') ->where('t1.AType')->eq('mr') + ->andWhere('t1.BType')->eq($objectType) ->andWhere('t1.BID')->eq($objectID) ->fetchPairs(); } diff --git a/module/mr/view/link.html.php b/module/mr/view/link.html.php index c262074e44..ca9c0c33bf 100644 --- a/module/mr/view/link.html.php +++ b/module/mr/view/link.html.php @@ -168,7 +168,7 @@ id);?> bug->priList, $bug->pri, $bug->pri);?> - createLink('bug', 'view', "bugID=$bug->id"), $bug->title, '', 'data-app="product"');?> + createLink('bug', 'view', "bugID=$bug->id"), $bug->title);?> openedBy);?> assignedTo);?> diff --git a/module/story/control.php b/module/story/control.php index d7bd5edc46..85b5b0b843 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1014,6 +1014,7 @@ class story extends control $bugs = $this->dao->select('id,title')->from(TABLE_BUG)->where('story')->eq($storyID)->andWhere('deleted')->eq(0)->fetchAll(); $fromBug = $this->dao->select('id,title')->from(TABLE_BUG)->where('toStory')->eq($storyID)->fetch(); $cases = $this->dao->select('id,title')->from(TABLE_CASE)->where('story')->eq($storyID)->andWhere('deleted')->eq(0)->fetchAll(); + $linkedMRs = $this->loadModel('mr')->getLinkedMRPairs($storyID, 'story'); $modulePath = $this->tree->getParents($story->module); $storyModule = empty($story->module) ? '' : $this->tree->getById($story->module); @@ -1054,6 +1055,7 @@ class story extends control $this->view->fromBug = $fromBug; $this->view->cases = $cases; $this->view->story = $story; + $this->view->linkedMRs = $linkedMRs; $this->view->track = $this->story->getTrackByID($story->id); $this->view->users = $this->user->getPairs('noletter'); $this->view->reviewers = $reviewers; diff --git a/module/story/lang/en.php b/module/story/lang/en.php index a9adae2caa..666f2dbf96 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -163,6 +163,7 @@ $lang->story->field = 'Sync Field'; $lang->story->completeRate = 'Completion Rate'; $lang->story->reviewed = 'Reviewed'; $lang->story->toBeReviewed = 'To Be Reviewed'; +$lang->story->linkMR = 'Related MRs'; $lang->story->ditto = 'Ditto'; $lang->story->dittoNotice = 'This story is not linked to the same product as the last one is!'; diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php index 12a9b6aae6..b05db77036 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -163,6 +163,7 @@ $lang->story->field = '同步的字段'; $lang->story->completeRate = '完成率'; $lang->story->reviewed = '已评审'; $lang->story->toBeReviewed = '待评审'; +$lang->story->linkMR = '相关合并请求'; $lang->story->ditto = '同上'; $lang->story->dittoNotice = "该{$lang->SRCommon}与上一{$lang->SRCommon}不属于同一产品!"; diff --git a/module/story/view/view.html.php b/module/story/view/view.html.php index 6795aa8542..cdcbc70bed 100644 --- a/module/story/view/view.html.php +++ b/module/story/view/view.html.php @@ -502,7 +502,7 @@ - story->legendFromBug;?> + story->legendFromBug;?>
    id $fromBug->title'>" . html::a($this->createLink('bug', 'view', "bugID=$fromBug->id", '', true), "#$fromBug->id $fromBug->title", '', "class='iframe' data-width='80%'") . '';?> @@ -511,7 +511,7 @@ - story->legendBugs;?> + story->legendBugs;?>
      + + story->linkMR;?> + +
        + $linkMRTitle) + { + if($mrPriv) + { + echo "
      • " . html::a($this->createLink('mr', 'view', "MRID=$MRID"), "#$MRID $linkMRTitle") . '
      • '; + } + else + { + echo "
      • " . "#$MRID $linkMRTitle" . '
      • '; + } + } + ?> +
      + + From b9c8bd4afd072b06e9d96e7d559588da8dfaf7ab Mon Sep 17 00:00:00 2001 From: liyuchun Date: Wed, 29 Dec 2021 10:45:05 +0800 Subject: [PATCH 14/36] * Fix error when change source project. --- module/mr/js/create.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/mr/js/create.js b/module/mr/js/create.js index 8d13b154b3..58152558a2 100644 --- a/module/mr/js/create.js +++ b/module/mr/js/create.js @@ -2,7 +2,7 @@ $(function() { $('#gitlabID').change(function() { - var gitlabID = $('#gitlabID').val(); + gitlabID = $('#gitlabID').val(); if(gitlabID == '') return false; var url = createLink('repo', 'ajaxgetgitlabprojects', "gitlabID=" + gitlabID); From 4991afb982d9bd8c4f0a746b6cac9393b2f15b52 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Wed, 29 Dec 2021 13:45:40 +0800 Subject: [PATCH 15/36] * Fix bug #18047. --- module/task/control.php | 20 ++++++++++---------- module/task/view/view.html.php | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/module/task/control.php b/module/task/control.php index ec2a2c18e3..4e0ea51e68 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -717,7 +717,6 @@ class task extends control $taskID = (int)$taskID; $task = $this->task->getById($taskID, true); - $task->linkMRTitles = $this->loadModel('mr')->getLinkedMRPairs($taskID, 'task'); if(!$task) { if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'code' => 404, 'message' => '404 Not found')); @@ -761,15 +760,16 @@ class task extends control $position[] = $this->lang->task->common; $position[] = $this->lang->task->view; - $this->view->title = $title; - $this->view->position = $position; - $this->view->execution = $execution; - $this->view->task = $task; - $this->view->actions = $this->loadModel('action')->getList('task', $taskID); - $this->view->users = $this->loadModel('user')->getPairs('noletter'); - $this->view->preAndNext = $this->loadModel('common')->getPreAndNextObject('task', $taskID); - $this->view->product = $this->tree->getProduct($task->module); - $this->view->modulePath = $this->tree->getParents($task->module); + $this->view->title = $title; + $this->view->position = $position; + $this->view->execution = $execution; + $this->view->task = $task; + $this->view->actions = $this->loadModel('action')->getList('task', $taskID); + $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->preAndNext = $this->loadModel('common')->getPreAndNextObject('task', $taskID); + $this->view->product = $this->tree->getProduct($task->module); + $this->view->modulePath = $this->tree->getParents($task->module); + $this->view->linkMRTitles = $this->loadModel('mr')->getLinkedMRPairs($taskID, 'task'); $this->display(); } diff --git a/module/task/view/view.html.php b/module/task/view/view.html.php index 4419a122a1..7186a973f0 100644 --- a/module/task/view/view.html.php +++ b/module/task/view/view.html.php @@ -406,7 +406,7 @@ linkMRTitles as $MRID => $linkMRTitle) + foreach($linkMRTitles as $MRID => $linkMRTitle) { echo ($canViewMR ? html::a($this->createLink('mr', 'view', "MRID=$MRID"), "#$MRID $linkMRTitle") : "#$MRID $linkMRTitle") . '
      '; } From 625a6a47c4653d17f27fcc8e4ef33d80614d709b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A1=E6=A0=8B?= Date: Thu, 30 Dec 2021 08:38:54 +0800 Subject: [PATCH 16/36] * code for task #46553. --- module/ci/model.php | 34 ++++++++++----------------- module/mr/control.php | 11 +++++---- module/mr/js/create.js | 27 ++++++++++++++-------- module/mr/model.php | 52 +++++++++++++++++++++++++++++++----------- 4 files changed, 75 insertions(+), 49 deletions(-) diff --git a/module/ci/model.php b/module/ci/model.php index f4d43bd0fb..a32c355c9c 100644 --- a/module/ci/model.php +++ b/module/ci/model.php @@ -230,21 +230,13 @@ class ciModel extends model */ if(isset($rawMR->message) and !isset($rawMR->iid)) { - foreach($this->lang->mr->apiErrorMap as $key => $errorMsg) + $errorMessage = $rawMR->message; + $rawMR = $this->mr->apiGetSameOpened($relateMR->gitlabID, $relateMR->sourceProject, $MRObject->source_branch, $MRObject->target_project_id, $MRObject->target_branch); + if(empty($rawMR) or !isset($rawMR->iid)) { - if(strpos($errorMsg, '/') === 0) - { - $result = preg_match($errorMsg, $rawMR->message[0], $matches); - if($result) $errorMessage = sprintf(zget($this->lang->mr->errorLang, $key), $matches[1]); - } - else - { - if($rawMR->message[0] == $errorMsg) $errorMessage = zget($this->lang->mr->errorLang, $key, $rawMR->message[0]); - } - - if(isset($errorMessage)) break; + $errorMessage = $this->mr->convertApiError($errorMessage); + $newMR->syncError = sprintf($this->lang->mr->apiError->createMR, $errorMessage); } - $newMR->syncError = sprintf($this->lang->mr->apiError->createMR, isset($errorMessage) ? $errorMessage : $rawMR->message[0]); } elseif(!isset($rawMR->iid)) { @@ -253,24 +245,22 @@ class ciModel extends model if(!empty($rawMR->iid)) { - $newMR->mriid = $rawMR->iid; - $newMR->status = $rawMR->state; - $newMR->synced = '1'; + $newMR->mriid = $rawMR->iid; + $newMR->status = $rawMR->state; + $newMR->synced = '1'; + $newMR->syncError = ''; } - $this->dao->update(TABLE_MR)->data($newMR) - ->where('id')->eq($relateMR->id) - ->exec(); + $this->dao->update(TABLE_MR)->data($newMR)->where('id')->eq($relateMR->id)->exec(); } else { $newMR = new stdclass(); + $newMR->status = 'closed'; $newMR->mergeStatus = 'cannot_merge_by_fail'; $newMR->compileStatus = $status; - $this->dao->update(TABLE_MR)->data($newMR) - ->where('id')->eq($relateMR->id) - ->exec(); + $this->dao->update(TABLE_MR)->data($newMR)->where('id')->eq($relateMR->id)->exec(); } } diff --git a/module/mr/control.php b/module/mr/control.php index 9f444d984a..8bb34c0d73 100644 --- a/module/mr/control.php +++ b/module/mr/control.php @@ -940,14 +940,17 @@ class mr extends control * Ajax check same opened mr for source branch. * * @param int $gitlabID - * @param int $projectID * @access public * @return void */ - public function ajaxCheckSameOpened($gitlabID, $projectID) + public function ajaxCheckSameOpened($gitlabID) { - $sourceBranch = $this->post->sourceBranch; - $result = $this->mr->hasSameOpened($gitlabID, $projectID, $sourceBranch); + $sourceProject = $this->post->sourceProject; + $sourceBranch = $this->post->sourceBranch; + $targetProject = $this->post->targetProject; + $targetBranch = $this->post->targetBranch; + + $result = $this->mr->hasSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); die(json_encode($result)); } } diff --git a/module/mr/js/create.js b/module/mr/js/create.js index 58152558a2..6414507f6c 100644 --- a/module/mr/js/create.js +++ b/module/mr/js/create.js @@ -2,7 +2,7 @@ $(function() { $('#gitlabID').change(function() { - gitlabID = $('#gitlabID').val(); + var gitlabID = $('#gitlabID').val(); if(gitlabID == '') return false; var url = createLink('repo', 'ajaxgetgitlabprojects', "gitlabID=" + gitlabID); @@ -15,9 +15,10 @@ $(function() $('#sourceProject,#targetProject').change(function() { + var gitlabID = $('#gitlabID').val(); var sourceProject = $(this).val(); - var branchSelect = $(this).parents('td').find('select[name*=Branch]'); - var branchUrl = createLink('gitlab', 'ajaxgetprojectbranches', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); + var branchSelect = $(this).parents('td').find('select[name*=Branch]'); + var branchUrl = createLink('gitlab', 'ajaxgetprojectbranches', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); $.get(branchUrl, function(response) { branchSelect.html('').append(response); @@ -28,8 +29,9 @@ $(function() $('#sourceProject').change(function() { + var gitlabID = $('#gitlabID').val(); var sourceProject = $(this).val(); - var projectUrl = createLink('mr', 'ajaxGetMRTargetProjects', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); + var projectUrl = createLink('mr', 'ajaxGetMRTargetProjects', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); $.get(projectUrl, function(response) { $('#targetProject').html('').append(response); @@ -44,20 +46,24 @@ $(function() }); }); - $('#sourceBranch').change(function() + $('#sourceBranch,#targetBranch').change(function() { - var gitlabID = $('#gitlabID').val(); var sourceProject = $('#sourceProject').val(); - var repoUrl = createLink('mr', 'ajaxCheckSameOpened', "gitlabID=" + gitlabID + "&projectID=" + sourceProject); + var sourceBranch = $('#sourceBranch').val(); + var targetProject = $('#targetProject').val(); + var targetBranch = $('#targetBranch').val(); + if(!sourceProject || !sourceBranch || !targetProject || !targetBranch) return false; - var sourceBranch = $(this).val(); - $.post(repoUrl, {"sourceBranch": sourceBranch}, function(response) + var $this = $(this); + var gitlabID = $('#gitlabID').val(); + var repoUrl = createLink('mr', 'ajaxCheckSameOpened', "gitlabID=" + gitlabID); + $.post(repoUrl, {"sourceProject": sourceProject, "sourceBranch": sourceBranch, "targetProject": targetProject, "targetBranch": targetBranch}, function(response) { response = $.parseJSON(response); if(response.result == 'fail') { alert(response.message); - $('#sourceBranch').val('').trigger('chosen:updated'); + $this.val('').trigger('chosen:updated'); return false; } }); @@ -67,6 +73,7 @@ $(function() $('#targetProject').change(function() { targetProject = $(this).val(); + var gitlabID = $('#gitlabID').val(); var assignee = $("#assignee").parents('td').find('select[name*=assignee]'); var reviewer = $("#reviewer").parents('td').find('select[name*=reviewer]'); usersUrl = createLink('gitlab', 'ajaxgetmruserpairs', "gitlabID=" + gitlabID + "&projectID=" + targetProject); diff --git a/module/mr/model.php b/module/mr/model.php index 8dee1fddbc..029f69e3ce 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -93,7 +93,7 @@ class mrModel extends model ->add('createdDate', helper::now()) ->get(); - $result = $this->hasSameOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch); + $result = $this->hasSameOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch, $MR->targetProject, $MR->targetBranch); if($result['result'] == 'fail') return $result; /* Exec Job */ @@ -206,7 +206,7 @@ class mrModel extends model $MR->createdBy = $this->app->user->account; $MR->createdDate = date('Y-m-d H:i:s'); - $result = $this->hasSameOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch); + $result = $this->hasSameOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch, $MR->targetProject, $MR->targetBranch); if($result['result'] == 'fail') { dao::$errors[] = $result['message']; @@ -534,6 +534,32 @@ class mrModel extends model return json_decode(commonModel::http($url)); } + /** + * Get same opened mr by api. + * + * @param int $gitlabID + * @param int $sourceProject + * @param string $sourceBranch + * @param int $targetProject + * @param string $targetBranch + * @access public + * @return object + */ + public function apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch) + { + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/merge_requests") . "&state=opened&source_branch={$sourceBranch}&target_branch={$targetBranch}&source_project_id={$sourceProject}&target_project_id={$targetProject}"; + $response = json_decode(commonModel::http($url)); + + if($response) + { + foreach($response as $mr) + { + if($mr->source_project_id == $sourceProject and $mr->target_project_id == $targetProject) return $mr; + } + } + return null; + } + /** * Get single MR by API. * @@ -1424,28 +1450,29 @@ class mrModel extends model * Has same opened mr for source branch. * * @param int $gitlabID - * @param int $projectID + * @param int $sourceProject * @param string $sourceBranch + * @param int $targetProject + * @param string $targetBranch * @access public * @return array */ - public function hasSameOpened($gitlabID, $projectID, $sourceBranch) + public function hasSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch) { - if(empty($sourceBranch)) return array('result' => 'success'); + if(empty($sourceProject) or empty($sourceBranch) or empty($targetProject) or empty($targetBranch)) return array('result' => 'success'); $dbOpenedCount = $this->dao->select('count(*) as count')->from(TABLE_MR) ->where('gitlabID')->eq($gitlabID) - ->andWhere('sourceProject')->eq($projectID) + ->andWhere('sourceProject')->eq($sourceProject) ->andWhere('sourceBranch')->eq($sourceBranch) + ->andWhere('targetProject')->eq($targetProject) + ->andWhere('targetBranch')->eq($targetBranch) ->andWhere('status')->eq('opened') ->andWhere('deleted')->eq('0') ->fetch('count'); if($dbOpenedCount > 0) return array('result' => 'fail', 'message' => $this->lang->mr->hasSameOpenedMR); - $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/$projectID/merge_requests") . "&view=simple&state=opened&source_branch={$sourceBranch}"; - $response = json_decode(commonModel::http($url)); - if(!empty($response)) return array('result' => 'fail', 'message' => $this->lang->mr->hasSameOpenedMR); - + if($this->apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch)) return array('result' => 'fail', 'message' => $this->lang->mr->hasSameOpenedMR); return array('result' => 'success'); } @@ -1464,15 +1491,14 @@ class mrModel extends model { $result = preg_match($errorMsg, $message[0], $matches); if($result) $errorMessage = sprintf(zget($this->lang->mr->errorLang, $key), $matches[1]); + break; } else { if($message[0] == $errorMsg) $errorMessage = zget($this->lang->mr->errorLang, $key, $message[0]); + break; } - - if(isset($errorMessage)) break; } - return isset($errorMessage) ? $errorMessage : $message[0]; } } From 061bf4388c8132286cd33b1deb185c4d6a018ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A1=E6=A0=8B?= Date: Thu, 30 Dec 2021 10:08:00 +0800 Subject: [PATCH 17/36] * adjust for unit test. --- module/common/model.php | 2 +- module/company/model.php | 14 ++-- module/mr/control.php | 2 +- module/mr/model.php | 27 ++++--- test/model/mr/apigetsameopened.php | 123 +++++++++++++++++++++++++++++ test/model/mr/checksameopened.php | 112 ++++++++++++++++++++++++++ test/model/mr/convertapierror.php | 26 ++++++ 7 files changed, 286 insertions(+), 20 deletions(-) create mode 100644 test/model/mr/apigetsameopened.php create mode 100644 test/model/mr/checksameopened.php create mode 100644 test/model/mr/convertapierror.php diff --git a/module/common/model.php b/module/common/model.php index 41dac7f075..1da0b66be8 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -1360,7 +1360,7 @@ class commonModel extends model * @access public * @return bool */ - public static function printLink($module, $method, $vars = '', $label, $target = '', $misc = '', $newline = true, $onlyBody = false, $object = null) + public static function printLink($module, $method, $vars = '', $label = '', $target = '', $misc = '', $newline = true, $onlyBody = false, $object = null) { /* Add data-app attribute. */ global $app; diff --git a/module/company/model.php b/module/company/model.php index a287493aa8..7cf87d3d11 100644 --- a/module/company/model.php +++ b/module/company/model.php @@ -15,7 +15,7 @@ class companyModel extends model { /** * Set menu. - * + * * @param int $dept * @access public * @return void @@ -31,7 +31,7 @@ class companyModel extends model /** * Get company list. - * + * * @access public * @return void */ @@ -42,7 +42,7 @@ class companyModel extends model /** * Get the first company. - * + * * @access public * @return void */ @@ -53,8 +53,8 @@ class companyModel extends model /** * Get company info by id. - * - * @param int $companyID + * + * @param int $companyID * @access public * @return object */ @@ -74,7 +74,7 @@ class companyModel extends model * @access public * @return array */ - public function getUsers($browseType = 'inside', $type, $queryID, $deptID, $sort, $pager) + public function getUsers($browseType = 'inside', $type = '', $queryID = 0, $deptID = 0, $sort = '', $pager = null) { /* Get users. */ if($type == 'bydept') @@ -131,7 +131,7 @@ class companyModel extends model /** * Update a company. - * + * * @access public * @return void */ diff --git a/module/mr/control.php b/module/mr/control.php index 8bb34c0d73..198e03cd04 100644 --- a/module/mr/control.php +++ b/module/mr/control.php @@ -950,7 +950,7 @@ class mr extends control $targetProject = $this->post->targetProject; $targetBranch = $this->post->targetBranch; - $result = $this->mr->hasSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); + $result = $this->mr->checkSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); die(json_encode($result)); } } diff --git a/module/mr/model.php b/module/mr/model.php index 029f69e3ce..ef93ad079c 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -93,7 +93,7 @@ class mrModel extends model ->add('createdDate', helper::now()) ->get(); - $result = $this->hasSameOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch, $MR->targetProject, $MR->targetBranch); + $result = $this->checkSameOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch, $MR->targetProject, $MR->targetBranch); if($result['result'] == 'fail') return $result; /* Exec Job */ @@ -206,7 +206,7 @@ class mrModel extends model $MR->createdBy = $this->app->user->account; $MR->createdDate = date('Y-m-d H:i:s'); - $result = $this->hasSameOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch, $MR->targetProject, $MR->targetBranch); + $result = $this->checkSameOpened($MR->gitlabID, $MR->sourceProject, $MR->sourceBranch, $MR->targetProject, $MR->targetBranch); if($result['result'] == 'fail') { dao::$errors[] = $result['message']; @@ -547,13 +547,16 @@ class mrModel extends model */ public function apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch) { - $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/merge_requests") . "&state=opened&source_branch={$sourceBranch}&target_branch={$targetBranch}&source_project_id={$sourceProject}&target_project_id={$targetProject}"; + if(empty($gitlabID) or empty($sourceProject) or empty($sourceBranch) or empty($targetProject) or empty($targetBranch)) return null; + + $url = sprintf($this->loadModel('gitlab')->getApiRoot((int)$gitlabID), "/merge_requests") . "&state=opened&source_branch={$sourceBranch}&target_branch={$targetBranch}&source_project_id={$sourceProject}&target_project_id={$targetProject}"; $response = json_decode(commonModel::http($url)); if($response) { foreach($response as $mr) { + if(empty($mr->source_project_id) or empty($mr->target_project_id)) return null; if($mr->source_project_id == $sourceProject and $mr->target_project_id == $targetProject) return $mr; } } @@ -1447,7 +1450,7 @@ class mrModel extends model } /** - * Has same opened mr for source branch. + * Check same opened mr for source branch. * * @param int $gitlabID * @param int $sourceProject @@ -1457,7 +1460,7 @@ class mrModel extends model * @access public * @return array */ - public function hasSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch) + public function checkSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch) { if(empty($sourceProject) or empty($sourceBranch) or empty($targetProject) or empty($targetBranch)) return array('result' => 'success'); @@ -1485,20 +1488,22 @@ class mrModel extends model */ public function convertApiError($message) { + if(is_array($message)) $message = $message[0]; + if(!is_string($message)) return $message; + foreach($this->lang->mr->apiErrorMap as $key => $errorMsg) { if(strpos($errorMsg, '/') === 0) { - $result = preg_match($errorMsg, $message[0], $matches); + $result = preg_match($errorMsg, $message, $matches); if($result) $errorMessage = sprintf(zget($this->lang->mr->errorLang, $key), $matches[1]); - break; } - else + elseif($message == $errorMsg) { - if($message[0] == $errorMsg) $errorMessage = zget($this->lang->mr->errorLang, $key, $message[0]); - break; + $errorMessage = zget($this->lang->mr->errorLang, $key, $message); } + if(isset($errorMessage)) break; } - return isset($errorMessage) ? $errorMessage : $message[0]; + return isset($errorMessage) ? $errorMessage : $message; } } diff --git a/test/model/mr/apigetsameopened.php b/test/model/mr/apigetsameopened.php new file mode 100644 index 0000000000..1d698a3e8a --- /dev/null +++ b/test/model/mr/apigetsameopened.php @@ -0,0 +1,123 @@ +#!/usr/bin/env php +> success +使用空的gitlabID >> null +使用空的sourceProject >> null +使用空的sourceBranch >> null +使用空的targetProject >> null +使用空的targetBranch >> null +使用错误的gitlabID >> null +使用错误的sourceProject >> null +使用错误的sourceBranch >> null +使用错误的targetProject >> null +使用错误的targetBranch >> null + +*/ +$mrModel = $tester->loadModel('mr'); + +$gitlabID = '2'; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +if(isset($result->iid)) $result = 'success'; +r($result) && p() && e('success'); //使用正确的gitlabID, sourceProject,sourceBranch,targetProject,targetBranch + +$gitlabID = ''; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +if($result === null) $result = 'null'; +r($result) && p() && e('null'); //使用空的gitlabID + +$gitlabID = '1'; +$sourceProject = ''; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +if($result === null) $result = 'null'; +r($result) && p() && e('null'); //使用空的sourceProject + +$gitlabID = '1'; +$sourceProject = '42'; +$sourceBranch = ''; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +if($result === null) $result = 'null'; +r($result) && p() && e('null'); //使用空的sourceBranch + +$gitlabID = '1'; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = ''; +$targetBranch = 'master'; +$result = $mrModel->apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +if($result === null) $result = 'null'; +r($result) && p() && e('null'); //使用空的targetProject + +$gitlabID = '1'; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = ''; +$result = $mrModel->apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +if($result === null) $result = 'null'; +r($result) && p() && e('null'); //使用空的targetBranch + +$gitlabID = 'test'; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +if($result === null) $result = 'null'; +r($result) && p() && e('null'); //使用错误的gitlabID + +$gitlabID = '1'; +$sourceProject = 'test'; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +if($result === null) $result = 'null'; +r($result) && p() && e('null'); //使用错误的sourceProject + +$gitlabID = '1'; +$sourceProject = '42'; +$sourceBranch = 'branch08'; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +if($result === null) $result = 'null'; +r($result) && p() && e('null'); //使用错误的sourceBranch + +$gitlabID = '1'; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = 'test'; +$targetBranch = 'master'; +$result = $mrModel->apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +if($result === null) $result = 'null'; +r($result) && p() && e('null'); //使用错误的targetProject + +$gitlabID = '1'; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = 'main'; +$result = $mrModel->apiGetSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +if($result === null) $result = 'null'; +r($result) && p() && e('null'); //使用错误的targetBranch diff --git a/test/model/mr/checksameopened.php b/test/model/mr/checksameopened.php new file mode 100644 index 0000000000..4b8079ed39 --- /dev/null +++ b/test/model/mr/checksameopened.php @@ -0,0 +1,112 @@ +#!/usr/bin/env php +> fail +使用空的gitlabID >> success +使用空的sourceProject >> success +使用空的sourceBranch >> success +使用空的targetProject >> success +使用空的targetBranch >> success +使用错误的gitlabID >> success +使用错误的sourceProject >> success +使用错误的sourceBranch >> success +使用错误的targetProject >> success +使用错误的targetBranch >> success + +*/ +$mrModel = $tester->loadModel('mr'); + +$gitlabID = '2'; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->checkSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +r($result) && p('result') && e('fail'); //使用正确的gitlabID, sourceProject,sourceBranch,targetProject,targetBranch + +$gitlabID = ''; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->checkSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +r($result) && p('result') && e('success'); //使用空的gitlabID + +$gitlabID = '1'; +$sourceProject = ''; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->checkSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +r($result) && p('result') && e('success'); //使用空的sourceProject + +$gitlabID = '1'; +$sourceProject = '42'; +$sourceBranch = ''; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->checkSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +r($result) && p('result') && e('success'); //使用空的sourceBranch + +$gitlabID = '1'; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = ''; +$targetBranch = 'master'; +$result = $mrModel->checkSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +r($result) && p('result') && e('success'); //使用空的targetProject + +$gitlabID = '1'; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = ''; +$result = $mrModel->checkSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +r($result) && p('result') && e('success'); //使用空的targetBranch + +$gitlabID = 'test'; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->checkSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +r($result) && p('result') && e('success'); //使用错误的gitlabID + +$gitlabID = '1'; +$sourceProject = 'test'; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->checkSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +r($result) && p('result') && e('success'); //使用错误的sourceProject + +$gitlabID = '1'; +$sourceProject = '42'; +$sourceBranch = 'branch08'; +$targetProject = '42'; +$targetBranch = 'master'; +$result = $mrModel->checkSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +r($result) && p('result') && e('success'); //使用错误的sourceBranch + +$gitlabID = '1'; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = 'test'; +$targetBranch = 'master'; +$result = $mrModel->checkSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +r($result) && p('result') && e('success'); //使用错误的targetProject + +$gitlabID = '1'; +$sourceProject = '42'; +$sourceBranch = 'branch-08'; +$targetProject = '42'; +$targetBranch = 'main'; +$result = $mrModel->checkSameOpened($gitlabID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); +r($result) && p('result') && e('success'); //使用错误的targetBranch diff --git a/test/model/mr/convertapierror.php b/test/model/mr/convertapierror.php new file mode 100644 index 0000000000..d2034d01b5 --- /dev/null +++ b/test/model/mr/convertapierror.php @@ -0,0 +1,26 @@ +#!/usr/bin/env php +> success +使用空的message >> success + +*/ +$mrModel = $tester->loadModel('mr'); + +$message = array(); +$message[0] = 'Another open merge request already exists for this source branch: !11'; +$result = $mrModel->convertApiError($message); +if($result != $message[0]) $result = 'success'; +r($result) && p('') && e('success'); //使用正确的message + +$message = ''; +$result = $mrModel->convertApiError($message); +if(empty($result)) $result = 'success'; +r($result) && p('') && e('success'); //使用空的message From 134cd55f46aee8333ec6c6ead15884179060e9f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A1=E6=A0=8B?= Date: Thu, 30 Dec 2021 10:31:19 +0800 Subject: [PATCH 18/36] * adjust for task #46553. --- module/mr/model.php | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/module/mr/model.php b/module/mr/model.php index ef93ad079c..cf23d16c21 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -160,10 +160,7 @@ class mrModel extends model $newMR->mergeStatus = $rawMR->merge_status; /* Update MR in Zentao database. */ - $this->dao->update(TABLE_MR)->data($newMR) - ->where('id')->eq($MRID) - ->autoCheck() - ->exec(); + $this->dao->update(TABLE_MR)->data($newMR)->where('id')->eq($MRID)->autoCheck()->exec(); if(dao::isError()) return array('result' => 'fail', 'message' => dao::getError()); return array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => helper::createLink('mr', 'browse')); } @@ -238,13 +235,11 @@ class mrModel extends model else { $newMR->compileStatus = $pipeline->status; + if($newMR->compileStatus == 'create_fail') $newMR->status = 'closed'; } /* Update MR in Zentao database. */ - $this->dao->update(TABLE_MR)->data($newMR) - ->where('id')->eq($MRID) - ->autoCheck() - ->exec(); + $this->dao->update(TABLE_MR)->data($newMR)->where('id')->eq($MRID)->autoCheck()->exec(); if(dao::isError()) return false; } return true; From 7c5be1093ef5f1a6d4d9e1bf519da877c67f84f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A1=E6=A0=8B?= Date: Thu, 30 Dec 2021 10:38:01 +0800 Subject: [PATCH 19/36] * adjust code task #46553. --- module/mr/model.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/mr/model.php b/module/mr/model.php index cf23d16c21..30698c0562 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -231,6 +231,7 @@ class mrModel extends model $compile = $this->loadModel('compile')->getByQueue($pipeline->queue); $newMR->compileID = $compile->id; $newMR->compileStatus = $compile->status; + if($newMR->compileStatus == 'failure') $newMR->status = 'closed'; } else { From bfde525f1349ecce65fdc16833d3497f3d17faf8 Mon Sep 17 00:00:00 2001 From: zenggang Date: Thu, 30 Dec 2021 03:08:42 +0000 Subject: [PATCH 20/36] * Finish task#46555 --- module/action/lang/en.php | 1 + module/action/lang/zh-cn.php | 1 + module/gitlab/control.php | 98 +++++++++++++++++++++++ module/gitlab/css/browsetagpriv.css | 7 ++ module/gitlab/js/browsetagpriv.js | 17 ++++ module/gitlab/lang/en.php | 5 ++ module/gitlab/lang/zh-cn.php | 5 ++ module/gitlab/model.php | 53 +++++++++++- module/gitlab/view/browsetagpriv.html.php | 80 ++++++++++++++++++ module/group/lang/resource.php | 2 + module/mr/view/link.html.php | 2 +- 11 files changed, 268 insertions(+), 3 deletions(-) create mode 100644 module/gitlab/css/browsetagpriv.css create mode 100644 module/gitlab/js/browsetagpriv.js create mode 100644 module/gitlab/view/browsetagpriv.html.php diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 445d378656..5577a82341 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -126,6 +126,7 @@ $lang->action->objectTypes['gitlabgroup'] = 'GitLab Group'; $lang->action->objectTypes['gitlabbranch'] = 'GitLab Branch'; $lang->action->objectTypes['gitlabbranchpriv'] = 'GitLab Protected Branches'; $lang->action->objectTypes['gitlabtag'] = 'GitLab Tag'; +$lang->action->objectTypes['gitlabtagpriv'] = 'GitLab Tag Protected'; $lang->action->objectTypes['kanbanspace'] = 'Kanban Space'; $lang->action->objectTypes['kanban'] = 'Kanban'; $lang->action->objectTypes['kanbanregion'] = 'Kanban Region'; diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 9285bf0bb9..264b9ef824 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -126,6 +126,7 @@ $lang->action->objectTypes['gitlabgroup'] = 'GitLab群组'; $lang->action->objectTypes['gitlabbranch'] = 'GitLab分支'; $lang->action->objectTypes['gitlabbranchpriv'] = 'GitLab保护分支'; $lang->action->objectTypes['gitlabtag'] = 'GitLab标签'; +$lang->action->objectTypes['gitlabtagpriv'] = 'GitLab标签保护'; $lang->action->objectTypes['kanbanspace'] = '看板空间'; $lang->action->objectTypes['kanban'] = '看板'; $lang->action->objectTypes['kanbanregion'] = '看板区域'; diff --git a/module/gitlab/control.php b/module/gitlab/control.php index a56097db8f..23a991f8c1 100644 --- a/module/gitlab/control.php +++ b/module/gitlab/control.php @@ -974,6 +974,104 @@ class gitlab extends control $this->display(); } + /** + * Browse gitlab protect tag. + * + * @param int $gitlabID + * @param int $projectID + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ + public function browseTagPriv($gitlabID, $projectID, $orderBy = 'name_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) + { + $this->session->set('gitlabTagPrivList', $this->app->getURI(true)); + $keyword = fixer::input('post')->setDefault('keyword', '')->get('keyword'); + + $gitlabTags = array(); + $allTags = $this->gitlab->apiGetTags($gitlabID, $projectID); + foreach($allTags as $tag) + { + $gitlabTags[$tag->name] = $tag; + } + + $tagList = array(); + $gitlabProtectTags = $this->gitlab->apiGetTagPrivs($gitlabID, $projectID); + foreach($gitlabProtectTags as $gitlabProtectTag) + { + $tag = new stdClass(); + $tag->name = $gitlabProtectTag->name; + $tag->lastCommitter = isset($gitlabTags[$tag->name]) ? $gitlabTags[$tag->name]->commit->committer_name : ''; + $tag->accessLevels = $gitlabProtectTag->create_access_levels; + + $tagList[] = $tag; + } + + /* Data search. */ + if($keyword) + { + foreach($tagList as $key => $tag) + { + if(strpos($tag->name, $keyword) === false) unset($tagList[$key]); + } + $tagList = array_values($tagList); + } + + /* Data sort. */ + list($order, $sort) = explode('_', $orderBy); + $orderList = array(); + foreach($tagList as $tag) + { + $orderList[] = $tag->$order; + } + array_multisort($orderList, $sort == 'desc' ? SORT_DESC : SORT_ASC, $tagList); + + /* Pager. */ + $this->app->loadClass('pager', $static = true); + $recTotal = count($tagList); + $pager = new pager($recTotal, $recPerPage, $pageID); + $tagList = array_chunk($tagList, $pager->recPerPage); + + $this->view->gitlab = $this->gitlab->getByID($gitlabID); + $this->view->pager = $pager; + $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->browseTagPriv; + $this->view->levelLang = $this->lang->gitlab->branch->branchCreationLevelList; + $this->view->gitlabID = $gitlabID; + $this->view->projectID = $projectID; + $this->view->keyword = $keyword; + $this->view->project = $this->gitlab->apiGetSingleProject($gitlabID, $projectID); + $this->view->gitlabTagList = empty($tagList) ? $tagList: $tagList[$pageID - 1]; + $this->view->orderBy = $orderBy; + $this->display(); + } + + /** + * Delete a gitlab protect tag. + * + * @param int $gitlabID + * @param int $projectID + * @param string $tag + * @access public + * @return void + */ + public function deleteTagPriv($gitlabID, $projectID, $tag) + { + $tag = base64_decode($tag); + $reponse = $this->gitlab->apiDeleteTagPriv($gitlabID, $projectID, $tag); + + /* If the status code beginning with 20 is returned or empty is returned, it is successful. */ + if(!$reponse or substr($reponse->message, 0, 2) == '20') + { + $this->loadModel('action')->create('gitlabtagpriv', 0, 'deleted', '', $tag); + die(js::reload('parent')); + } + + die(js::alert($reponse->message)); + } + /** * Import gitlab issue to zentaopms. * diff --git a/module/gitlab/css/browsetagpriv.css b/module/gitlab/css/browsetagpriv.css new file mode 100644 index 0000000000..671f36d275 --- /dev/null +++ b/module/gitlab/css/browsetagpriv.css @@ -0,0 +1,7 @@ +.text-c-counts > span {margin-left: 5px;} +#mainMenu .pull-left {margin-right: 15px;} +.c-actions-1 {width: 60px;} + +#gitlabTagList .text-c-name .has-prefix{position: relative; display: flex; align-items: center;} +#gitlabTagList .text-c-name .label {flex: none;} +#gitlabTagList .text-c-name .tag-name {display: inline-block; max-width: calc(100% - 50px); padding-right: 10px;} diff --git a/module/gitlab/js/browsetagpriv.js b/module/gitlab/js/browsetagpriv.js new file mode 100644 index 0000000000..68a15f6a9f --- /dev/null +++ b/module/gitlab/js/browsetagpriv.js @@ -0,0 +1,17 @@ +$(document).ready(function() +{ + $('#tagSearch').click(function() + { + triggerSearch(); + }); + $('#keyword').keypress(function(event) + { + if(event.which == 13) triggerSearch(); + }) + +}); + +function triggerSearch() +{ + $("#tagForm").submit(); +} diff --git a/module/gitlab/lang/en.php b/module/gitlab/lang/en.php index 48b3fadaec..836580879c 100644 --- a/module/gitlab/lang/en.php +++ b/module/gitlab/lang/en.php @@ -55,6 +55,9 @@ $lang->gitlab->editBranchPriv = 'Edit branch protected'; $lang->gitlab->deleteBranchPriv = 'Delete branch protected'; $lang->gitlab->createTag = 'Create Tag'; $lang->gitlab->deleteTag = 'Delete tag'; +$lang->gitlab->createTagPriv = 'Add tag protected'; +$lang->gitlab->editTagPriv = 'Edit tag protected'; +$lang->gitlab->deleteTagPriv = 'Delete tag protected'; $lang->gitlab->id = 'ID'; $lang->gitlab->name = "GitLab Name"; @@ -219,3 +222,5 @@ $lang->gitlab->tag->emptyRefError = "Create from cannot be empty."; $lang->gitlab->tag->issetNameError = "The tag already exists"; $lang->gitlab->tag->confirmDelete = 'Do you want to delete this GitLab tag?'; $lang->gitlab->tag->protected = 'Protected'; +$lang->gitlab->tag->accessLevel = 'Allow creation'; +$lang->gitlab->tag->protectConfirmDel = 'Do you want to delete this GitLab tag protected?'; diff --git a/module/gitlab/lang/zh-cn.php b/module/gitlab/lang/zh-cn.php index 4a147bb5bc..a5dc16191b 100644 --- a/module/gitlab/lang/zh-cn.php +++ b/module/gitlab/lang/zh-cn.php @@ -55,6 +55,9 @@ $lang->gitlab->editBranchPriv = '编辑分支保护'; $lang->gitlab->deleteBranchPriv = '删除分支保护'; $lang->gitlab->createTag = '创建标签'; $lang->gitlab->deleteTag = '删除标签'; +$lang->gitlab->createTagPriv = '添加标签保护'; +$lang->gitlab->editTagPriv = '编辑标签保护'; +$lang->gitlab->deleteTagPriv = '删除标签保护'; $lang->gitlab->id = 'ID'; $lang->gitlab->name = "{$lang->gitlab->common}名称"; @@ -219,3 +222,5 @@ $lang->gitlab->tag->emptyRefError = "创建自不能为空"; $lang->gitlab->tag->issetNameError = "已存在该标签"; $lang->gitlab->tag->confirmDelete = '确认删除该GitLab标签吗?'; $lang->gitlab->tag->protected = '受保护'; +$lang->gitlab->tag->accessLevel = '允许创建'; +$lang->gitlab->tag->protectConfirmDel = '确认删除该GitLab标签保护吗?'; diff --git a/module/gitlab/model.php b/module/gitlab/model.php index 6878bbd7fa..de7d38d12a 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -1485,8 +1485,16 @@ class gitlabModel extends model if(!$pager) { - $url = sprintf($apiRoot, "/projects/{$projectID}/repository/tags"); - return json_decode(commonModel::http($url)); + $allResults = array(); + $url = sprintf($apiRoot, "/projects/{$projectID}/repository/tags"); + for($page = 1; true; $page++) + { + $results = json_decode(commonModel::http($url . "&&page={$page}&per_page=100")); + if(!empty($results)) $allResults = array_merge($allResults, $results); + if(count($results)<100) break; + } + + return $allResults; } else { @@ -1521,6 +1529,47 @@ class gitlabModel extends model return json_decode(commonModel::http($url, array(), $options = array(CURLOPT_CUSTOMREQUEST => 'DELETE'))); } + /** + * Get protect tags of one project. + * + * @param int $gitlabID + * @param int $projectID + * @access public + * @return void + */ + public function apiGetTagPrivs($gitlabID, $projectID) + { + $apiRoot = $this->getApiRoot($gitlabID); + $url = sprintf($apiRoot, "/projects/{$projectID}/protected_tags"); + + $allResults = array(); + for($page = 1; true; $page++) + { + $results = json_decode(commonModel::http($url . "&&page={$page}&per_page=100")); + if(!empty($results)) $allResults = array_merge($allResults, $results); + if(count($results)<100) break; + } + + return $allResults; + } + + /** + * Delete a gitab protect tag by api. + * + * @param int $gitlabID + * @param int $projectID + * @param string $tag + * @access public + * @return object + */ + public function apiDeleteTagPriv($gitlabID, $projectID, $tag) + { + if(empty($gitlabID)) return false; + $apiRoot = $this->getApiRoot($gitlabID); + $url = sprintf($apiRoot, "/projects/{$projectID}/protected_tags/{$tag}"); + return json_decode(commonModel::http($url, array(), $options = array(CURLOPT_CUSTOMREQUEST => 'DELETE'))); + } + /** * Check webhook token by HTTP_X_GITLAB_TOKEN. * diff --git a/module/gitlab/view/browsetagpriv.html.php b/module/gitlab/view/browsetagpriv.html.php new file mode 100644 index 0000000000..2422e598b9 --- /dev/null +++ b/module/gitlab/view/browsetagpriv.html.php @@ -0,0 +1,80 @@ + + * @package gitlab + * @version $Id$ + * @link http://www.zentao.net + */ +?> + +recTotal}&recPerPage={$pager->recPerPage}&pageID=1")?> + + + +
      +

      + noData;?> + + createLink('gitlab', 'createTagPriv', "gitlabID=$gitlabID&projectID=$projectID"), " " . $lang->gitlab->createTagPriv, '', "class='btn btn-info'");?> + +

      +
      + +
      +
      + + recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}";?> + + + + + + + + + + $gitlabTag): ?> + accessLevel = $this->gitlab->checkAccessLevel($gitlabTag->accessLevels); ?> + + + + + + + + +
      gitlab->tag->name);?>gitlab->tag->lastCommitter;?>gitlab->tag->accessLevel);?>actions;?>
      name;?>lastCommitter;?>accessLevel];?> + name}", " ", '', "title={$lang->gitlab->editTagPriv} class='btn btn-primary'"); + common::printLink('gitlab', 'deleteTagPriv', "gitlabID=$gitlabID&projectID={$projectID}&tag_name=" . urlencode(base64_encode($gitlabTag->name)), " ", '', "title='{$lang->gitlab->deleteTagPriv}' class='btn btn-primary' target='hiddenwin' onclick='if(confirm(\"{$lang->gitlab->tag->protectConfirmDel}\")==false) return false;'"); + ?> +
      + + + +
      +
      + + diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 6f33dc7a05..d7b741b1aa 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1341,6 +1341,7 @@ $lang->resource->gitlab->browseTag = 'browseTag'; $lang->resource->gitlab->createTag = 'createTag'; $lang->resource->gitlab->deleteTag = 'deleteTag'; $lang->resource->gitlab->browseTagPriv = 'browseTagPriv'; +$lang->resource->gitlab->deleteTagPriv = 'deleteTagPriv'; $lang->gitlab->methodOrder[5] = 'browse'; $lang->gitlab->methodOrder[10] = 'create'; @@ -1369,6 +1370,7 @@ $lang->gitlab->methodOrder[125] = 'createWebhook'; $lang->gitlab->methodOrder[130] = 'manageProjectMembers'; $lang->gitlab->methodOrder[135] = 'browseTag'; $lang->gitlab->methodOrder[140] = 'browseTagPriv'; +$lang->gitlab->methodOrder[145] = 'deleteTagPriv'; /* merge request. */ $lang->resource->mr = new stdclass(); diff --git a/module/mr/view/link.html.php b/module/mr/view/link.html.php index ca9c0c33bf..b62ff14399 100644 --- a/module/mr/view/link.html.php +++ b/module/mr/view/link.html.php @@ -230,7 +230,7 @@ id);?> task->priList, $task->pri, $task->pri);?> - createLink('task', 'view', "taskID=$task->id"), $task->name, '', 'data-app="product"');?> + createLink('task', 'view', "taskID=$task->id"), $task->name);?> finishedBy);?> assignedTo);?> From bb63a8f6ab3921e891f3018ed9f6bf7c09ec5b12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A1=E6=A0=8B?= Date: Thu, 30 Dec 2021 11:10:45 +0800 Subject: [PATCH 21/36] * adjust code. --- module/ci/model.php | 5 ++++- test/model/mr/apigetsameopened.php | 2 +- test/model/mr/checksameopened.php | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/module/ci/model.php b/module/ci/model.php index a32c355c9c..2bd462cd3b 100644 --- a/module/ci/model.php +++ b/module/ci/model.php @@ -201,7 +201,10 @@ class ciModel extends model $this->dao->update(TABLE_JOB)->set('lastExec')->eq(helper::now())->set('lastStatus')->eq($status)->where('id')->eq($build->job)->exec(); if($status == 'building') return; + $relateMR = $this->dao->select('*')->from(TABLE_MR)->where('compileID')->eq($build->id)->fetch(); + if(empty($relateMR)) return; + if(isset($relateMR->synced) and $relateMR->synced == '0' and $status == 'success') { $newMR = new stdclass(); @@ -253,7 +256,7 @@ class ciModel extends model $this->dao->update(TABLE_MR)->data($newMR)->where('id')->eq($relateMR->id)->exec(); } - else + elseif($status != 'success') { $newMR = new stdclass(); $newMR->status = 'closed'; diff --git a/test/model/mr/apigetsameopened.php b/test/model/mr/apigetsameopened.php index 1d698a3e8a..faf98a3e22 100644 --- a/test/model/mr/apigetsameopened.php +++ b/test/model/mr/apigetsameopened.php @@ -23,7 +23,7 @@ pid=0 */ $mrModel = $tester->loadModel('mr'); -$gitlabID = '2'; +$gitlabID = '1'; $sourceProject = '42'; $sourceBranch = 'branch-08'; $targetProject = '42'; diff --git a/test/model/mr/checksameopened.php b/test/model/mr/checksameopened.php index 4b8079ed39..5c80dde8e6 100644 --- a/test/model/mr/checksameopened.php +++ b/test/model/mr/checksameopened.php @@ -23,7 +23,7 @@ pid=0 */ $mrModel = $tester->loadModel('mr'); -$gitlabID = '2'; +$gitlabID = '1'; $sourceProject = '42'; $sourceBranch = 'branch-08'; $targetProject = '42'; From 3bfc8e04c19f5485af0aa161d361e8973d660395 Mon Sep 17 00:00:00 2001 From: zenggang Date: Thu, 30 Dec 2021 05:24:37 +0000 Subject: [PATCH 22/36] * Adjust code --- module/gitlab/control.php | 24 ++++++++++------------- module/gitlab/model.php | 2 +- module/gitlab/view/browsetagpriv.html.php | 2 +- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/module/gitlab/control.php b/module/gitlab/control.php index 23a991f8c1..c506b45f9c 100644 --- a/module/gitlab/control.php +++ b/module/gitlab/control.php @@ -1023,10 +1023,7 @@ class gitlab extends control /* Data sort. */ list($order, $sort) = explode('_', $orderBy); $orderList = array(); - foreach($tagList as $tag) - { - $orderList[] = $tag->$order; - } + foreach($tagList as $tag) $orderList[] = $tag->$order; array_multisort($orderList, $sort == 'desc' ? SORT_DESC : SORT_ASC, $tagList); /* Pager. */ @@ -1035,16 +1032,15 @@ class gitlab extends control $pager = new pager($recTotal, $recPerPage, $pageID); $tagList = array_chunk($tagList, $pager->recPerPage); - $this->view->gitlab = $this->gitlab->getByID($gitlabID); - $this->view->pager = $pager; - $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->browseTagPriv; - $this->view->levelLang = $this->lang->gitlab->branch->branchCreationLevelList; - $this->view->gitlabID = $gitlabID; - $this->view->projectID = $projectID; - $this->view->keyword = $keyword; - $this->view->project = $this->gitlab->apiGetSingleProject($gitlabID, $projectID); - $this->view->gitlabTagList = empty($tagList) ? $tagList: $tagList[$pageID - 1]; - $this->view->orderBy = $orderBy; + $this->view->gitlab = $this->gitlab->getByID($gitlabID); + $this->view->pager = $pager; + $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->browseTagPriv; + $this->view->gitlabID = $gitlabID; + $this->view->projectID = $projectID; + $this->view->keyword = $keyword; + $this->view->project = $this->gitlab->apiGetSingleProject($gitlabID, $projectID); + $this->view->gitlabTagList = empty($tagList) ? $tagList: $tagList[$pageID - 1]; + $this->view->orderBy = $orderBy; $this->display(); } diff --git a/module/gitlab/model.php b/module/gitlab/model.php index de7d38d12a..16e301c74d 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -1535,7 +1535,7 @@ class gitlabModel extends model * @param int $gitlabID * @param int $projectID * @access public - * @return void + * @return array */ public function apiGetTagPrivs($gitlabID, $projectID) { diff --git a/module/gitlab/view/browsetagpriv.html.php b/module/gitlab/view/browsetagpriv.html.php index 2422e598b9..ec8a5bd065 100644 --- a/module/gitlab/view/browsetagpriv.html.php +++ b/module/gitlab/view/browsetagpriv.html.php @@ -60,7 +60,7 @@ name;?> lastCommitter;?> - accessLevel];?> + gitlab->branch->branchCreationLevelList, $gitlabTag->accessLevel);?> name}", " ", '', "title={$lang->gitlab->editTagPriv} class='btn btn-primary'"); From 1f4ee5581089f0bb6eb5cb67d14700dcea8e23d6 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Thu, 30 Dec 2021 14:05:57 +0800 Subject: [PATCH 23/36] * Finish task #46544,46556. --- .../{gitlabWebhook.php => gitlabwebhook.php} | 4 +- module/gitlab/control.php | 70 +++++++++++++++++ module/gitlab/lang/en.php | 30 ++++---- module/gitlab/lang/zh-cn.php | 30 ++++---- module/gitlab/lang/zh-tw.php | 27 ++++--- module/gitlab/model.php | 77 ++++++++++++++++++- module/gitlab/view/browsebranchpriv.html.php | 4 +- module/gitlab/view/browsetag.html.php | 2 +- module/gitlab/view/browsetagpriv.html.php | 2 +- module/gitlab/view/createtagpriv.html.php | 43 +++++++++++ module/gitlab/view/edittagpriv.html.php | 44 +++++++++++ 11 files changed, 285 insertions(+), 48 deletions(-) rename api/v1/entries/{gitlabWebhook.php => gitlabwebhook.php} (93%) create mode 100644 module/gitlab/view/createtagpriv.html.php create mode 100644 module/gitlab/view/edittagpriv.html.php diff --git a/api/v1/entries/gitlabWebhook.php b/api/v1/entries/gitlabwebhook.php similarity index 93% rename from api/v1/entries/gitlabWebhook.php rename to api/v1/entries/gitlabwebhook.php index 2a416234d8..148a679abd 100644 --- a/api/v1/entries/gitlabWebhook.php +++ b/api/v1/entries/gitlabwebhook.php @@ -20,8 +20,8 @@ class gitlabWebhookEntry extends baseEntry */ public function post() { - $repoID= $this->param('repoID'); - if(empty($id)) return; + $repoID = $this->param('repoID'); + if(empty($repoID)) return; $this->loadModel('repo'); diff --git a/module/gitlab/control.php b/module/gitlab/control.php index c506b45f9c..9bdf308131 100644 --- a/module/gitlab/control.php +++ b/module/gitlab/control.php @@ -845,6 +845,7 @@ class gitlab extends control */ public function createBranchPriv($gitlabID, $projectID, $branch = '') { + if($branch) $branch = base64_decode($branch); if($_POST) { $this->gitlab->createBranchPriv($gitlabID, $projectID, $branch); @@ -916,6 +917,7 @@ class gitlab extends control { if($confirm != 'yes') die(js::confirm($this->lang->gitlab->branch->confirmDelete , inlink('deleteBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=$branch&confirm=yes"))); + $branch = base64_decode($branch); $reponse = $this->gitlab->apiDeleteBranchPriv($gitlabID, $projectID, $branch); /* If the status code beginning with 20 is returned or empty is returned, it is successful. */ @@ -1044,6 +1046,73 @@ class gitlab extends control $this->display(); } + /** + * Set a gitlab protect tag. + * + * @param int $gitlabID + * @param int $projectID + * @access public + * @return void + */ + public function createTagPriv($gitlabID, $projectID) + { + if($_POST) + { + $this->gitlab->createTagPriv($gitlabID, $projectID); + + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browseTagPriv', "gitlabID=$gitlabID&projectID=$projectID"))); + } + + $gitlabTags = $this->gitlab->apiGetTags($gitlabID, $projectID); + $protectTags = $this->gitlab->apiGetBranchPrivs($gitlabID, $projectID, '', 'name_asc'); + $protectNames = array_keys($protectBranches); + + $tags = array(); + foreach($gitlabTags as $tag) + { + if(!in_array($tag->name, $protectNames)) $tags[$tag->name] = $tag->name; + } + + $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->createTagPriv; + $this->view->gitlabID = $gitlabID; + $this->view->projectID = $projectID; + $this->view->tags = $tags; + $this->display(); + } + + /** + * Edit a gitlab protect tag. + * + * @param int $gitlabID + * @param int $projectID + * @param string $tag + * @access public + * @return void + */ + public function editTagPriv($gitlabID, $projectID, $tag = '') + { + $tag = base64_decode($tag); + + if($_POST) + { + $this->gitlab->createTagPriv($gitlabID, $projectID, $tag); + + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browseTagPriv', "gitlabID=$gitlabID&projectID=$projectID"))); + } + + $tagPriv = $this->gitlab->apiGetSingleTagPriv($gitlabID, $projectID, $tag); + $tagPriv->createAccessLevel = $this->gitlab->checkAccessLevel($tagPriv->create_access_levels); + + $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->editTagPriv; + $this->view->gitlabID = $gitlabID; + $this->view->projectID = $projectID; + $this->view->tagPriv = $tagPriv; + $this->view->tag = $tag; + $this->display(); + } + /** * Delete a gitlab protect tag. * @@ -1466,6 +1535,7 @@ class gitlab extends control { if($confirm != 'yes') die(js::confirm($this->lang->gitlab->tag->confirmDelete , inlink('deleteTag', "gitlabID=$gitlabID&projectID=$projectID&tagName=$tagName&confirm=yes"))); + $tagName = base64_decode($tagName); $reponse = $this->gitlab->apiDeleteTag($gitlabID, $projectID, $tagName); /* If the status code beginning with 20 is returned or empty is returned, it is successful. */ diff --git a/module/gitlab/lang/en.php b/module/gitlab/lang/en.php index 836580879c..dda54c7e78 100644 --- a/module/gitlab/lang/en.php +++ b/module/gitlab/lang/en.php @@ -55,7 +55,7 @@ $lang->gitlab->editBranchPriv = 'Edit branch protected'; $lang->gitlab->deleteBranchPriv = 'Delete branch protected'; $lang->gitlab->createTag = 'Create Tag'; $lang->gitlab->deleteTag = 'Delete tag'; -$lang->gitlab->createTagPriv = 'Add tag protected'; +$lang->gitlab->createTagPriv = 'Create tag protected'; $lang->gitlab->editTagPriv = 'Edit tag protected'; $lang->gitlab->deleteTagPriv = 'Delete tag protected'; @@ -211,16 +211,18 @@ $lang->gitlab->branch->emptyPrivNameError = "Branch cannot be empty."; $lang->gitlab->branch->issetPrivNameError = "The protection branch already exists"; $lang->gitlab->tag = new stdclass(); -$lang->gitlab->tag->name = 'Tag name'; -$lang->gitlab->tag->ref = 'Create from'; -$lang->gitlab->tag->lastCommitter = 'Last Committer'; -$lang->gitlab->tag->lastCommittedDate = 'Last Committed Date'; -$lang->gitlab->tag->placeholderSearch = "Enter branch tag"; -$lang->gitlab->tag->message = 'Message'; -$lang->gitlab->tag->emptyNameError = "Name cannot be empty."; -$lang->gitlab->tag->emptyRefError = "Create from cannot be empty."; -$lang->gitlab->tag->issetNameError = "The tag already exists"; -$lang->gitlab->tag->confirmDelete = 'Do you want to delete this GitLab tag?'; -$lang->gitlab->tag->protected = 'Protected'; -$lang->gitlab->tag->accessLevel = 'Allow creation'; -$lang->gitlab->tag->protectConfirmDel = 'Do you want to delete this GitLab tag protected?'; +$lang->gitlab->tag->name = 'Tag name'; +$lang->gitlab->tag->ref = 'Create from'; +$lang->gitlab->tag->lastCommitter = 'Last Committer'; +$lang->gitlab->tag->lastCommittedDate = 'Last Committed Date'; +$lang->gitlab->tag->placeholderSearch = "Enter branch tag"; +$lang->gitlab->tag->message = 'Message'; +$lang->gitlab->tag->emptyNameError = "Name cannot be empty."; +$lang->gitlab->tag->emptyRefError = "Create from cannot be empty."; +$lang->gitlab->tag->issetNameError = "The tag already exists"; +$lang->gitlab->tag->confirmDelete = 'Do you want to delete this GitLab tag?'; +$lang->gitlab->tag->protected = 'Protected'; +$lang->gitlab->tag->accessLevel = 'Allow creation'; +$lang->gitlab->tag->protectConfirmDel = 'Do you want to delete this GitLab tag protected?'; +$lang->gitlab->tag->emptyPrivNameError = 'Tag cannot be empty.'; +$lang->gitlab->tag->issetPrivNameError = 'The protection tag already exists.'; diff --git a/module/gitlab/lang/zh-cn.php b/module/gitlab/lang/zh-cn.php index a5dc16191b..82da87fc2c 100644 --- a/module/gitlab/lang/zh-cn.php +++ b/module/gitlab/lang/zh-cn.php @@ -55,7 +55,7 @@ $lang->gitlab->editBranchPriv = '编辑分支保护'; $lang->gitlab->deleteBranchPriv = '删除分支保护'; $lang->gitlab->createTag = '创建标签'; $lang->gitlab->deleteTag = '删除标签'; -$lang->gitlab->createTagPriv = '添加标签保护'; +$lang->gitlab->createTagPriv = '创建标签保护'; $lang->gitlab->editTagPriv = '编辑标签保护'; $lang->gitlab->deleteTagPriv = '删除标签保护'; @@ -211,16 +211,18 @@ $lang->gitlab->branch->emptyPrivNameError = "分支不能为空"; $lang->gitlab->branch->issetPrivNameError = "已存在该保护分支"; $lang->gitlab->tag = new stdclass(); -$lang->gitlab->tag->name = '标签名'; -$lang->gitlab->tag->ref = '创建自'; -$lang->gitlab->tag->lastCommitter = '最后提交'; -$lang->gitlab->tag->lastCommittedDate = '最后修改时间'; -$lang->gitlab->tag->placeholderSearch = "请输入标签名称"; -$lang->gitlab->tag->message = '信息'; -$lang->gitlab->tag->emptyNameError = "标签名不能为空"; -$lang->gitlab->tag->emptyRefError = "创建自不能为空"; -$lang->gitlab->tag->issetNameError = "已存在该标签"; -$lang->gitlab->tag->confirmDelete = '确认删除该GitLab标签吗?'; -$lang->gitlab->tag->protected = '受保护'; -$lang->gitlab->tag->accessLevel = '允许创建'; -$lang->gitlab->tag->protectConfirmDel = '确认删除该GitLab标签保护吗?'; +$lang->gitlab->tag->name = '标签名'; +$lang->gitlab->tag->ref = '创建自'; +$lang->gitlab->tag->lastCommitter = '最后提交'; +$lang->gitlab->tag->lastCommittedDate = '最后修改时间'; +$lang->gitlab->tag->placeholderSearch = "请输入标签名称"; +$lang->gitlab->tag->message = '信息'; +$lang->gitlab->tag->emptyNameError = "标签名不能为空"; +$lang->gitlab->tag->emptyRefError = "创建自不能为空"; +$lang->gitlab->tag->issetNameError = "已存在该标签"; +$lang->gitlab->tag->confirmDelete = '确认删除该GitLab标签吗?'; +$lang->gitlab->tag->protected = '受保护'; +$lang->gitlab->tag->accessLevel = '允许创建'; +$lang->gitlab->tag->protectConfirmDel = '确认删除该GitLab标签保护吗?'; +$lang->gitlab->tag->emptyPrivNameError = "标签不能为空"; +$lang->gitlab->tag->issetPrivNameError = "已存在该保护标签"; diff --git a/module/gitlab/lang/zh-tw.php b/module/gitlab/lang/zh-tw.php index b183b01247..cb886aeab1 100644 --- a/module/gitlab/lang/zh-tw.php +++ b/module/gitlab/lang/zh-tw.php @@ -54,6 +54,8 @@ $lang->gitlab->editBranchPriv = '編輯分支保護'; $lang->gitlab->deleteBranchPriv = '刪除分支保護'; $lang->gitlab->createTag = '創建標籤'; $lang->gitlab->deleteTag = '刪除標籤'; +$lang->gitlab->createTagPriv = '創建標簽保護'; +$lang->gitlab->editTagPriv = '編輯標簽保護'; $lang->gitlab->id = 'ID'; $lang->gitlab->name = "{$lang->gitlab->common}名稱"; @@ -207,14 +209,17 @@ $lang->gitlab->branch->emptyPrivNameError = "分支不能為空"; $lang->gitlab->branch->issetPrivNameError = "已存在該保護分支"; $lang->gitlab->tag = new stdclass(); -$lang->gitlab->tag->name = '標籤名'; -$lang->gitlab->tag->ref = '創建自'; -$lang->gitlab->tag->lastCommitter = '最後提交'; -$lang->gitlab->tag->lastCommittedDate = '最後修改時間'; -$lang->gitlab->tag->placeholderSearch = "請輸入標籤名稱"; -$lang->gitlab->tag->message = '信息'; -$lang->gitlab->tag->emptyNameError = "標籤名不能為空"; -$lang->gitlab->tag->emptyRefError = "創建自不能為空"; -$lang->gitlab->tag->issetNameError = "已存在該標籤"; -$lang->gitlab->tag->confirmDelete = '確認刪除該GitLab標籤嗎?'; -$lang->gitlab->tag->protected = '受保護'; +$lang->gitlab->tag->name = '標籤名'; +$lang->gitlab->tag->ref = '創建自'; +$lang->gitlab->tag->lastCommitter = '最後提交'; +$lang->gitlab->tag->lastCommittedDate = '最後修改時間'; +$lang->gitlab->tag->placeholderSearch = "請輸入標籤名稱"; +$lang->gitlab->tag->message = '信息'; +$lang->gitlab->tag->emptyNameError = "標籤名不能為空"; +$lang->gitlab->tag->emptyRefError = "創建自不能為空"; +$lang->gitlab->tag->issetNameError = "已存在該標籤"; +$lang->gitlab->tag->confirmDelete = '確認刪除該GitLab標籤嗎?'; +$lang->gitlab->tag->protected = '受保護'; +$lang->gitlab->tag->accessLevel = '允許創建'; +$lang->gitlab->tag->emptyPrivNameError = '標簽不能爲空'; +$lang->gitlab->tag->issetPrivNameError = '已存在該保護標簽'; diff --git a/module/gitlab/model.php b/module/gitlab/model.php index 16e301c74d..e5098ae215 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -2403,10 +2403,18 @@ class gitlabModel extends model { foreach($response->message as $field => $fieldErrors) { - foreach($fieldErrors as $error) + if(is_string($fieldErrors)) { - $errorKey = array_search($error, $this->lang->gitlab->apiError); - if($error) dao::$errors[$field][] = $errorKey === false ? $error : zget($this->lang->gitlab->errorLang, $errorKey); + $errorKey = array_search($fieldErrors, $this->lang->gitlab->apiError); + if($fieldErrors) dao::$errors[$field][] = $errorKey === false ? $fieldErrors : zget($this->lang->gitlab->errorLang, $errorKey); + } + else + { + foreach($fieldErrors as $error) + { + $errorKey = array_search($error, $this->lang->gitlab->apiError); + if($error) dao::$errors[$field][] = $errorKey === false ? $error : zget($this->lang->gitlab->errorLang, $errorKey); + } } } } @@ -2542,6 +2550,69 @@ class gitlabModel extends model return json_decode(commonModel::http($url, array(), $options = array(CURLOPT_CUSTOMREQUEST => 'DELETE'))); } + /** + * Create gitlab protect tag. + * + * @param int $gitlabID + * @param int $projectID + * @param string $tag + * @access public + * @return bool + */ + public function createTagPriv($gitlabID, $projectID, $tag = '') + { + $priv = fixer::input('post')->get(); + if(empty($priv->name)) dao::$errors['name'][] = $this->lang->gitlab->branch->emptyPrivNameError; + $singleTag = $this->apiGetSingleTagPriv($gitlabID, $projectID, $priv->name); + if(empty($tag) && !empty($singleTag->id)) dao::$errors['name'][] = $this->lang->gitlab->tag->issetPrivNameError; + if(dao::isError()) return false; + if(!empty($tag) && !empty($singleTag->name)) $this->apiDeleteTagPriv($gitlabID, $projectID, $tag); + + $response = $this->apiCreateTagPriv($gitlabID, $projectID, $priv); + + if(!empty($response->id)) + { + $action = empty($tag) ? 'created' : 'edited'; + $this->loadModel('action')->create('gitlabtagpriv', $response->id, $action, '', $response->name); + return true; + } + + return $this->apiErrorHandling($response); + } + + /** + * Get single protct tag by API. + * + * @param int $gitlabID + * @param int $projectID + * @param string $tag + * @access public + * @return object + */ + public function apiGetSingleTagPriv($gitlabID, $projectID, $tag) + { + if(empty($gitlabID)) return false; + $url = sprintf($this->getApiRoot($gitlabID), "/projects/$projectID/protected_tags/$tag"); + return json_decode(commonModel::http($url)); + } + + /** + * Create a gitab protect tag by api. + * + * @param int $gitlabID + * @param int $projectID + * @param object $priv + * @access public + * @return object + */ + public function apiCreateTagPriv($gitlabID, $projectID, $priv) + { + if(empty($gitlabID)) return false; + if(empty($priv->name)) return false; + $url = sprintf($this->getApiRoot($gitlabID), "/projects/" . $projectID . '/protected_tags'); + return json_decode(commonModel::http($url, $priv)); + } + /** * Check access level. * diff --git a/module/gitlab/view/browsebranchpriv.html.php b/module/gitlab/view/browsebranchpriv.html.php index 7023020575..88b606cd8f 100644 --- a/module/gitlab/view/browsebranchpriv.html.php +++ b/module/gitlab/view/browsebranchpriv.html.php @@ -62,8 +62,8 @@ push_access_level];?> name", " ", '', "title={$lang->gitlab->editBranchPriv} class='btn btn-primary'"); - if(common::hasPriv('gitlab', 'deleteBranchPriv')) echo html::a($this->createLink('gitlab', 'deleteBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=$branch->name"), '', 'hiddenwin', "title='{$lang->gitlab->deleteBranchPriv}' class='btn'"); + if(common::hasPriv('gitlab', 'editBranchPriv')) common::printLink('gitlab', 'editBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=" . urlencode(base64_encode($branch->name)), " ", '', "title={$lang->gitlab->editBranchPriv} class='btn btn-primary'"); + if(common::hasPriv('gitlab', 'deleteBranchPriv')) echo html::a($this->createLink('gitlab', 'deleteBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=" . urlencode(base64_encode($branch->name))), '', 'hiddenwin', "title='{$lang->gitlab->deleteBranchPriv}' class='btn'"); ?> diff --git a/module/gitlab/view/browsetag.html.php b/module/gitlab/view/browsetag.html.php index 18e5a82442..233089a065 100644 --- a/module/gitlab/view/browsetag.html.php +++ b/module/gitlab/view/browsetag.html.php @@ -68,7 +68,7 @@ protected ? 'disabled' : ''; - common::printLink('gitlab', 'deleteTag', "gitlabID=$gitlabID&projectID={$projectID}&tag_name={$gitlabTag->name}", " ", '', "title='{$lang->gitlab->deleteTag}' class='btn btn-primary' target='hiddenwin' $isDisabled"); + common::printLink('gitlab', 'deleteTag', "gitlabID=$gitlabID&projectID={$projectID}&tag_name=" . urlencode(base64_encode($gitlabTag->name)), " ", '', "title='{$lang->gitlab->deleteTag}' class='btn btn-primary' target='hiddenwin' $isDisabled"); ?> diff --git a/module/gitlab/view/browsetagpriv.html.php b/module/gitlab/view/browsetagpriv.html.php index ec8a5bd065..228633c24f 100644 --- a/module/gitlab/view/browsetagpriv.html.php +++ b/module/gitlab/view/browsetagpriv.html.php @@ -63,7 +63,7 @@ gitlab->branch->branchCreationLevelList, $gitlabTag->accessLevel);?> name}", " ", '', "title={$lang->gitlab->editTagPriv} class='btn btn-primary'"); + common::printLink('gitlab', 'editTagPriv', "gitlabID=$gitlabID&projectID=$projectID&tag_name=" . urlencode(base64_encode($gitlabTag->name)), " ", '', "title={$lang->gitlab->editTagPriv} class='btn btn-primary'"); common::printLink('gitlab', 'deleteTagPriv', "gitlabID=$gitlabID&projectID={$projectID}&tag_name=" . urlencode(base64_encode($gitlabTag->name)), " ", '', "title='{$lang->gitlab->deleteTagPriv}' class='btn btn-primary' target='hiddenwin' onclick='if(confirm(\"{$lang->gitlab->tag->protectConfirmDel}\")==false) return false;'"); ?> diff --git a/module/gitlab/view/createtagpriv.html.php b/module/gitlab/view/createtagpriv.html.php new file mode 100644 index 0000000000..44296d5d22 --- /dev/null +++ b/module/gitlab/view/createtagpriv.html.php @@ -0,0 +1,43 @@ + + * @package gitlab + * @version $Id$ + * @link https://www.zentao.net + */ +?> + +
      +
      +
      +
      +

      gitlab->createTagPriv;?>

      +
      +
      + + + + + + + + + + + + + + +
      gitlab->tag->name;?>
      gitlab->tag->accessLevel;?>gitlab->branch->branchCreationLevelList, '40', "class='form-control chosen'");?>
      + + goback, '', 'class="btn btn-wide"');?> +
      +
      +
      +
      +
      + diff --git a/module/gitlab/view/edittagpriv.html.php b/module/gitlab/view/edittagpriv.html.php new file mode 100644 index 0000000000..5074c304eb --- /dev/null +++ b/module/gitlab/view/edittagpriv.html.php @@ -0,0 +1,44 @@ + + * @package gitlab + * @version $Id$ + * @link https://www.zentao.net + */ +?> + +
      +
      +
      +
      +

      gitlab->editTagPriv;?>

      +
      +
      + + + + + + + + + + + + + + + +
      gitlab->tag->name;?>
      gitlab->tag->accessLevel;?>gitlab->branch->branchCreationLevelList, $tagPriv->createAccessLevel, "class='form-control chosen'");?>
      + + goback, '', 'class="btn btn-wide"');?> +
      +
      +
      +
      +
      + From adac3aefdf2d69a01156632997714ca16d00fa34 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Thu, 30 Dec 2021 14:19:28 +0800 Subject: [PATCH 24/36] * Finish task #46544. --- module/gitlab/control.php | 2 +- module/gitlab/view/createtagpriv.html.php | 2 +- module/gitlab/view/edittagpriv.html.php | 2 +- module/group/lang/resource.php | 2 ++ 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/module/gitlab/control.php b/module/gitlab/control.php index 9bdf308131..1adc2cbffd 100644 --- a/module/gitlab/control.php +++ b/module/gitlab/control.php @@ -1066,7 +1066,7 @@ class gitlab extends control $gitlabTags = $this->gitlab->apiGetTags($gitlabID, $projectID); $protectTags = $this->gitlab->apiGetBranchPrivs($gitlabID, $projectID, '', 'name_asc'); - $protectNames = array_keys($protectBranches); + $protectNames = array_keys($protectTags); $tags = array(); foreach($gitlabTags as $tag) diff --git a/module/gitlab/view/createtagpriv.html.php b/module/gitlab/view/createtagpriv.html.php index 44296d5d22..68cb9e1821 100644 --- a/module/gitlab/view/createtagpriv.html.php +++ b/module/gitlab/view/createtagpriv.html.php @@ -20,7 +20,7 @@
      - + diff --git a/module/gitlab/view/edittagpriv.html.php b/module/gitlab/view/edittagpriv.html.php index 5074c304eb..6e710d19ad 100644 --- a/module/gitlab/view/edittagpriv.html.php +++ b/module/gitlab/view/edittagpriv.html.php @@ -20,7 +20,7 @@
      gitlab->tag->name;?>gitlab->tag->name;?>
      - + diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index d7b741b1aa..e434539236 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1341,6 +1341,8 @@ $lang->resource->gitlab->browseTag = 'browseTag'; $lang->resource->gitlab->createTag = 'createTag'; $lang->resource->gitlab->deleteTag = 'deleteTag'; $lang->resource->gitlab->browseTagPriv = 'browseTagPriv'; +$lang->resource->gitlab->createTagPriv = 'createTagPriv'; +$lang->resource->gitlab->editTagPriv = 'editTagPriv'; $lang->resource->gitlab->deleteTagPriv = 'deleteTagPriv'; $lang->gitlab->methodOrder[5] = 'browse'; From fce6751316a6d0d22be32a3f14524ed1bf60c77c Mon Sep 17 00:00:00 2001 From: zenggang Date: Thu, 30 Dec 2021 07:06:37 +0000 Subject: [PATCH 25/36] * Fix bug#18046 and adjust code --- module/gitlab/view/browsetagpriv.html.php | 2 +- module/repo/model.php | 6 +++++- module/repo/view/ajaxsidecommits.html.php | 3 +-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/module/gitlab/view/browsetagpriv.html.php b/module/gitlab/view/browsetagpriv.html.php index ec8a5bd065..8e56623852 100644 --- a/module/gitlab/view/browsetagpriv.html.php +++ b/module/gitlab/view/browsetagpriv.html.php @@ -29,7 +29,7 @@
      - " . $lang->gitlab->createTagPriv, '', "class='btn btn-primary'");?> + " . $lang->gitlab->createTagPriv, '', "class='btn btn-primary'");?>
      diff --git a/module/repo/model.php b/module/repo/model.php index 185b7dda64..d1302ee9a2 100644 --- a/module/repo/model.php +++ b/module/repo/model.php @@ -581,7 +581,11 @@ class repoModel extends model if($entry == '/' or empty($entry))$comments->page($pager, 't1.id'); $comments = $comments->fetchAll('revision'); - foreach($comments as $repoComment) $repoComment->comment = $this->replaceCommentLink($repoComment->comment); + foreach($comments as $repoComment) + { + $repoComment->originalComment = $repoComment->comment; + $repoComment->comment = $this->replaceCommentLink($repoComment->comment); + } return $comments; } diff --git a/module/repo/view/ajaxsidecommits.html.php b/module/repo/view/ajaxsidecommits.html.php index ad16a62fc8..203609b6b6 100644 --- a/module/repo/view/ajaxsidecommits.html.php +++ b/module/repo/view/ajaxsidecommits.html.php @@ -43,8 +43,7 @@ if(isset($entry)) $pathInfo .= '&type=file';
      - comment, ENT_QUOTES);?> - + From 930538179b1d952f9ccaba24a25fc40c894d934d Mon Sep 17 00:00:00 2001 From: liyuchun Date: Thu, 30 Dec 2021 15:18:27 +0800 Subject: [PATCH 26/36] * Fix eroor with special symbols. --- framework/base/router.class.php | 2 +- module/gitlab/control.php | 22 +++++++++++++++------- module/gitlab/model.php | 6 +++++- module/gitlab/view/browsetag.html.php | 2 +- module/gitlab/view/browsetagpriv.html.php | 4 ++-- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/framework/base/router.class.php b/framework/base/router.class.php index 570e004f23..bc154790f7 100644 --- a/framework/base/router.class.php +++ b/framework/base/router.class.php @@ -2792,7 +2792,7 @@ class EndResponseException extends \Exception /** * @param string $content - * + * * @return sellf */ public static function create($content = '') diff --git a/module/gitlab/control.php b/module/gitlab/control.php index 1adc2cbffd..c202c7483c 100644 --- a/module/gitlab/control.php +++ b/module/gitlab/control.php @@ -845,7 +845,7 @@ class gitlab extends control */ public function createBranchPriv($gitlabID, $projectID, $branch = '') { - if($branch) $branch = base64_decode($branch); + if($branch) $branch = helper::safe64Decode($branch); if($_POST) { $this->gitlab->createBranchPriv($gitlabID, $projectID, $branch); @@ -915,9 +915,13 @@ class gitlab extends control */ public function deleteBranchPriv($gitlabID, $projectID, $branch, $confirm = 'no') { - if($confirm != 'yes') die(js::confirm($this->lang->gitlab->branch->confirmDelete , inlink('deleteBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=$branch&confirm=yes"))); + if($confirm != 'yes') + { + $branch = urlencode($branch); + die(js::confirm($this->lang->gitlab->branch->confirmDelete , inlink('deleteBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=$branch&confirm=yes"))); + } - $branch = base64_decode($branch); + $branch = helper::safe64Decode($branch); $reponse = $this->gitlab->apiDeleteBranchPriv($gitlabID, $projectID, $branch); /* If the status code beginning with 20 is returned or empty is returned, it is successful. */ @@ -1092,7 +1096,7 @@ class gitlab extends control */ public function editTagPriv($gitlabID, $projectID, $tag = '') { - $tag = base64_decode($tag); + $tag = helper::safe64Decode($tag); if($_POST) { @@ -1124,7 +1128,7 @@ class gitlab extends control */ public function deleteTagPriv($gitlabID, $projectID, $tag) { - $tag = base64_decode($tag); + $tag = helper::safe64Decode($tag); $reponse = $this->gitlab->apiDeleteTagPriv($gitlabID, $projectID, $tag); /* If the status code beginning with 20 is returned or empty is returned, it is successful. */ @@ -1533,9 +1537,13 @@ class gitlab extends control */ public function deleteTag($gitlabID, $projectID, $tagName = '', $confirm = 'no') { - if($confirm != 'yes') die(js::confirm($this->lang->gitlab->tag->confirmDelete , inlink('deleteTag', "gitlabID=$gitlabID&projectID=$projectID&tagName=$tagName&confirm=yes"))); + if($confirm != 'yes') + { + $tagName = urlencode($tagName); + die(js::confirm($this->lang->gitlab->tag->confirmDelete , inlink('deleteTag', "gitlabID=$gitlabID&projectID=$projectID&tagName=$tagName&confirm=yes"))); + } - $tagName = base64_decode($tagName); + $tagName = helper::safe64Decode($tagName); $reponse = $this->gitlab->apiDeleteTag($gitlabID, $projectID, $tagName); /* If the status code beginning with 20 is returned or empty is returned, it is successful. */ diff --git a/module/gitlab/model.php b/module/gitlab/model.php index e5098ae215..511b8ca025 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -1525,6 +1525,7 @@ class gitlabModel extends model if(!(int)$gitlabID or !(int)$projectID or empty($tagName)) return false; $apiRoot = $this->getApiRoot($gitlabID); + $tagName = urlencode($tagName); $url = sprintf($apiRoot, "/projects/{$projectID}/repository/tags/{$tagName}"); return json_decode(commonModel::http($url, array(), $options = array(CURLOPT_CUSTOMREQUEST => 'DELETE'))); } @@ -1566,6 +1567,7 @@ class gitlabModel extends model { if(empty($gitlabID)) return false; $apiRoot = $this->getApiRoot($gitlabID); + $tag = urlencode($tag); $url = sprintf($apiRoot, "/projects/{$projectID}/protected_tags/{$tag}"); return json_decode(commonModel::http($url, array(), $options = array(CURLOPT_CUSTOMREQUEST => 'DELETE'))); } @@ -2482,7 +2484,8 @@ class gitlabModel extends model public function apiGetSingleBranchPriv($gitlabID, $projectID, $branch) { if(empty($gitlabID)) return false; - $url = sprintf($this->getApiRoot($gitlabID), "/projects/$projectID/protected_branches/$branch"); + $branch = urlencode($branch); + $url = sprintf($this->getApiRoot($gitlabID), "/projects/$projectID/protected_branches/$branch"); return json_decode(commonModel::http($url)); } @@ -2592,6 +2595,7 @@ class gitlabModel extends model public function apiGetSingleTagPriv($gitlabID, $projectID, $tag) { if(empty($gitlabID)) return false; + $tag = urlencode($tag); $url = sprintf($this->getApiRoot($gitlabID), "/projects/$projectID/protected_tags/$tag"); return json_decode(commonModel::http($url)); } diff --git a/module/gitlab/view/browsetag.html.php b/module/gitlab/view/browsetag.html.php index 233089a065..c9b2378715 100644 --- a/module/gitlab/view/browsetag.html.php +++ b/module/gitlab/view/browsetag.html.php @@ -68,7 +68,7 @@ diff --git a/module/gitlab/view/browsetagpriv.html.php b/module/gitlab/view/browsetagpriv.html.php index 228633c24f..4f1a3f8c36 100644 --- a/module/gitlab/view/browsetagpriv.html.php +++ b/module/gitlab/view/browsetagpriv.html.php @@ -63,8 +63,8 @@ From 0552eec334fda2862c9e8d5213518e79e6e0933d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A1=E6=A0=8B?= Date: Thu, 30 Dec 2021 15:19:59 +0800 Subject: [PATCH 27/36] * fix error. --- module/mr/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/mr/model.php b/module/mr/model.php index 30698c0562..195a0a7d83 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -545,7 +545,7 @@ class mrModel extends model { if(empty($gitlabID) or empty($sourceProject) or empty($sourceBranch) or empty($targetProject) or empty($targetBranch)) return null; - $url = sprintf($this->loadModel('gitlab')->getApiRoot((int)$gitlabID), "/merge_requests") . "&state=opened&source_branch={$sourceBranch}&target_branch={$targetBranch}&source_project_id={$sourceProject}&target_project_id={$targetProject}"; + $url = sprintf($this->loadModel('gitlab')->getApiRoot((int)$gitlabID), "/projects/{$sourceProject}/merge_requests") . "&state=opened&source_branch={$sourceBranch}&target_branch={$targetBranch}"; $response = json_decode(commonModel::http($url)); if($response) From c35185b5bf1771a830f82f663c3fe240a40c6911 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Thu, 30 Dec 2021 15:23:29 +0800 Subject: [PATCH 28/36] * Adjust base64. --- module/gitlab/view/browsebranchpriv.html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/gitlab/view/browsebranchpriv.html.php b/module/gitlab/view/browsebranchpriv.html.php index 88b606cd8f..c99a16c434 100644 --- a/module/gitlab/view/browsebranchpriv.html.php +++ b/module/gitlab/view/browsebranchpriv.html.php @@ -62,8 +62,8 @@ From b45ec10f40ca105741fff8435517e2ba03a31c7a Mon Sep 17 00:00:00 2001 From: liyuchun Date: Thu, 30 Dec 2021 15:36:33 +0800 Subject: [PATCH 29/36] * Fix bug #18078. --- module/mr/lang/en.php | 1 + module/mr/lang/zh-cn.php | 1 + module/mr/lang/zh-tw.php | 1 + 3 files changed, 3 insertions(+) diff --git a/module/mr/lang/en.php b/module/mr/lang/en.php index ad7eedb258..df7081c2df 100644 --- a/module/mr/lang/en.php +++ b/module/mr/lang/en.php @@ -1,6 +1,7 @@ mr = new stdclass; $lang->mr->common = "Merge Request"; +$lang->mr->view = "Survey"; $lang->mr->overview = "Survey"; $lang->mr->create = "Create"; $lang->mr->apiCreate = "Interface: Create"; diff --git a/module/mr/lang/zh-cn.php b/module/mr/lang/zh-cn.php index 56801ccf3e..868145a52e 100644 --- a/module/mr/lang/zh-cn.php +++ b/module/mr/lang/zh-cn.php @@ -1,6 +1,7 @@ mr = new stdclass; $lang->mr->common = "合并请求"; +$lang->mr->view = "概况"; $lang->mr->overview = "概况"; $lang->mr->create = "创建{$lang->mr->common}"; $lang->mr->apiCreate = "接口:创建{$lang->mr->common}"; diff --git a/module/mr/lang/zh-tw.php b/module/mr/lang/zh-tw.php index a2397abf3f..cb932c0b6c 100644 --- a/module/mr/lang/zh-tw.php +++ b/module/mr/lang/zh-tw.php @@ -1,6 +1,7 @@ mr = new stdclass; $lang->mr->common = "合併請求"; +$lang->mr->view = "概況"; $lang->mr->overview = "概況"; $lang->mr->create = "創建{$lang->mr->common}"; $lang->mr->apiCreate = "介面:創建{$lang->mr->common}"; From 55c7c7e848e06e102118d4b0382f93999103f5b5 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Thu, 30 Dec 2021 16:13:40 +0800 Subject: [PATCH 30/36] * Fix bug #18078. --- module/group/lang/resource.php | 2 +- module/mr/control.php | 2 +- module/mr/lang/en.php | 1 - module/mr/lang/zh-cn.php | 1 - module/mr/lang/zh-tw.php | 1 - module/mr/view/browse.html.php | 2 +- module/mr/view/diff.html.php | 2 +- module/mr/view/link.html.php | 2 +- module/mr/view/view.html.php | 2 +- 9 files changed, 6 insertions(+), 9 deletions(-) diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index e434539236..53fef5dc79 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1381,7 +1381,7 @@ $lang->resource->mr->apiCreate = 'apiCreate'; $lang->resource->mr->browse = 'browse'; $lang->resource->mr->edit = 'edit'; $lang->resource->mr->delete = 'delete'; -$lang->resource->mr->view = 'overview'; +$lang->resource->mr->view = 'view'; $lang->resource->mr->accept = 'accept'; $lang->resource->mr->diff = 'viewDiff'; $lang->resource->mr->link = 'linkList'; diff --git a/module/mr/control.php b/module/mr/control.php index 198e03cd04..a7c94dbe4a 100644 --- a/module/mr/control.php +++ b/module/mr/control.php @@ -230,7 +230,7 @@ class mr extends control $this->view->compile = $this->loadModel('compile')->getById($MR->compileID); $this->view->compileJob = $MR->jobID ? $this->loadModel('job')->getById($MR->jobID) : false; - $this->view->title = $this->lang->mr->overview; + $this->view->title = $this->lang->mr->view; $this->view->MR = $MR; $this->view->rawMR = isset($rawMR) ? $rawMR : false; $this->view->product = $product; diff --git a/module/mr/lang/en.php b/module/mr/lang/en.php index df7081c2df..44e2c88748 100644 --- a/module/mr/lang/en.php +++ b/module/mr/lang/en.php @@ -2,7 +2,6 @@ $lang->mr = new stdclass; $lang->mr->common = "Merge Request"; $lang->mr->view = "Survey"; -$lang->mr->overview = "Survey"; $lang->mr->create = "Create"; $lang->mr->apiCreate = "Interface: Create"; $lang->mr->browse = "Browse"; diff --git a/module/mr/lang/zh-cn.php b/module/mr/lang/zh-cn.php index 868145a52e..c48e4105d2 100644 --- a/module/mr/lang/zh-cn.php +++ b/module/mr/lang/zh-cn.php @@ -2,7 +2,6 @@ $lang->mr = new stdclass; $lang->mr->common = "合并请求"; $lang->mr->view = "概况"; -$lang->mr->overview = "概况"; $lang->mr->create = "创建{$lang->mr->common}"; $lang->mr->apiCreate = "接口:创建{$lang->mr->common}"; $lang->mr->browse = "浏览{$lang->mr->common}"; diff --git a/module/mr/lang/zh-tw.php b/module/mr/lang/zh-tw.php index cb932c0b6c..7e4560c2c9 100644 --- a/module/mr/lang/zh-tw.php +++ b/module/mr/lang/zh-tw.php @@ -2,7 +2,6 @@ $lang->mr = new stdclass; $lang->mr->common = "合併請求"; $lang->mr->view = "概況"; -$lang->mr->overview = "概況"; $lang->mr->create = "創建{$lang->mr->common}"; $lang->mr->apiCreate = "介面:創建{$lang->mr->common}"; $lang->mr->browse = "瀏覽{$lang->mr->common}"; diff --git a/module/mr/view/browse.html.php b/module/mr/view/browse.html.php index 51faef85de..439498705f 100644 --- a/module/mr/view/browse.html.php +++ b/module/mr/view/browse.html.php @@ -84,7 +84,7 @@ diff --git a/module/gitlab/view/browsetag.html.php b/module/gitlab/view/browsetag.html.php index c9b2378715..70b94923a0 100644 --- a/module/gitlab/view/browsetag.html.php +++ b/module/gitlab/view/browsetag.html.php @@ -67,8 +67,10 @@ diff --git a/module/gitlab/view/browsetagpriv.html.php b/module/gitlab/view/browsetagpriv.html.php index 4f1a3f8c36..52d5b8d51b 100644 --- a/module/gitlab/view/browsetagpriv.html.php +++ b/module/gitlab/view/browsetagpriv.html.php @@ -63,8 +63,10 @@ From 05bb5b46b81d631d59dd8eecd3ce8e23351ea2f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A1=E6=A0=8B?= Date: Fri, 31 Dec 2021 10:31:58 +0800 Subject: [PATCH 36/36] * fix bug #18111. --- module/mr/lang/en.php | 2 +- module/mr/lang/zh-cn.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/mr/lang/en.php b/module/mr/lang/en.php index 44e2c88748..a8dc3df6cb 100644 --- a/module/mr/lang/en.php +++ b/module/mr/lang/en.php @@ -105,7 +105,7 @@ $lang->mr->apiError->createMR = "Failed to create a merge request through API. R $lang->mr->apiError->sudo = "Unable to operate with the GitLab account bound to the current user. Reason: %s"; $lang->mr->createFailedFromAPI = "Failed to create Merge Request."; -$lang->mr->hasSameOpenedMR = "There are other unclosed merge requests in the current source branch."; +$lang->mr->hasSameOpenedMR = "There are duplicate and unclosed merge requests."; $lang->mr->accessGitlabFailed = "Unable to connect to the GitLab server."; $lang->mr->reopenSuccess = "The merge request was reopened."; $lang->mr->closeSuccess = "Merge request closed."; diff --git a/module/mr/lang/zh-cn.php b/module/mr/lang/zh-cn.php index c48e4105d2..cc843282fc 100644 --- a/module/mr/lang/zh-cn.php +++ b/module/mr/lang/zh-cn.php @@ -105,7 +105,7 @@ $lang->mr->apiError->createMR = "通过API创建合并请求失败,失败原 $lang->mr->apiError->sudo = "无法以当前用户绑定的GitLab账户进行操作,失败原因:%s"; $lang->mr->createFailedFromAPI = "创建合并请求失败。"; -$lang->mr->hasSameOpenedMR = "当前源分支存在其他未关闭的合并请求"; +$lang->mr->hasSameOpenedMR = "存在重复并且未关闭的合并请求。"; $lang->mr->accessGitlabFailed = "当前无法连接到GitLab服务器。"; $lang->mr->reopenSuccess = "已重新打开合并请求。"; $lang->mr->closeSuccess = "已关闭合并请求。";
      gitlab->tag->name;?>gitlab->tag->name;?> time, 0, 10);?> committer;?>comment?>comment?>
      protected ? 'disabled' : ''; - common::printLink('gitlab', 'deleteTag', "gitlabID=$gitlabID&projectID={$projectID}&tag_name=" . urlencode(base64_encode($gitlabTag->name)), " ", '', "title='{$lang->gitlab->deleteTag}' class='btn btn-primary' target='hiddenwin' $isDisabled"); + common::printLink('gitlab', 'deleteTag', "gitlabID=$gitlabID&projectID={$projectID}&tag_name=" . urlencode(helper::safe64Encode($gitlabTag->name)), " ", '', "title='{$lang->gitlab->deleteTag}' class='btn btn-primary' target='hiddenwin' $isDisabled"); ?>
      gitlab->branch->branchCreationLevelList, $gitlabTag->accessLevel);?> name)), " ", '', "title={$lang->gitlab->editTagPriv} class='btn btn-primary'"); - common::printLink('gitlab', 'deleteTagPriv', "gitlabID=$gitlabID&projectID={$projectID}&tag_name=" . urlencode(base64_encode($gitlabTag->name)), " ", '', "title='{$lang->gitlab->deleteTagPriv}' class='btn btn-primary' target='hiddenwin' onclick='if(confirm(\"{$lang->gitlab->tag->protectConfirmDel}\")==false) return false;'"); + common::printLink('gitlab', 'editTagPriv', "gitlabID=$gitlabID&projectID=$projectID&tag_name=" . urlencode(helper::safe64Encode($gitlabTag->name)), " ", '', "title={$lang->gitlab->editTagPriv} class='btn btn-primary'"); + common::printLink('gitlab', 'deleteTagPriv', "gitlabID=$gitlabID&projectID={$projectID}&tag_name=" . urlencode(helper::safe64Encode($gitlabTag->name)), " ", '', "title='{$lang->gitlab->deleteTagPriv}' class='btn btn-primary' target='hiddenwin' onclick='if(confirm(\"{$lang->gitlab->tag->protectConfirmDel}\")==false) return false;'"); ?>
      push_access_level];?> name)), " ", '', "title={$lang->gitlab->editBranchPriv} class='btn btn-primary'"); - if(common::hasPriv('gitlab', 'deleteBranchPriv')) echo html::a($this->createLink('gitlab', 'deleteBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=" . urlencode(base64_encode($branch->name))), '', 'hiddenwin', "title='{$lang->gitlab->deleteBranchPriv}' class='btn'"); + if(common::hasPriv('gitlab', 'editBranchPriv')) common::printLink('gitlab', 'editBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=" . urlencode(helper::safe64Encode($branch->name)), " ", '', "title={$lang->gitlab->editBranchPriv} class='btn btn-primary'"); + if(common::hasPriv('gitlab', 'deleteBranchPriv')) echo html::a($this->createLink('gitlab', 'deleteBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=" . urlencode(helper::safe64Encode($branch->name))), '', 'hiddenwin', "title='{$lang->gitlab->deleteBranchPriv}' class='btn'"); ?>
      id}", '', '', "title='{$lang->mr->overview}' class='btn btn-info'"); + common::printLink('mr', 'view', "mr={$MR->id}", '', '', "title='{$lang->mr->view}' class='btn btn-info'"); common::printLink('mr', 'edit', "mr={$MR->id}", '', '', "title='{$lang->mr->edit}' class='btn btn-info'"); common::printLink('mr', 'diff', "mr={$MR->id}", '', '', "title='{$lang->mr->viewDiff}' class='btn btn-info'"); common::printLink('mr', 'link', "mr={$MR->id}", '', '', "title='{$lang->mr->link}' class='btn btn-info'" . ($MR->linkButton == false ? 'disabled' : '')); diff --git a/module/mr/view/diff.html.php b/module/mr/view/diff.html.php index 9a5d29464a..e822e5c61e 100644 --- a/module/mr/view/diff.html.php +++ b/module/mr/view/diff.html.php @@ -24,7 +24,7 @@
      push_access_level];?> name)), " ", '', "title={$lang->gitlab->editBranchPriv} class='btn btn-primary'"); - if(common::hasPriv('gitlab', 'deleteBranchPriv')) echo html::a($this->createLink('gitlab', 'deleteBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=" . urlencode(helper::safe64Encode($branch->name))), '', 'hiddenwin', "title='{$lang->gitlab->deleteBranchPriv}' class='btn'"); + /* Fix error when request type is PATH_INFO and the branch name contains '-'.*/ + $branchName = str_replace('-', '*', $branch->name); + if(common::hasPriv('gitlab', 'editBranchPriv')) common::printLink('gitlab', 'editBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=$branchName", " ", '', "title={$lang->gitlab->editBranchPriv} class='btn btn-primary'"); + if(common::hasPriv('gitlab', 'deleteBranchPriv')) echo html::a($this->createLink('gitlab', 'deleteBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=$branchName"), '', 'hiddenwin', "title='{$lang->gitlab->deleteBranchPriv}' class='btn'"); ?>
      updated?> name); $isDisabled = $gitlabTag->protected ? 'disabled' : ''; - common::printLink('gitlab', 'deleteTag', "gitlabID=$gitlabID&projectID={$projectID}&tag_name=" . urlencode(helper::safe64Encode($gitlabTag->name)), " ", '', "title='{$lang->gitlab->deleteTag}' class='btn btn-primary' target='hiddenwin' $isDisabled"); + common::printLink('gitlab', 'deleteTag', "gitlabID=$gitlabID&projectID={$projectID}&tag_name=$tagName", " ", '', "title='{$lang->gitlab->deleteTag}' class='btn btn-primary' target='hiddenwin' $isDisabled"); ?>
      gitlab->branch->branchCreationLevelList, $gitlabTag->accessLevel);?> name)), " ", '', "title={$lang->gitlab->editTagPriv} class='btn btn-primary'"); - common::printLink('gitlab', 'deleteTagPriv', "gitlabID=$gitlabID&projectID={$projectID}&tag_name=" . urlencode(helper::safe64Encode($gitlabTag->name)), " ", '', "title='{$lang->gitlab->deleteTagPriv}' class='btn btn-primary' target='hiddenwin' onclick='if(confirm(\"{$lang->gitlab->tag->protectConfirmDel}\")==false) return false;'"); + /* Fix error when request type is PATH_INFO and the tag name contains '-'.*/ + $tagName = str_replace('-', '*', $gitlabTag->name); + common::printLink('gitlab', 'editTagPriv', "gitlabID=$gitlabID&projectID=$projectID&tag_name=$tagName", " ", '', "title={$lang->gitlab->editTagPriv} class='btn btn-primary'"); + common::printLink('gitlab', 'deleteTagPriv', "gitlabID=$gitlabID&projectID={$projectID}&tag_name=$tagName", " ", '', "title='{$lang->gitlab->deleteTagPriv}' class='btn btn-primary' target='hiddenwin' onclick='if(confirm(\"{$lang->gitlab->tag->protectConfirmDel}\")==false) return false;'"); ?>