* Finish task#86376,86375

This commit is contained in:
zenggang
2023-03-17 08:33:40 +00:00
parent d3149400b0
commit c6efd71426
11 changed files with 274 additions and 20 deletions
+21 -19
View File
@@ -1303,26 +1303,28 @@ $lang->resource->repo->linkStory = 'linkStory';
$lang->resource->repo->linkBug = 'linkBug';
$lang->resource->repo->linkTask = 'linkTask';
$lang->resource->repo->unlink = 'unlink';
$lang->resource->repo->import = 'importAction';
$lang->repo->methodOrder[5] = 'create';
$lang->repo->methodOrder[10] = 'edit';
$lang->repo->methodOrder[15] = 'delete';
$lang->repo->methodOrder[20] = 'showSyncCommit';
$lang->repo->methodOrder[25] = 'maintain';
$lang->repo->methodOrder[30] = 'browse';
$lang->repo->methodOrder[35] = 'view';
$lang->repo->methodOrder[40] = 'diff';
$lang->repo->methodOrder[45] = 'log';
$lang->repo->methodOrder[50] = 'revision';
$lang->repo->methodOrder[55] = 'blame';
$lang->repo->methodOrder[60] = 'download';
$lang->repo->methodOrder[65] = 'setRules';
$lang->repo->methodOrder[70] = 'apiGetRepoByUrl';
$lang->repo->methodOrder[75] = 'downloadCode';
$lang->repo->methodOrder[80] = 'linkStory';
$lang->repo->methodOrder[85] = 'linkBug';
$lang->repo->methodOrder[90] = 'linkTask';
$lang->repo->methodOrder[95] = 'unlink';
$lang->repo->methodOrder[5] = 'create';
$lang->repo->methodOrder[10] = 'edit';
$lang->repo->methodOrder[15] = 'delete';
$lang->repo->methodOrder[20] = 'showSyncCommit';
$lang->repo->methodOrder[25] = 'maintain';
$lang->repo->methodOrder[30] = 'browse';
$lang->repo->methodOrder[35] = 'view';
$lang->repo->methodOrder[40] = 'diff';
$lang->repo->methodOrder[45] = 'log';
$lang->repo->methodOrder[50] = 'revision';
$lang->repo->methodOrder[55] = 'blame';
$lang->repo->methodOrder[60] = 'download';
$lang->repo->methodOrder[65] = 'setRules';
$lang->repo->methodOrder[70] = 'apiGetRepoByUrl';
$lang->repo->methodOrder[75] = 'downloadCode';
$lang->repo->methodOrder[80] = 'linkStory';
$lang->repo->methodOrder[85] = 'linkBug';
$lang->repo->methodOrder[90] = 'linkTask';
$lang->repo->methodOrder[95] = 'unlink';
$lang->repo->methodOrder[100] = 'import';
$lang->resource->ci = new stdclass();
$lang->resource->ci->commitResult = 'commitResult';
+46 -1
View File
@@ -1382,6 +1382,50 @@ class repo extends control
return $this->send(array('result' => 'success', 'revision' => $revision));
}
/**
* Import repos.
*
* @param int $server
* @access public
* @return void
*/
public function import($server = 0)
{
if($_POST)
{
$this->repo->batchCreate();
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->repo->createLink('maintain')));
}
$gitlabList = $this->loadModel('gitlab')->getList();
$gitlab = empty($server) ? array_shift($gitlabList) : $this->gitlab->getById($server);
$repoList = array();
if(!empty($gitlab))
{
$repoList = $this->gitlab->apiGetProjects($gitlab->id);
$existRepoList = $this->dao->select('serviceProject,name')->from(TABLE_REPO)
->where('SCM')->eq(ucfirst($gitlab->type))
->andWhere('serviceHost')->eq($gitlab->id)
->fetchPairs();
foreach($repoList as $key => $repo)
{
if(isset($existRepoList[$repo->id])) unset($repoList[$key]);
}
}
$products = $this->loadModel('product')->getPairs('', 0, '', 'all');
$this->view->gitlabPairs = $this->gitlab->getPairs();
$this->view->products = $products;
$this->view->projects = $this->product->getProjectPairsByProductIDList(array_keys($products));
$this->view->gitlab = $gitlab;
$this->view->repoList = array_values($repoList);
$this->display();
}
/**
* Ajax sync comment.
*
@@ -1710,7 +1754,8 @@ class repo extends control
$selectedProjects = array_intersect(array_keys($accessProjects), $postData->projects);
return print (html::select('projects[]', $accessProjects, $selectedProjects, "class='form-control chosen' multiple"));
$name = isset($postData->number) ? "projects[{$postData->number}][]" : 'projects[]';
return print (html::select($name, $accessProjects, $selectedProjects, "class='form-control chosen' multiple"));
}
/**
+7
View File
@@ -0,0 +1,7 @@
#repoList td.form-actions {padding: 7px;}
#repoList td.form-actions a {line-height: 18px;}
.main-table .table {cursor: default;}
.main-table thead>tr {border-bottom: none; height: 45px;}
.main-table tbody>tr {border-bottom: none; height: 42px;}
.icon-close {cursor: pointer;}
+53
View File
@@ -0,0 +1,53 @@
/**
* Delete the project.
*
* @param object $icon
* @access public
* @return void
*/
function delItem(icon)
{
$(icon).closest('tr').remove();
checkItem();
}
/**
* Check the project.
*
* @access public
* @return void
*/
function checkItem()
{
if(!$("#repoList tbody tr").length) $("#submit").prop('disabled', true);
}
$(function()
{
checkItem();
$(document).on('change', '[id^=product]', function()
{
var i = $(this).attr('id').replace(/[^0-9]/ig, '');
var projects = $('#projects' + i).val();
var products = $(this).val();
$.post(createLink('repo', 'ajaxProjectsOfProducts'), {products, projects, 'number':i}, function(response)
{
$('#projectContainer' + i).html('').append(response);
$('#projects' + i).chosen().trigger("chosen:updated");
});
});
});
/**
* Change server.
*
* @access public
* @return void
*/
function selectServer()
{
var server = $('#servers').val();
window.location.href = createLink('repo', 'import', 'server=' + server);
}
+5
View File
@@ -46,6 +46,11 @@ $lang->repo->httpClone = 'Clone with HTTP';
$lang->repo->cloneUrl = 'Clone URL';
$lang->repo->linkTask = 'Link Task';
$lang->repo->unlinkedTasks = 'Unlinked Tasks';
$lang->repo->importAction = 'Import Repo';
$lang->repo->import = 'Import';
$lang->repo->importName = 'Name after import';
$lang->repo->importServer = 'Please select a server';
$lang->repo->gitlabList = 'Gitlab Repo';
$lang->repo->submit = 'Submit';
$lang->repo->cancel = 'Cancel';
+5
View File
@@ -46,6 +46,11 @@ $lang->repo->httpClone = 'Clone with HTTP';
$lang->repo->cloneUrl = 'Clone URL';
$lang->repo->linkTask = 'Link Task';
$lang->repo->unlinkedTasks = 'Unlinked Tasks';
$lang->repo->importAction = 'Import Repo';
$lang->repo->import = 'Import';
$lang->repo->importName = 'Name after import';
$lang->repo->importServer = 'Please select a server';
$lang->repo->gitlabList = 'Gitlab Repo';
$lang->repo->submit = 'Submit';
$lang->repo->cancel = 'Cancel';
+5
View File
@@ -46,6 +46,11 @@ $lang->repo->httpClone = 'Clone with HTTP';
$lang->repo->cloneUrl = 'Clone URL';
$lang->repo->linkTask = 'Link Task';
$lang->repo->unlinkedTasks = 'Unlinked Tasks';
$lang->repo->importAction = 'Import Repo';
$lang->repo->import = 'Import';
$lang->repo->importName = 'Name after import';
$lang->repo->importServer = 'Please select a server';
$lang->repo->gitlabList = 'Gitlab Repo';
$lang->repo->submit = 'Soumettre';
$lang->repo->cancel = 'Annuler';
+5
View File
@@ -46,6 +46,11 @@ $lang->repo->httpClone = '使用HTTP克隆';
$lang->repo->cloneUrl = '克隆地址';
$lang->repo->linkTask = '关联任务';
$lang->repo->unlinkedTasks = '未关联任务';
$lang->repo->importAction = '导入代码库';
$lang->repo->import = '导入';
$lang->repo->importName = '导入后的名称';
$lang->repo->importServer = '请选择服务器';
$lang->repo->gitlabList = 'Gitlab代码库';
$lang->repo->submit = '提交';
$lang->repo->cancel = '取消';
+61
View File
@@ -244,6 +244,67 @@ class repoModel extends model
return $repoID;
}
/**
* Batch create repos.
*
* @access public
* @return bool
*/
public function batchCreate()
{
$repos = fixer::input('post')->get();
$dataAry = array();
foreach($repos as $key => $val)
{
if(strpos($key, 'serviceProject') === 0)
{
$i = substr($key, 14);
if(empty($repos->{'product' . $i})) dao::$errors['product' . $i][] = sprintf($this->lang->error->notempty, $this->lang->repo->product);
if(empty($repos->{'name' . $i})) dao::$errors['name' . $i][] = sprintf($this->lang->error->notempty, $this->lang->repo->name);
if(!empty($repos->{'product' . $i}) and !empty($repos->{'name' . $i})) $dataAry[] = array('serviceProject' => $repos->{'serviceProject' . $i}, 'product' => implode(',', $repos->{'product' . $i}), 'name' => $repos->{'name' . $i}, 'projects' => empty($repos->projects[$i]) ? '' : implode(',', $repos->projects[$i]));
}
}
if(dao::isError()) return false;
foreach($dataAry as $data)
{
$repo = new stdclass();
$repo->serviceHost = $repos->serviceHost;
$repo->serviceProject = $data['serviceProject'];
$repo->product = $data['product'];
$repo->name = $data['name'];
$repo->projects = $data['projects'];
$repo->SCM = 'Gitlab';
$repo->encoding = 'utf-8';
$repo->encrypt = 'base64';
$this->dao->insert(TABLE_REPO)->data($repo)
->batchCheck($this->config->repo->create->requiredFields, 'notempty')
->check('serviceHost,serviceProject', 'notempty')
->check('name', 'unique', "`SCM` = '{$repo->SCM}'")
->check('serviceProject', 'unique', "`SCM` = '{$repo->SCM}' and `serviceHost` = '{$repo->serviceHost}'")
->autoCheck()
->exec();
if(dao::isError()) return false;
$repoID = $this->dao->lastInsertID();
if($repo->SCM == 'Gitlab')
{
/* Add webhook. */
$repo = $this->getRepoByID($repoID);
$this->loadModel('gitlab')->addPushWebhook($repo);
}
$actionID = $this->loadModel('action')->create('repo', $repoID, 'created');
}
return true;
}
/**
* Update a repo.
*
+65
View File
@@ -0,0 +1,65 @@
<?php
/**
* The import view file of repo module of ZenTaoPMS.
*
* @copyright Copyright 2009-2017 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.cnezsoft.com)
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
* @author Gang Zeng <zenggang@cnezsoft.com>
* @package repo
* @version $Id$
* @link http://www.zentao.net
*/
?>
<?php include '../../common/view/header.html.php';?>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left">
<?php echo html::a($this->createLink('repo', 'import'), "<span class='text'>{$lang->repo->importAction}</span>", '', "class='btn btn-link btn-active-text'");?>
<div class='input-group w-400px'>
<span class='input-group-addon'><?php echo $lang->repo->importServer?></span>
<?php echo html::select("servers", $gitlabPairs, $gitlab->id, "class='form-control chosen' onchange='selectServer()'");?>
</div>
</div>
</div>
<div id='mainContent' class='main-row'>
<form class='main-table form-ajax' id='ajaxForm' method='post'>
<?php echo html::hidden("serviceHost", $gitlab->id);?>
<table id='repoList' class='table table-form'>
<thead>
<tr>
<th class='w-300px'><?php echo $lang->repo->gitlabList;?></th>
<th class='c-name w-300px required'><?php echo $lang->repo->importName;?></th>
<th class='text-left required'><?php echo $lang->repo->product;?></th>
<th class='text-left'><?php echo $lang->repo->projects;?></th>
<th class='c-actions-3 text-center'></th>
</tr>
</thead>
<tbody>
<?php foreach ($repoList as $key => $repo): ?>
<tr class='text'>
<td class='text-c-name' title='<?php echo $repo->name;?>'>
<?php echo html::hidden("serviceProject{$key}", $repo->id);?>
<?php echo $repo->name_with_namespace;?>
</td>
<td class='text-c-name'>
<?php echo html::input("name{$key}", $repo->name, "class='form-control'");?>
</td>
<td><?php echo html::select("product{$key}[]", $products, '', "class='form-control chosen product' multiple");?></td>
<td id='projectContainer<?php echo $key;?>'><?php echo html::select("projects[{$key}][]", $projects, '', "class='form-control chosen project' multiple");?></td>
<td class='c-actions'><i onclick="delItem(this)" class="icon-close"></i></td>
</tr>
<?php endforeach;?>
</tbody>
<tfoot>
<tr>
<td colspan='5' class='text-center form-actions'>
<?php echo html::submitButton($lang->repo->import); ?>
<?php if(!isonlybody()):?>
<?php if($this->app->tab == 'devops') echo html::a(inlink('maintain', ""), $lang->goback, '', 'class="btn btn-wide"');?>
<?php endif;?>
</td>
</tr>
</tfoot>
</table>
</form>
</div>
<?php include '../../common/view/footer.html.php';?>
+1
View File
@@ -16,6 +16,7 @@
<?php echo html::a($this->createLink('repo', 'maintain'), "<span class='text'>{$lang->repo->maintain}</span>", '', "class='btn btn-link btn-active-text'");?>
</div>
<div class='btn-toolbar pull-right'>
<?php if(common::hasPriv('repo', 'import')) echo html::a(helper::createLink('repo', 'import'), "<i class='icon icon-import'></i> " . $this->lang->repo->importAction, '', "class='btn btn-link'");?>
<?php if(common::hasPriv('repo', 'create')) echo html::a(helper::createLink('repo', 'create'), "<i class='icon icon-plus'></i> " . $this->lang->repo->create, '', "class='btn btn-primary'");?>
</div>
</div>