diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 4047a0a235..af6d5b691e 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -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'; diff --git a/module/repo/control.php b/module/repo/control.php index 32ea458c9f..4c00355215 100644 --- a/module/repo/control.php +++ b/module/repo/control.php @@ -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")); } /** diff --git a/module/repo/css/import.css b/module/repo/css/import.css new file mode 100644 index 0000000000..8a5bae21aa --- /dev/null +++ b/module/repo/css/import.css @@ -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;} diff --git a/module/repo/js/import.js b/module/repo/js/import.js new file mode 100644 index 0000000000..cb3fa9e895 --- /dev/null +++ b/module/repo/js/import.js @@ -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); +} diff --git a/module/repo/lang/de.php b/module/repo/lang/de.php index 73f4cc4a63..90d9276f33 100644 --- a/module/repo/lang/de.php +++ b/module/repo/lang/de.php @@ -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'; diff --git a/module/repo/lang/en.php b/module/repo/lang/en.php index 2c2c3b9d26..7d3a299d1b 100644 --- a/module/repo/lang/en.php +++ b/module/repo/lang/en.php @@ -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'; diff --git a/module/repo/lang/fr.php b/module/repo/lang/fr.php index 3fe607091f..4a1f2a0c11 100644 --- a/module/repo/lang/fr.php +++ b/module/repo/lang/fr.php @@ -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'; diff --git a/module/repo/lang/zh-cn.php b/module/repo/lang/zh-cn.php index 42654aa451..c801417147 100644 --- a/module/repo/lang/zh-cn.php +++ b/module/repo/lang/zh-cn.php @@ -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 = '取消'; diff --git a/module/repo/model.php b/module/repo/model.php index 18071a5972..f810ceb24e 100644 --- a/module/repo/model.php +++ b/module/repo/model.php @@ -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. * diff --git a/module/repo/view/import.html.php b/module/repo/view/import.html.php new file mode 100644 index 0000000000..cc1fe06a60 --- /dev/null +++ b/module/repo/view/import.html.php @@ -0,0 +1,65 @@ + + * @package repo + * @version $Id$ + * @link http://www.zentao.net + */ +?> + + +
+
+ id);?> + + + + + + + + + + + + $repo): ?> + + + + + + + + + + + + + + +
repo->gitlabList;?>repo->importName;?>repo->product;?>repo->projects;?>
+ id);?> + name_with_namespace;?> + + name, "class='form-control'");?> +
+ repo->import); ?> + + app->tab == 'devops') echo html::a(inlink('maintain', ""), $lang->goback, '', 'class="btn btn-wide"');?> + +
+
+
+ diff --git a/module/repo/view/maintain.html.php b/module/repo/view/maintain.html.php index 0351fe1171..907c05fdcd 100644 --- a/module/repo/view/maintain.html.php +++ b/module/repo/view/maintain.html.php @@ -16,6 +16,7 @@ createLink('repo', 'maintain'), "{$lang->repo->maintain}", '', "class='btn btn-link btn-active-text'");?>
+ " . $this->lang->repo->importAction, '', "class='btn btn-link'");?> " . $this->lang->repo->create, '', "class='btn btn-primary'");?>