From 76c813efc95e7eba5b68fff45949221f157316f9 Mon Sep 17 00:00:00 2001 From: liyuchun <563917701@qq.com> Date: Tue, 21 Jun 2022 03:25:51 +0000 Subject: [PATCH] * Finish task #57657. --- module/mr/model.php | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/module/mr/model.php b/module/mr/model.php index 995ea43fbd..6d5401fe38 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -236,6 +236,12 @@ class mrModel extends model /* Update MR in Zentao database. */ $this->dao->update(TABLE_MR)->data($newMR)->where('id')->eq($MRID)->autoCheck()->exec(); + + /* Link stories,bugs and tasks. */ + $MR->id = $MRID; + $MR->mriid = $newMR->mriid; + $this->linkObjects($MR); + if(dao::isError()) return array('result' => 'fail', 'message' => dao::getError()); return array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => helper::createLink('mr', 'browse')); } @@ -388,7 +394,9 @@ class mrModel extends model ->batchCheck($this->config->mr->edit->requiredFields, 'notempty') ->autoCheck() ->exec(); + $MR = $this->getByID($MRID); + $this->linkObjects($MR); if(dao::isError()) return array('result' => 'fail', 'message' => dao::getError()); return array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => helper::createLink('mr', 'browse')); @@ -675,6 +683,22 @@ class mrModel extends model return json_decode(commonModel::http($url)); } + /** + * Get MR commits by API. + * + * @link https://docs.gitlab.com/ee/api/merge_requests.html#get-commits + * @param int $gitlabID + * @param int $projectID targetProject + * @param int $MRID + * @access public + * @return object + */ + public function apiGetMRCommits($gitlabID, $projectID, $MRID) + { + $url = sprintf($this->gitlab->getApiRoot($gitlabID), "/projects/$projectID/merge_requests/$MRID/commits"); + return json_decode(commonModel::http($url)); + } + /** * Update MR by API. * @@ -1435,6 +1459,78 @@ class mrModel extends model } } + /** + * Link objects. + * + * @param object $MR + * @access public + * @return void + */ + public function linkObjects($MR) + { + $this->loadModel('repo'); + $this->loadModel('action'); + + /* Init objects. */ + $stories = $bugs = $tasks = array(); + + /* Get commits by MR. */ + $commits = $this->apiGetMRCommits($MR->gitlabID, $MR->targetProject, $MR->mriid); + foreach($commits as $commit) + { + $objects = $this->repo->parseComment($commit->message); + $stories = array_merge($stories, $objects['stories']); + $bugs = array_merge($bugs, $objects['bugs']); + $tasks = array_merge($tasks, $objects['tasks']); + } + + $users = $this->loadModel('user')->getPairs('noletter'); + $MRCreateAction = $MR->createdDate . '::' . zget($users, $MR->createdBy) . '::' . helper::createLink('mr', 'view', "mr={$MR->id}"); + $product = $this->getMRProduct($MR); + + foreach($stories as $storyID) + { + $relation = new stdclass; + $relation->product = $product->id; + $relation->AType = 'mr'; + $relation->AID = $MR->id; + $relation->relation = 'interrated'; + $relation->BType = 'story'; + $relation->BID = $storyID; + + $this->dao->replace(TABLE_RELATION)->data($relation)->exec(); + $this->action->create('story', $linkID, 'createmr', '', $MRCreateAction); + } + + foreach($bugs as $bugID) + { + $relation = new stdclass; + $relation->product = $product->id; + $relation->AType = 'mr'; + $relation->AID = $MR->id; + $relation->relation = 'interrated'; + $relation->BType = 'bug'; + $relation->BID = $bugID; + + $this->dao->replace(TABLE_RELATION)->data($relation)->exec(); + $this->action->create('bug', $linkID, 'createmr', '', $MRCreateAction); + } + + foreach($tasks as $taskID) + { + $relation = new stdclass; + $relation->product = $product->id; + $relation->AType = 'mr'; + $relation->AID = $MR->id; + $relation->relation = 'interrated'; + $relation->BType = 'task'; + $relation->BID = $taskID; + + $this->dao->replace(TABLE_RELATION)->data($relation)->exec(); + $this->action->create('task', $linkID, 'createmr', '', $MRCreateAction); + } + } + /** * unLink an mr link. *