From 07465a327d7bc8204bc227ee3e7aa847ad94ef11 Mon Sep 17 00:00:00 2001
From: caoyanyi
- step 4. Push the result of the merge to GitLab + step 4. Push the result of the merge to Git
git push origin "%s"@@ -186,7 +190,7 @@ EOD; $lang->mr->noChanges = "Currently there are no changes in this merge request's source branch. Please push new commits or use a different branch."; -$lang->mr->linkTask = 'Link Tasks'; +$lang->mr->linkTask = "Link task"; $lang->mr->unlinkTask = "Remove task"; $lang->mr->linkedTasks = 'Task'; $lang->mr->unlinkedTasks = 'Task not linked'; diff --git a/module/mr/lang/en.php b/module/mr/lang/en.php index 19e369019c..166c55c36d 100644 --- a/module/mr/lang/en.php +++ b/module/mr/lang/en.php @@ -14,7 +14,7 @@ $lang->mr->source = 'source'; $lang->mr->target = 'target'; $lang->mr->viewDiff = 'View diff'; $lang->mr->diff = 'View diff'; -$lang->mr->viewInGitlab = 'View in GitLab'; +$lang->mr->viewInGit = 'View in APP'; $lang->mr->link = 'Link of stories,Bugs,tasks'; $lang->mr->createAction = '%s, %s submitted a Merge Request.'; @@ -39,8 +39,8 @@ $lang->mr->gitlabID = 'GitLab'; $lang->mr->repoID = 'Repo'; $lang->mr->jobID = 'Compile job'; -$lang->mr->canMerge = "Can merge"; -$lang->mr->cantMerge = "不可合并"; +$lang->mr->canMerge = "Can be merged"; +$lang->mr->cantMerge = "Can not be merged"; $lang->mr->approval = 'Approval'; $lang->mr->approve = 'Approve'; @@ -182,7 +182,7 @@ $lang->mr->commandDocument = <<< EOD git merge --no-ff "%s"
- step 4. Push the result of the merge to GitLab + step 4. Push the result of the merge to Git
git push origin "%s"diff --git a/module/mr/lang/fr.php b/module/mr/lang/fr.php index 737cebfa40..166c55c36d 100644 --- a/module/mr/lang/fr.php +++ b/module/mr/lang/fr.php @@ -14,7 +14,7 @@ $lang->mr->source = 'source'; $lang->mr->target = 'target'; $lang->mr->viewDiff = 'View diff'; $lang->mr->diff = 'View diff'; -$lang->mr->viewInGitlab = 'View in GitLab'; +$lang->mr->viewInGit = 'View in APP'; $lang->mr->link = 'Link of stories,Bugs,tasks'; $lang->mr->createAction = '%s, %s submitted a Merge Request.'; @@ -39,8 +39,8 @@ $lang->mr->gitlabID = 'GitLab'; $lang->mr->repoID = 'Repo'; $lang->mr->jobID = 'Compile job'; -$lang->mr->canMerge = "Can merge"; -$lang->mr->cantMerge = "不可合并"; +$lang->mr->canMerge = "Can be merged"; +$lang->mr->cantMerge = "Can not be merged"; $lang->mr->approval = 'Approval'; $lang->mr->approve = 'Approve'; @@ -117,11 +117,15 @@ $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->apiErrorMap[3] = "401 Unauthorized"; $lang->mr->apiErrorMap[4] = "403 Forbidden"; +$lang->mr->apiErrorMap[5] = "/(pull request already exists for these targets).*/"; +$lang->mr->apiErrorMap[6] = "Invalid PullRequest: There are no changes between the head and the base"; $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: ID%u'; $lang->mr->errorLang[3] = "Unauthorized"; $lang->mr->errorLang[4] = 'Permission denied'; +$lang->mr->errorLang[5] = 'Another open merge request already exists for this source branch'; +$lang->mr->errorLang[6] = 'The source project branch cannot be the same as the target project branch'; $lang->mr->from = "from"; $lang->mr->to = "to"; @@ -178,7 +182,7 @@ $lang->mr->commandDocument = <<< EOD git merge --no-ff "%s"
- step 4. Push the result of the merge to GitLab + step 4. Push the result of the merge to Git
git push origin "%s"@@ -186,7 +190,7 @@ EOD; $lang->mr->noChanges = "Currently there are no changes in this merge request's source branch. Please push new commits or use a different branch."; -$lang->mr->linkTask = 'Link Tasks'; +$lang->mr->linkTask = "Link task"; $lang->mr->unlinkTask = "Remove task"; $lang->mr->linkedTasks = 'Task'; $lang->mr->unlinkedTasks = 'Task not linked'; diff --git a/module/mr/lang/vi.php b/module/mr/lang/vi.php index 2229b85679..166c55c36d 100644 --- a/module/mr/lang/vi.php +++ b/module/mr/lang/vi.php @@ -14,7 +14,7 @@ $lang->mr->source = 'source'; $lang->mr->target = 'target'; $lang->mr->viewDiff = 'View diff'; $lang->mr->diff = 'View diff'; -$lang->mr->viewInGitlab = 'View in GitLab'; +$lang->mr->viewInGit = 'View in APP'; $lang->mr->link = 'Link of stories,Bugs,tasks'; $lang->mr->createAction = '%s, %s submitted a Merge Request.'; @@ -39,8 +39,8 @@ $lang->mr->gitlabID = 'GitLab'; $lang->mr->repoID = 'Repo'; $lang->mr->jobID = 'Compile job'; -$lang->mr->canMerge = "Can merge"; -$lang->mr->cantMerge = "不可合并"; +$lang->mr->canMerge = "Can be merged"; +$lang->mr->cantMerge = "Can not be merged"; $lang->mr->approval = 'Approval'; $lang->mr->approve = 'Approve'; @@ -117,11 +117,15 @@ $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->apiErrorMap[3] = "401 Unauthorized"; $lang->mr->apiErrorMap[4] = "403 Forbidden"; +$lang->mr->apiErrorMap[5] = "/(pull request already exists for these targets).*/"; +$lang->mr->apiErrorMap[6] = "Invalid PullRequest: There are no changes between the head and the base"; $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: ID%u'; $lang->mr->errorLang[3] = "Unauthorized"; $lang->mr->errorLang[4] = 'Permission denied'; +$lang->mr->errorLang[5] = 'Another open merge request already exists for this source branch'; +$lang->mr->errorLang[6] = 'The source project branch cannot be the same as the target project branch'; $lang->mr->from = "from"; $lang->mr->to = "to"; @@ -178,7 +182,7 @@ $lang->mr->commandDocument = <<< EOD git merge --no-ff "%s"
- step 4. Push the result of the merge to GitLab + step 4. Push the result of the merge to Git
git push origin "%s"diff --git a/module/mr/lang/zh-cn.php b/module/mr/lang/zh-cn.php index 6d451b74be..d9fc6b5770 100644 --- a/module/mr/lang/zh-cn.php +++ b/module/mr/lang/zh-cn.php @@ -14,7 +14,7 @@ $lang->mr->source = '源项目分支'; $lang->mr->target = '目标项目分支'; $lang->mr->viewDiff = '比对代码'; $lang->mr->diff = '比对代码'; -$lang->mr->viewInGitlab = '在GitLab查看'; +$lang->mr->viewInGit = '在应用中查看'; $lang->mr->link = '关联需求、Bug、任务'; $lang->mr->createAction = '%s, 由 %s 提交了 合并请求。'; @@ -182,7 +182,7 @@ $lang->mr->commandDocument = <<< EOD git merge --no-ff "%s"
- 第 4 步. 将合并结果推送到GitLab + 第 4 步. 将合并结果推送到Git
git push origin "%s"diff --git a/module/mr/model.php b/module/mr/model.php index c00f923d48..661ecf6d57 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -669,6 +669,7 @@ class mrModel extends model if(!$mergeResult->mergeable) $mergeResult->merge_status = 'cannot_be_merged'; } if(isset($mergeResult->state) and $mergeResult->state == 'open') $mergeResult->state = 'opened'; + if(isset($mergeResult->merged) and $mergeResult->merged) $mergeResult->state = 'merged'; return $mergeResult; } } @@ -697,16 +698,18 @@ class mrModel extends model if(empty($response)) $response = array(); if($scm == 'Gitea') { - foreach($response as $mr) + foreach($response as $MR) { - $mr->iid = $mr->number; - $mr->state = $mr->state == 'open' ? 'opened' : $mr->state; - $mr->merge_status = $mr->mergeable ? 'can_be_merged' : 'cannot_be_merged'; - $mr->description = $mr->body; - $mr->target_branch = $mr->base->ref; - $mr->source_branch = $mr->head->ref; - $mr->source_project_id = $projectID; - $mr->target_project_id = $projectID; + $MR->iid = $MR->number; + $MR->state = $MR->state == 'open' ? 'opened' : $MR->state; + if($MR->merged) $MR->state = 'merged'; + + $MR->merge_status = $MR->mergeable ? 'can_be_merged' : 'cannot_be_merged'; + $MR->description = $MR->body; + $MR->target_branch = $MR->base->ref; + $MR->source_branch = $MR->head->ref; + $MR->source_project_id = $projectID; + $MR->target_project_id = $projectID; } } @@ -733,10 +736,10 @@ class mrModel extends model if($response) { - foreach($response as $mr) + 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; + 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 $MMRR; } } return null; @@ -764,6 +767,24 @@ class mrModel extends model { $url = sprintf($this->loadModel('gitea')->getApiRoot($hostID), "/repos/$projectID/pulls/$MRID"); $MR = json_decode(commonModel::http($url)); + if(isset($MR->url)) + { + $diff = $this->apiGetDiffs($hostID, $projectID, $MRID); + + $MR->web_url = $MR->url; + $MR->iid = $MR->number; + $MR->state = $MR->state == 'open' ? 'opened' : $MR->state; + if($MR->merged) $MR->state = 'merged'; + + $MR->merge_status = $MR->mergeable ? 'can_be_merged' : 'cannot_be_merged'; + $MR->changes_count = (int)$diff; + $MR->description = $MR->body; + $MR->target_branch = $MR->base->ref; + $MR->source_branch = $MR->head->ref; + $MR->source_project_id = $projectID; + $MR->target_project_id = $projectID; + $MR->has_conflicts = !(bool)$diff; + } return $MR; } @@ -835,6 +856,7 @@ class mrModel extends model if(!$mergeResult->mergeable) $mergeResult->merge_status = 'cannot_be_merged'; } if(isset($mergeResult->state) and $mergeResult->state == 'open') $mergeResult->state = 'opened'; + if(isset($mergeResult->merged) and $mergeResult->merged) $mergeResult->state = 'merged'; return $mergeResult; } } @@ -876,8 +898,17 @@ class mrModel extends model */ public function apiCloseMR($hostID, $projectID, $MRID) { - $url = sprintf($this->gitlab->getApiRoot($hostID), "/projects/$projectID/merge_requests/$MRID") . '&state_event=close'; - return json_decode(commonModel::http($url, null, array(CURLOPT_CUSTOMREQUEST => 'PUT'))); + $host = $this->loadModel('pipeline')->getByID($hostID); + if($host->type == 'gitlab') + { + $url = sprintf($this->gitlab->getApiRoot($hostID), "/projects/$projectID/merge_requests/$MRID") . '&state_event=close'; + return json_decode(commonModel::http($url, null, array(CURLOPT_CUSTOMREQUEST => 'PUT'))); + } + else + { + $url = sprintf($this->loadModel('gitea')->getApiRoot($hostID), "/repos/$projectID/pulls/$MRID"); + return json_decode(commonModel::http($url, array('state' => 'closed'), array(), array(), 'json', 'PATCH')); + } } /** @@ -892,8 +923,29 @@ class mrModel extends model */ public function apiReopenMR($hostID, $projectID, $MRID) { - $url = sprintf($this->gitlab->getApiRoot($hostID), "/projects/$projectID/merge_requests/$MRID") . '&state_event=reopen'; - return json_decode(commonModel::http($url, null, array(CURLOPT_CUSTOMREQUEST => 'PUT'))); + $host = $this->loadModel('pipeline')->getByID($hostID); + if($host->type == 'gitlab') + { + $url = sprintf($this->gitlab->getApiRoot($hostID), "/projects/$projectID/merge_requests/$MRID") . '&state_event=reopen'; + return json_decode(commonModel::http($url, null, array(CURLOPT_CUSTOMREQUEST => 'PUT'))); + } + else + { + $url = sprintf($this->loadModel('gitea')->getApiRoot($hostID), "/repos/$projectID/pulls/$MRID"); + $MR = json_decode(commonModel::http($url, array('state' => 'open'), array(), array(), 'json', 'PATCH')); + $MR->iid = $MR->number; + $MR->state = $MR->state == 'open' ? 'opened' : $MR->state; + if($MR->merged) $MR->state = 'merged'; + + $MR->merge_status = $MR->mergeable ? 'can_be_merged' : 'cannot_be_merged'; + $MR->description = $MR->body; + $MR->target_branch = $MR->base->ref; + $MR->source_branch = $MR->head->ref; + $MR->source_project_id = $projectID; + $MR->target_project_id = $projectID; + + return $MR; + } } /** @@ -903,19 +955,44 @@ class mrModel extends model * @param int $hostID * @param int $projectID * @param int $MRID - * @param string $sudo + * @param object $MR * @access public * @return object */ - public function apiAcceptMR($hostID, $projectID, $MRID, $sudo = "") + public function apiAcceptMR($hostID, $projectID, $MRID, $MR = null) { - $apiRoot = $this->gitlab->getApiRoot($hostID); - $approveUrl = sprintf($apiRoot, "/projects/$projectID/merge_requests/$MRID/approved"); - commonModel::http($approveUrl, null, array(CURLOPT_CUSTOMREQUEST => 'POST')); + $host = $this->loadModel('pipeline')->getByID($hostID); + if($host->type == 'gitlab') + { + $apiRoot = $this->gitlab->getApiRoot($hostID); + $approveUrl = sprintf($apiRoot, "/projects/$projectID/merge_requests/$MRID/approved"); + commonModel::http($approveUrl, null, array(CURLOPT_CUSTOMREQUEST => 'POST')); - $url = sprintf($apiRoot, "/projects/$projectID/merge_requests/$MRID/merge"); - if($sudo != "") return json_decode(commonModel::http($url, null, array(CURLOPT_CUSTOMREQUEST => 'PUT'), $headers = array("sudo: {$sudo}"))); - return json_decode(commonModel::http($url, null, array(CURLOPT_CUSTOMREQUEST => 'PUT'))); + $url = sprintf($apiRoot, "/projects/$projectID/merge_requests/$MRID/merge"); + return json_decode(commonModel::http($url, null, array(CURLOPT_CUSTOMREQUEST => 'PUT'))); + } + elseif($host->type == 'gitea') + { + $apiRoot = $this->loadModel('gitea')->getApiRoot($hostID); + $url = sprintf($apiRoot, "/repos/$projectID/pulls/$MRID/merge"); + $rowMR = json_decode(commonModel::http($url, array('Do' => 'merge'), array(), array(), 'json', 'POST')); + if(!isset($rowMR->massage)) + { + $rowMR = $this->apiGetSingleMR($hostID, $projectID, $MRID); + + $this->dao->update(TABLE_MR)->data(array('status' => 'merged')) + ->where('id')->eq($MRID) + ->autoCheck() + ->exec(); + + if($MR and $MR->removeSourceBranch == '1') + { + $url = sprintf($apiRoot, "/repos/$projectID/branches/{$MR->sourceBranch}"); + json_decode(commonModel::http($url, null, array(CURLOPT_CUSTOMREQUEST => 'DELETE'))); + } + } + return $rowMR; + } } /** @@ -930,40 +1007,49 @@ class mrModel extends model public function getDiffs($MR, $encoding = '') { $diffVersions = array(); - if($MR->synced) $diffVersions = $this->apiGetDiffVersions($MR->hostID, $MR->targetProject, $MR->mriid); - $gitlab = $this->gitlab->getByID($MR->hostID); + $host = $this->loadModel('pipeline')->getByID($MR->hostID); + $scm = $host->type; $this->loadModel('repo'); $repo = new stdclass; - $repo->SCM = 'GitLab'; - $repo->gitlab = $gitlab->id; - $repo->project = $MR->targetProject; - $repo->path = sprintf($this->config->repo->gitlab->apiPath, $gitlab->url, $MR->targetProject); - $repo->client = $gitlab->url; - $repo->password = $gitlab->token; - $repo->account = ''; - $repo->encoding = $encoding; + $repo->SCM = $this->lang->repo->scmList[ucfirst($scm)]; + $repo->gitService = $host->id; + $repo->project = $MR->targetProject; + $repo->path = sprintf($this->config->repo->$scm->apiPath, $host->url, $MR->targetProject); + $repo->client = $host->url; + $repo->password = $host->token; + $repo->account = ''; + $repo->encoding = $encoding; $lines = array(); $commitList = array(); - foreach($diffVersions as $diffVersion) + if($scm == 'gitlab') { - $singleDiff = $this->apiGetSingleDiffVersion($MR->hostID, $MR->targetProject, $MR->mriid, $diffVersion->id); - if($singleDiff->state == 'empty') continue; - - $commits = $singleDiff->commits; - $diffs = $singleDiff->diffs; - foreach($diffs as $index => $diff) + if($MR->synced) $diffVersions = $this->apiGetDiffVersions($MR->hostID, $MR->targetProject, $MR->mriid); + foreach($diffVersions as $diffVersion) { - $lines[] = sprintf("diff --git a/%s b/%s", $diff->old_path, $diff->new_path); - $lines[] = sprintf("index %s ... %s %s ", $singleDiff->head_commit_sha, $singleDiff->base_commit_sha, $diff->b_mode); - $lines[] = sprintf("--a/%s", $diff->old_path); - $lines[] = sprintf("--b/%s", $diff->new_path); - $diffLines = explode("\n", $diff->diff); - foreach($diffLines as $diffLine) $lines[] = $diffLine; + $singleDiff = $this->apiGetSingleDiffVersion($MR->hostID, $MR->targetProject, $MR->mriid, $diffVersion->id); + if($singleDiff->state == 'empty') continue; + + $commits = $singleDiff->commits; + $diffs = $singleDiff->diffs; + foreach($diffs as $index => $diff) + { + $lines[] = sprintf("diff --git a/%s b/%s", $diff->old_path, $diff->new_path); + $lines[] = sprintf("index %s ... %s %s ", $singleDiff->head_commit_sha, $singleDiff->base_commit_sha, $diff->b_mode); + $lines[] = sprintf("--a/%s", $diff->old_path); + $lines[] = sprintf("--b/%s", $diff->new_path); + $diffLines = explode("\n", $diff->diff); + foreach($diffLines as $diffLine) $lines[] = $diffLine; + } } } + else + { + $diffs = $this->apiGetDiffs($MR->hostID, $MR->targetProject, $MR->mriid); + $lines = explode("\n", $diffs); + } if(empty($MR->synced)) { @@ -1075,10 +1161,33 @@ class mrModel extends model */ public function apiGetDiffCommits($hostID, $projectID, $MRID) { - $url = sprintf($this->gitlab->getApiRoot($hostID), "/projects/$projectID/merge_requests/$MRID/commits"); + $host = $this->loadModel('pipeline')->getByID($hostID); + if($host->type == 'gitlab') + { + $url = sprintf($this->gitlab->getApiRoot($hostID), "/projects/$projectID/merge_requests/$MRID/commits"); + } + else + { + $url = sprintf($this->loadModel('gitea')->getApiRoot($hostID), "/repos/$projectID/pulls/$MRID/commits"); + } return json_decode(commonModel::http($url)); } + /** + * Get diff of MR from Gitea API. + * + * @param int $hostID + * @param int $projectID + * @param int $MRID + * @access public + * @return object + */ + public function apiGetDiffs($hostID, $projectID, $MRID) + { + $url = sprintf($this->loadModel('gitea')->getApiRoot($hostID), "/repos/$projectID/pulls/$MRID.diff"); + return commonModel::http($url); + } + /** * Reject or Approve this MR. * @@ -1098,9 +1207,9 @@ class mrModel extends model $rawApprovalStatus = ''; if(isset($MR->approvalStatus)) $rawApprovalStatus = $MR->approvalStatus; $MR->approver = $this->app->user->account; - if ($action == 'reject' and $rawApprovalStatus != 'rejected') $MR->approvalStatus = 'rejected'; - if ($action == 'approve' and $rawApprovalStatus != 'approved') $MR->approvalStatus = 'approved'; - if (isset($MR->approvalStatus) and $rawApprovalStatus != $MR->approvalStatus) + if($action == 'reject' and $rawApprovalStatus != 'rejected') $MR->approvalStatus = 'rejected'; + if($action == 'approve' and $rawApprovalStatus != 'approved') $MR->approvalStatus = 'approved'; + if(isset($MR->approvalStatus) and $rawApprovalStatus != $MR->approvalStatus) { $changes = common::createChanges($oldMR, $MR); $this->action->logHistory($actionID, $changes); @@ -1731,13 +1840,13 @@ class mrModel extends model /** * Get toList and ccList. * - * @param object $mr + * @param object $MR * @access public * @return bool|array */ - public function getToAndCcList($mr) + public function getToAndCcList($MR) { - return array($mr->createdBy, $mr->assignee); + return array($MR->createdBy, $MR->assignee); } /** @@ -1798,8 +1907,8 @@ class mrModel extends model ->fetch('id'); if(!empty($dbOpenedID)) return array('result' => 'fail', 'message' => sprintf($this->lang->mr->hasSameOpenedMR, $dbOpenedID)); - $mr = $this->apiGetSameOpened($hostID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); - if($mr) return array('result' => 'fail', 'message' => sprintf($this->lang->mr->errorLang[2], $mr->iid)); + $MR = $this->apiGetSameOpened($hostID, $sourceProject, $sourceBranch, $targetProject, $targetBranch); + if($MR) return array('result' => 'fail', 'message' => sprintf($this->lang->mr->errorLang[2], $MR->iid)); return array('result' => 'success'); } diff --git a/module/mr/view/view.html.php b/module/mr/view/view.html.php index 83cb52472c..e386b8f05f 100644 --- a/module/mr/view/view.html.php +++ b/module/mr/view/view.html.php @@ -31,7 +31,7 @@ id ?> title; ?> synced):?> - web_url, $lang->mr->viewInGitlab, "_blank", "class='btn btn-link btn-active-text' style='color: blue'"); ?> + web_url, $lang->mr->viewInGit, "_blank", "class='btn btn-link btn-active-text' style='color: blue'"); ?> @@ -85,7 +85,7 @@