diff --git a/module/gogs/model.php b/module/gogs/model.php
index 75774c17ae..eab69e68d8 100644
--- a/module/gogs/model.php
+++ b/module/gogs/model.php
@@ -517,4 +517,53 @@ class gogsModel extends model
->andWhere('providerID')->eq($gogsID)
->fetchPairs();
}
+
+ /**
+ * Get single branch by API.
+ *
+ * @param int $gogsID
+ * @param string $project
+ * @param string $branchName
+ * @access public
+ * @return object
+ */
+ public function apiGetSingleBranch($gogsID, $project, $branchName)
+ {
+ $url = sprintf($this->getApiRoot($gogsID), "/repos/$project/branches/$branchName");
+ $branch = json_decode(commonModel::http($url));
+ if($branch)
+ {
+ $gogs = $this->getByID($gogsID);
+ $branch->web_url = "{$gogs->url}/$project/src/branch/$branchName";
+ }
+
+ return $branch;
+ }
+
+ /**
+ * Get protect branches of one project.
+ *
+ * @param int $gogsID
+ * @param string $project
+ * @param string $keyword
+ * @access public
+ * @return array
+ */
+ public function apiGetBranchPrivs($gogsID, $project, $keyword = '')
+ {
+ $keyword = urlencode($keyword);
+ $url = sprintf($this->getApiRoot($gogsID), "/repos/$project/branch_protections");
+ $branches = json_decode(commonModel::http($url));
+
+ if(!is_array($branches)) return array();
+
+ $newBranches = array();
+ foreach($branches as $branch)
+ {
+ $branch->name = $branch->branch_name;
+ if(empty($keyword) || stristr($branch->name, $keyword)) $newBranches[] = $branch;
+ }
+
+ return $newBranches;
+ }
}
diff --git a/module/mr/control.php b/module/mr/control.php
index 490a28a2f4..09288e8c4a 100644
--- a/module/mr/control.php
+++ b/module/mr/control.php
@@ -34,7 +34,7 @@ class mr extends control
$this->app->loadClass('pager', $static = true);
$pager = new pager($recTotal, $recPerPage, $pageID);
- $repos = $this->loadModel('repo')->getListBySCM(array('Gitlab', 'Gitea'));
+ $repos = $this->loadModel('repo')->getListBySCM(array('Gitlab', 'Gitea', 'Gogs'));
if(empty($repos)) $this->locate($this->repo->createLink('create'));
$repoID = $this->repo->saveState($repoID, $objectID);
@@ -69,10 +69,14 @@ class mr extends control
{
$openIDList = $this->loadModel('gitlab')->getGitLabListByAccount($this->app->user->account);
}
- else
+ elseif($repo->SCM == 'Gitea')
{
$openIDList = $this->loadModel('gitea')->getGiteaListByAccount($this->app->user->account);
}
+ elseif($repo->SCM == 'Gogs')
+ {
+ $openIDList = $this->loadModel('gogs')->getGogsListByAccount($this->app->user->account);
+ }
}
$this->view->title = $this->lang->mr->common . $this->lang->colon . $this->lang->mr->browse;
@@ -108,22 +112,26 @@ class mr extends control
$repoID = $this->loadModel('repo')->saveState(0);
$repo = $this->repo->getRepoByID($repoID);
+ $this->loadModel('gitlab');
$this->loadModel('gitea');
+ $this->loadModel('gogs');
if($repo->SCM == 'Gitea')
{
$project = $this->gitea->apiGetSingleProject($repo->gitService, $repo->project);
if(empty($project) or !$project->allow_merge_commits) $repo = array();
}
- $hosts = $this->loadModel('pipeline')->getList(array('gitea', 'gitlab'));
+ $hosts = $this->loadModel('pipeline')->getList(array('gitea', 'gitlab', 'gogs'));
if(!$this->app->user->admin)
{
- $gitlabUsers = $this->loadModel('gitlab')->getGitLabListByAccount();
+ $gitlabUsers = $this->gitlab->getGitLabListByAccount();
$giteaUsers = $this->gitea->getGiteaListByAccount();
+ $gogsUsers = $this->gogs->getGogsListByAccount();
foreach($hosts as $hostID => $host)
{
if($host->type == 'gitLab' and isset($gitlabUsers[$hostID])) continue;
- if($host->type == 'gitea' and isset($giteaUsers[$hostID])) continue;
+ if($host->type == 'gitea' and isset($giteaUsers[$hostID])) continue;
+ if($host->type == 'gogs' and isset($gogsUsers[$hostID])) continue;
unset($hosts[$hostID]);
}
@@ -1039,7 +1047,7 @@ class mr extends control
$targetBranch = $this->post->targetBranch;
$result = $this->mr->checkSameOpened($hostID, $sourceProject, $sourceBranch, $targetProject, $targetBranch);
- echo json_encode($result);
+ return print(json_encode($result));
}
/**
@@ -1054,15 +1062,11 @@ class mr extends control
{
$host = $this->loadModel('pipeline')->getByID($hostID);
$scm = $host->type;
- if($scm == 'gitea') $project = urldecode(base64_decode($project));
+ if(in_array($scm, array('gitea', 'gogs'))) $project = urldecode(base64_decode($project));
$branchPrivs = array();
-
- if($scm != 'gogs')
- {
- $branches = $this->loadModel($scm)->apiGetBranchPrivs($hostID, $project);
- foreach($branches as $branch) $branchPrivs[$branch->name] = $branch->name;
- }
- echo json_encode($branchPrivs);
+ $branches = $this->loadModel($scm)->apiGetBranchPrivs($hostID, $project);
+ foreach($branches as $branch) $branchPrivs[$branch->name] = $branch->name;
+ return print(json_encode($branchPrivs));
}
}
diff --git a/module/mr/model.php b/module/mr/model.php
index ac9cd95b45..29afe4e11d 100644
--- a/module/mr/model.php
+++ b/module/mr/model.php
@@ -437,9 +437,9 @@ class mrModel extends model
{
$gitUsers = $this->loadModel('gitlab')->getUserIdAccountPairs($MR->hostID);
}
- elseif($rawMR->gitService == 'gitea')
+ else
{
- $gitUsers = $this->loadModel('gitea')->getUserAccountIdPairs($MR->hostID, 'openID,account');
+ $gitUsers = $this->loadModel($rawMR->gitService)->getUserAccountIdPairs($MR->hostID, 'openID,account');
}
$newMR = new stdclass;
@@ -670,21 +670,21 @@ class mrModel extends model
}
return json_decode(commonModel::http($url, $MRObject));
}
- elseif($host->type == 'gitea')
+ elseif(in_array($host->type, array('gitea', 'gogs')))
{
- $url = sprintf($this->loadModel('gitea')->getApiRoot($hostID), "/repos/$projectID/pulls");
+ $url = sprintf($this->loadModel($host->type)->getApiRoot($hostID), "/repos/$projectID/pulls");
$MRObject->head = $MR->sourceBranch;
$MRObject->base = $MR->targetBranch;
$MRObject->body = $MR->description;
if($MR->assignee)
{
- $assignee = $this->gitea->getUserIDByZentaoAccount($this->post->hostID, $MR->assignee);
+ $assignee = $this->{$host->type}->getUserIDByZentaoAccount($this->post->hostID, $MR->assignee);
if($assignee) $MRObject->assignee = $assignee;
}
$mergeResult = json_decode(commonModel::http($url, $MRObject));
- if(isset($mergeResult->number)) $mergeResult->iid = $mergeResult->number;
+ if(isset($mergeResult->number)) $mergeResult->iid = $host->type == 'gitea' ? $mergeResult->number : $mergeResult->id;
if(isset($mergeResult->mergeable))
{
if($mergeResult->mergeable) $mergeResult->merge_status = 'can_be_merged';
@@ -735,6 +735,22 @@ class mrModel extends model
$MR->target_project_id = $projectID;
}
}
+ elseif($scm == 'Gogs')
+ {
+ foreach($response as $MR)
+ {
+ $MR->iid = $MR->id;
+ $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_branch;
+ $MR->source_branch = $MR->head_branch;
+ $MR->source_project_id = $projectID;
+ $MR->target_project_id = $projectID;
+ }
+ }
return $response;
}
@@ -786,7 +802,7 @@ class mrModel extends model
$url = sprintf($this->gitlab->getApiRoot($hostID), "/projects/$projectID/merge_requests/$MRID");
$MR = json_decode(commonModel::http($url));
}
- else
+ else if($host->type == 'gitea')
{
$url = sprintf($this->loadModel('gitea')->getApiRoot($hostID), "/repos/$projectID/pulls/$MRID");
$MR = json_decode(commonModel::http($url));
@@ -809,6 +825,29 @@ class mrModel extends model
$MR->has_conflicts = empty($diff) ? true : false;
}
}
+ else if($host->type == 'gogs')
+ {
+ $url = sprintf($this->loadModel('gogs')->getApiRoot($hostID), "/repos/$projectID/pulls/$MRID");
+ $MR = json_decode(commonModel::http($url));
+ if(isset($MR->html_url))
+ {
+ $diff = $this->apiGetDiffs($hostID, $projectID, $MRID);
+
+ $MR->web_url = $MR->html_url;
+ $MR->iid = $MR->id;
+ $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 = empty($diff) ? 0 : 1;
+ $MR->description = $MR->body;
+ $MR->target_branch = $MR->base_branch;
+ $MR->source_branch = $MR->head_branch;
+ $MR->source_project_id = $projectID;
+ $MR->target_project_id = $projectID;
+ $MR->has_conflicts = empty($diff) ? true : false;
+ }
+ }
$MR->gitService = $host->type;
return $MR;
@@ -873,7 +912,7 @@ class mrModel extends model
}
$mergeResult = json_decode(commonModel::http($url, $newMR, array(), array(), 'json', 'PATCH'));
- if(isset($mergeResult->number)) $mergeResult->iid = $mergeResult->number;
+ if(isset($mergeResult->number)) $mergeResult->iid = $host->type == 'gitea' ? $mergeResult->number : $mergeResult->id;
if(isset($mergeResult->mergeable))
{
if($mergeResult->mergeable) $mergeResult->merge_status = 'can_be_merged';
@@ -936,7 +975,7 @@ class mrModel extends model
}
else
{
- $url = sprintf($this->loadModel('gitea')->getApiRoot($hostID), "/repos/$projectID/pulls/$MRID");
+ $url = sprintf($this->loadModel($host->type)->getApiRoot($hostID), "/repos/$projectID/pulls/$MRID");
return json_decode(commonModel::http($url, array('state' => 'closed'), array(), array(), 'json', 'PATCH'));
}
}
@@ -959,7 +998,7 @@ class mrModel extends model
$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
+ elseif($host->type == 'gitea')
{
$url = sprintf($this->loadModel('gitea')->getApiRoot($hostID), "/repos/$projectID/pulls/$MRID");
$MR = json_decode(commonModel::http($url, array('state' => 'open'), array(), array(), 'json', 'PATCH'));
@@ -974,6 +1013,23 @@ class mrModel extends model
$MR->source_project_id = $projectID;
$MR->target_project_id = $projectID;
+ return $MR;
+ }
+ elseif($host->type == 'gogs')
+ {
+ $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->id;
+ $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_branch;
+ $MR->source_branch = $MR->head_branch;
+ $MR->source_project_id = $projectID;
+ $MR->target_project_id = $projectID;
+
return $MR;
}
}
diff --git a/module/repo/control.php b/module/repo/control.php
index 6abc0c51b3..1e44345bcf 100644
--- a/module/repo/control.php
+++ b/module/repo/control.php
@@ -1254,10 +1254,11 @@ class repo extends control
public function ajaxGetGogsProjects($gogsID)
{
$projects = $this->loadModel('gogs')->apiGetProjects($gogsID);
- if(!$projects) $this->send(array('message' => array()));
-
$options = "";
- foreach($projects as $project) $options .= "";
+ if(!empty($projects))
+ {
+ foreach($projects as $project) $options .= "";
+ }
return print($options);
}