From b9d0de87db4a5a9d6a085b739e2367925175d169 Mon Sep 17 00:00:00 2001 From: tianshujie98 Date: Wed, 14 Apr 2021 11:45:12 +0800 Subject: [PATCH 01/11] * Fix bug #11858. --- module/bug/control.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/module/bug/control.php b/module/bug/control.php index 2042419b62..f973801bea 100644 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -509,7 +509,7 @@ class bug extends control if(empty($moduleOptionMenu)) die(js::locate(helper::createLink('tree', 'browse', "productID=$productID&view=story"))); /* Get products and projects. */ - $products = $this->products; + $products = $this->config->CRProduct ? $this->products : $this->product->getPairs('noclosed'); $projects = array(0 => ''); if($projectID) { @@ -817,6 +817,11 @@ class bug extends control if($bug->type != $type) unset($this->lang->bug->typeList[$type]); } + if($this->app->openApp == 'qa') + { + $this->view->products = $this->config->CRProduct ? $this->products : $this->product->getPairs('noclosed'); + } + /* Set header and position. */ $this->view->title = $this->lang->bug->edit . "BUG #$bug->id $bug->title - " . $this->products[$productID]; $this->view->position[] = html::a($this->createLink('bug', 'browse', "productID=$productID"), $this->products[$productID]); From bffb33fcbcccac6f37c68ccb7a42247b768b79fb Mon Sep 17 00:00:00 2001 From: Guanxiying Date: Wed, 14 Apr 2021 12:00:32 +0800 Subject: [PATCH 02/11] * Add gitlab config. --- module/repo/config.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/module/repo/config.php b/module/repo/config.php index a86e7d8727..ebb573a0fe 100644 --- a/module/repo/config.php +++ b/module/repo/config.php @@ -42,6 +42,10 @@ $config->repo->edit->requiredFields = 'product,SCM,name,path,encoding,client'; $config->repo->svn = new stdclass(); $config->repo->svn->requiredFields = 'account,password'; +$config->repo->gitlab = new stdclass; +$config->repo->gitlab->perPage = 300; +$config->repo->gitlab->apiPath = "%s/api/v4/projects/%s/repository/"; + $config->repo->rules['module']['task'] = 'Task'; $config->repo->rules['module']['bug'] = 'Bug'; $config->repo->rules['module']['story'] = 'Story'; From 291702e3f50ca5216dcaa30671528dd6d1549e40 Mon Sep 17 00:00:00 2001 From: Guanxiying Date: Wed, 14 Apr 2021 12:01:10 +0800 Subject: [PATCH 03/11] * Add gitlab type to repo type list. --- module/repo/js/create.js | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/module/repo/js/create.js b/module/repo/js/create.js index 96fbc55790..0af0d52404 100644 --- a/module/repo/js/create.js +++ b/module/repo/js/create.js @@ -6,16 +6,38 @@ $(function() $form = $(this).closest('form'); $form.css('min-height', $form.height()); }) + + $('#gitlabHost, #gitlabToken').change(function() + { + host = Base64.encode($('#gitlabHost').val()); + token = $('#gitlabToken').val(); + url = createLink('repo', 'ajaxgetgitlabprojects', "host=" + host + '&token=' + token); + if(host == '' || token == '') return false; + + $.get(url, function(response) + { + $('#gitlabProject').html('').append(response); + $('#gitlabProject').chosen().trigger("chosen:updated");; + }); + }); + + $('#gitlabProject').change(function() + { + $option = $(this).find('option:selected'); + $('#name').val($option.data('name')); + }); + }); -function scmChanged(scm) { +function scmChanged(scm) +{ if(scm == 'Git') { $('.account-fields').addClass('hidden'); $('.tips-git').removeClass('hidden'); $('.tips-svn').addClass('hidden'); - } + } else { $('.account-fields').removeClass('hidden'); @@ -23,4 +45,7 @@ function scmChanged(scm) { $('.tips-git').addClass('hidden'); $('.tips-svn').removeClass('hidden'); } + + $('tr.gitlab').toggle(scm == 'Gitlab'); + $('tr.hide-gitlab').toggle(scm != 'Gitlab'); } From 87f49eb3e18c225ebeeba30ff930036662800297 Mon Sep 17 00:00:00 2001 From: Guanxiying Date: Wed, 14 Apr 2021 13:19:33 +0800 Subject: [PATCH 04/11] * Merge gitlab codes. --- lib/scm/gitlab.class.php | 655 +++++++++++++++++++++++++++++++ module/repo/js/edit.js | 29 +- module/repo/lang/en.php | 8 + module/repo/lang/zh-cn.php | 8 + module/repo/model.php | 26 ++ module/repo/view/create.html.php | 21 +- module/repo/view/edit.html.php | 21 +- 7 files changed, 759 insertions(+), 9 deletions(-) create mode 100644 lib/scm/gitlab.class.php diff --git a/lib/scm/gitlab.class.php b/lib/scm/gitlab.class.php new file mode 100644 index 0000000000..cbe2a0cbad --- /dev/null +++ b/lib/scm/gitlab.class.php @@ -0,0 +1,655 @@ +client = $client; + $this->root = rtrim($root, '/') . '/'; + $this->token = $password; + $this->branch = isset($_COOKIE['repoBranch']) ? $_COOKIE['repoBranch'] : ''; + } + + /** + * List files. + * + * @param string $path + * @param string $revision + * @access public + * @return array + */ + public function ls($path, $revision = 'HEAD') + { + if(!scm::checkRevision($revision)) return array(); + $api = "tree"; + + $param = new stdclass(); + $param->path = urlencode(ltrim($path, '/')); + $param->ref = $revision; + $param->recursive = 0; + + $list = $this->fetch($api, $param); + if(empty($list)) return array(); + + $infos = array(); + foreach($list as $file) + { + $info = new stdClass(); + if($file->type == 'blob') + { + $path = $file->path; + $file = $this->files($file->path); + + $info->name = $file->file_name; + $info->kind = 'file'; + $info->account = $file->committer; + $info->date = $file->date; + $info->size = $file->size; + $info->comment = $file->comment; + $info->revision = $file->revision; + } + else + { + $commits = $this->getCommitsByPath($file->path); + if(empty($commits)) continue; + $commit = $commits[0]; + + $info->name = $file->path; + $info->kind = 'dir'; + $info->revision = $commit->id; + $info->account = $commit->committer_name; + $info->date = date('Y-m-d H:i:s', strtotime($commit->committed_date)); + $info->size = 0; + $info->comment = $commit->message; + } + + $infos[] = $info; + unset($info); + } + + /* Sort by kind */ + foreach($infos as $key => $info) $kinds[$key] = $info->kind; + if($infos) array_multisort($kinds, SORT_ASC, $infos); + return $infos; + } + + /** + * Get files info. + * + * @param string $path + * @param string $ref + * @access public + * @return array + */ + public function files($path, $ref = 'master') + { + $path = urlencode($path); + $api = "files/$path"; + $param = new stdclass(); + $param->ref = $ref; + $file = $this->fetch($api, $param); + + $commits = $this->getCommitsByPath($path); + $file->revision = $file->commit_id; + $file->size = $this->formatBytes($file->size); + + if(!empty($commits)) + { + $commit = $commits[0]; + $file->committer = $commit->committer_name; + $file->comment = $commit->message; + $file->date = date('Y-m-d H:i:s', strtotime($commit->committed_date)); + } + + return $file; + } + + /** + * Get tags + * + * @param string $path + * @param string $revision + * @access public + * @return array + */ + public function tags($path, $revision = 'HEAD') + { + $api = "tags"; + $list = $this->fetch($api); + + $tags = array(); + foreach($list as $tag) $tags[] = $tag->name; + + return $tags; + } + + /** + * Get branch + * + * @access public + * @return array + */ + public function branch() + { + $api = "branches"; + $list = $this->fetch($api); + + $branches = array(); + foreach($list as $branch) $branches[$branch->name] = $branch->name; + asort($branches); + + return $branches; + } + + /** + * Get last log. + * + * @param string $path + * @param int $count + * @access public + * @return array + */ + public function getLastLog($path, $count = 10) + { + return $this->log($path); + } + + /** + * Get logs. + * + * @param string $path + * @param string $fromRevision + * @param string $toRevision + * @param int $count + * @access public + * @return array + */ + public function log($path, $fromRevision = 0, $toRevision = 'HEAD', $count = 0) + { + if(!scm::checkRevision($fromRevision)) return array(); + if(!scm::checkRevision($toRevision)) return array(); + + $path = ltrim($path, DIRECTORY_SEPARATOR); + $count = $count == 0 ? '' : "-n $count"; + + $list = $this->getCommitsByPath($path, $fromRevision, $toRevision); + foreach($list as $commit) $commit->diffs = $this->getFilesByCommit($commit->id); + + return $this->parseLog($list); + } + + /** + * Blame file + * + * @param string $path + * @param string $revision + * @access public + * @return array + */ + public function blame($path, $revision) + { + if(!scm::checkRevision($revision)) return array(); + + $path = ltrim($path, DIRECTORY_SEPARATOR); + $path = urlencode($path); + $api = "files/$path/blame"; + $param = new stdclass; + $param->ref = $this->branch; + $results = $this->fetch($api, $param); + + $blames = array(); + $revLine = 0; + $revision = ''; + + $lineNumber = 1; + foreach($results as $blame) + { + $line = array(); + $line['revision'] = $blame->commit->id; + $line['committer'] = $blame->commit->committer_name; + $line['time'] = $blame->commit->committer_name; + $line['line'] = $lineNumber; + $line['lines'] = count($blame->lines); + $line['content'] = array_shift($blame->lines); + + $blames[] = $line; + + $lineNumber ++; + + foreach($blame->lines as $line) + { + $blames[] = array('line' => $lineNumber, 'content' => $line); + $lineNumber ++; + } + } + + return $blames; + } + + /** + * Diff file. + * + * @param string $path + * @param string $fromRevision + * @param string $toRevision + * @access public + * @return array + */ + public function diff($path, $fromRevision, $toRevision) + { + if(!scm::checkRevision($fromRevision)) return array(); + if(!scm::checkRevision($toRevision)) return array(); + + $api = "compare"; + $params = array('from' => $fromRevision, 'to' => $toRevision, 'straight' => 1); + $results = $this->fetch($api, $params); + foreach($results->diffs as $key => $diff) + { + if($path != '' and strpos($diff->new_path, $path) === false) unset($results->diffs[$key]); + } + return $results->diffs; + } + + /** + * Cat file. + * + * @param string $entry + * @param string $revision + * @access public + * @return string + */ + public function cat($entry, $revision = 'HEAD') + { + if(!scm::checkRevision($revision)) return false; + $file = $this->files($entry, $revision); + return base64_decode($file->content); + } + + /** + * Get info. + * + * @param string $entry + * @param string $revision + * @access public + * @return object + */ + public function info($entry, $revision = 'HEAD') + { + if(!scm::checkRevision($revision)) return false; + + $info = new stdclass(); + $info->kind = 'dir'; + $info->path = $entry; + $info->root = ''; + + if($entry) + { + $parent = dirname($entry); + if($parent == '.') $parent = '/'; + if($parent == '') $parent = '/'; + $list = $this->tree($parent, 0); + + foreach($list as $node) if($node->path == $entry) $file = $node; + + $commits = $this->getCommitsByPath($entry); + + if(!empty($commits)) $file->revision = zget($commits[0], 'id', ''); + $info->kind = $file->type == 'tree' ? 'dir' : 'file'; + } + + return $info; + } + + /** + * Exec git cmd. + * + * @param string $cmd + * @access public + * @todo Exec commads by gitlab api. + * @return array + */ + public function exec($cmd) + { + chdir($this->root); + return execCmd(escapeCmd("$this->client $cmd"), 'array'); + } + + /** + * Parse diff. + * + * @param array $lines + * @access public + * @return array + */ + public function parseDiff($results) + { + if(empty($results)) return array(); + foreach($results as $file) + { + $diffFile = new stdclass(); + $diffFile->fileName = $file->new_path; + + $diff = new stdclass; + $diff->fileName = $file->new_path; + + preg_match('/^@@ -(\\d+)(,(\\d+))?\\s+\\+(\\d+)(,(\\d+))?\\s+@@/A', $file->diff, $matches); + if(empty($matches)) continue; + + $diff->oldStartLine = $matches[1]; + $diff->newStartLine = $matches[4]; + + $oldCurrentLine = $diff->oldStartLine; + $newCurrentLine = $diff->newStartLine; + if($file->new_file) + { + $oldCurrentLine = $diff->newStartLine; + $newCurrentLine = $diff->oldStartLine; + } + + $lines = explode("\n", $file->diff); + $newLines = array(); + foreach($lines as $line) + { + if(strpos($line, '@@') === 0) continue; + if(strpos($line, '\ No newline at end of file') === 0) continue; + $sign = empty($line) ? '' : $line[0]; + if($sign == '-' and $file->new_file) $sign = '+'; + $type = $sign != '-' ? $sign == '+' ? 'new' : 'all' : 'old'; + + if($sign == '+' or $sign == '-') + { + $line = substr_replace($line, ' ', 1, 0); + if($file->new_file) $line = preg_replace('/^\-/', '+', $line); + } + + $newLine = new stdclass(); + $newLine->type = $type; + $newLine->oldlc = $type != 'new' ? $oldCurrentLine : ''; + $newLine->newlc = $type != 'old' ? $newCurrentLine : ''; + $newLine->line = htmlspecialchars($line); + + if($type != 'new') $oldCurrentLine++; + if($type != 'old') $newCurrentLine++; + + $newLines[] = $newLine; + } + $diffFile->contents[] = $diff; + $diff->lines = $newLines; + $diffs[] = $diffFile; + } + return $diffs; + } + + /** + * Get commit count. + * + * @param int $commits + * @param string $lastVersion + * @access public + * @return int + */ + public function getCommitCount($commits = 0, $lastVersion = '') + { + if(!scm::checkRevision($lastVersion)) return false; + + chdir($this->root); + $revision = $this->branch ? $this->branch : 'HEAD'; + return execCmd(escapeCmd("$this->client rev-list --count $revision -- ./"), 'string'); + } + + /** + * Get first revision. + * + * @access public + * @return string + */ + public function getFirstRevision() + { + chdir($this->root); + $list = execCmd(escapeCmd("$this->client rev-list --reverse HEAD -- ./"), 'array'); + return $list[0]; + } + + /** + * Get latest revision + * + * @access public + * @return string + */ + public function getLatestRevision() + { + chdir($this->root); + $revision = $this->branch ? $this->branch : 'HEAD'; + $list = execCmd(escapeCmd("$this->client rev-list -1 $revision -- ./"), 'array'); + return $list[0]; + } + + /** + * Get commits. + * + * @param string $version + * @param int $count + * @param string $branch + * @access public + * @return array + */ + public function getCommits($version = '', $count = 0, $branch = '') + { + if(!scm::checkRevision($version)) return array(); + $api = "commits"; + + $count = 500; + $params = array(); + $params['ref_name'] = $branch; + $params['per_page'] = $count; + $params['all'] = 1; + + if($version) + { + $lastCommit = $this->getSingleCommit($version); + $params['until'] = $lastCommit->committed_date; + } + + $list = $this->fetch($api, $params); + + $commits = array(); + foreach($list as $commit) + { + $log = new stdclass; + $log->committer = $commit->committer_name; + $log->revision = $commit->id; + $log->comment = $commit->message; + $log->time = date('Y-m-d H:i:s', strtotime($commit->created_at)); + + $commits[$commit->id] = $log; + $files[$commit->id] = $this->getFilesByCommit($log->revision); + } + + return array('commits' => $commits, 'files' => $files); + } + + /** + * getCommit + * + * @param int $sha + * @access public + * @return void + */ + public function getSingleCommit($sha) + { + if(!scm::checkRevision($sha)) return null; + $api = "commits/$sha"; + return $this->fetch($api); + } + + /** + * Get commits by path. + * + * @param string $path + * @access public + * @return array + */ + public function getCommitsByPath($path, $fromRevision = '', $toRevision = '') + { + $path = ltrim($path, DIRECTORY_SEPARATOR); + $api = "commits"; + + $param = new stdclass(); + $param->path = urldecode($path); + $param->ref_name = $this->branch; + + if($fromRevision) $fromRevision = $this->getSingleCommit($fromRevision); + if($toRevision) $toRevision = $this->getSingleCommit($toRevision); + + if(!$fromRevision) $since = ''; + if(!$toRevision) $until = ''; + if($fromRevision and $toRevision) + { + $since = min($fromRevision->committed_date, $toRevision->committed_date); + $until = max($fromRevision->committed_date, $toRevision->committed_date); + } + + $param->since = $since; + $param->until = $until; + + return $this->fetch($api, $param); + } + + /** + * Get files by commit. + * + * @param string $commit + * @access public + * @return void + */ + public function getFilesByCommit($revision) + { + if(!scm::checkRevision($revision)) return array(); + $api = "commits/{$revision}/diff"; + $params = new stdclass; + $params->page = 1; + $params->per_page = 200; + + $allResults = array(); + while($results = $this->fetch($api, $params)) + { + $params->page ++; + $allResults = $allResults + $results; + } + + $files = array(); + foreach($allResults as $row) + { + $file = new stdclass(); + $file->revision = $revision; + $file->path = '/' . $row->new_path; + $file->type = 'file'; + + $file->action = 'M'; + if($row->new_file) $file->action = 'A'; + if($row->renamed_file) $file->action = 'R'; + if($row->deleted_file) $file->action = 'D'; + $files[] = $file; + } + + return $files; + } + + /** + * Repository/tree api. + * + * @param string $path + * @param bool $recursive + * @access public + * @return void + */ + public function tree($path, $recursive = 1) + { + $api = "tree"; + + $params = array(); + $params['path'] = ltrim($path, '/'); + $params['ref'] = $this->branch; + $params['recursive'] = (int) $recursive; + return $this->fetch($api, $params); + } + + /** + * Fetch data from gitlab api. + * + * @param string $api + * @access public + * @return void + */ + public function fetch($api, $params = array()) + { + $params = (array) $params; + $params['private_token'] = $this->token; + + $api = ltrim($api, '/'); + $api = $this->root . $api . '?' . http_build_query($params); + + $response = file_get_contents($api); + return json_decode($response); + } + + /** + * Format bytes shown. + * + * @param int $size + * @static + * @access public + * @return string + */ + public static function formatBytes($size) + { + if($size < 1024) return $size . 'Bytes'; + if(round($size / (1024 * 1024), 2) > 1) return round($size / (1024 * 1024), 2) . 'G'; + if(round($size / 1024, 2) > 1) return round($size / 1024, 2) . 'M'; + return round($size, 2) . 'KB'; + } + + /** + * Parse log. + * + * @param array $logs + * @access public + * @return array + */ + public function parseLog($logs) + { + $parsedLogs = array(); + $i = 0; + foreach($logs as $commit) + { + $parsedLog = new stdclass(); + $parsedLog->revision = $commit->id; + $parsedLog->committer = $commit->committer_name; + $parsedLog->time = date('Y-m-d H:i:s', strtotime($commit->committed_date)); + $parsedLog->comment = $commit->message; + $parsedLog->change = array(); + foreach($commit->diffs as $diff) + { + $parsedLog->change[$diff->path] = array(); + $parsedLog->change[$diff->path]['action'] = $diff->action; + $parsedLog->change[$diff->path]['kind'] = $diff->type; + } + $parsedLogs[] = $parsedLog; + } + + return $parsedLogs; + } +} diff --git a/module/repo/js/edit.js b/module/repo/js/edit.js index 96fbc55790..cc79cbb2a5 100644 --- a/module/repo/js/edit.js +++ b/module/repo/js/edit.js @@ -6,9 +6,33 @@ $(function() $form = $(this).closest('form'); $form.css('min-height', $form.height()); }) + + $('#gitlabHost, #gitlabToken').change(function() + { + host = Base64.encode($('#gitlabHost').val()); + token = $('#gitlabToken').val(); + url = createLink('repo', 'ajaxgetgitlabprojects', "host=" + host + '&token=' + token); + if(host == '' || token == '') return false; + + $.get(url, function(response) + { + $('#gitlabProject').html('').append(response); + $('#gitlabProject').chosen().trigger("chosen:updated");; + }); + }); + + $('#gitlabProject').change(function() + { + $option = $(this).find('option:selected'); + if(!$option.data('name')) return false; + $('#name').val($option.data('name')); + $(this).chosen().trigger("chosen:updated"); + }); + }); -function scmChanged(scm) { +function scmChanged(scm) +{ if(scm == 'Git') { $('.account-fields').addClass('hidden'); @@ -23,4 +47,7 @@ function scmChanged(scm) { $('.tips-git').addClass('hidden'); $('.tips-svn').removeClass('hidden'); } + + $('tr.gitlab').toggle(scm == 'Gitlab'); + $('tr.hide-gitlab').toggle(scm != 'Gitlab'); } diff --git a/module/repo/lang/en.php b/module/repo/lang/en.php index a724d83b23..eee7437991 100644 --- a/module/repo/lang/en.php +++ b/module/repo/lang/en.php @@ -124,6 +124,14 @@ $lang->repo->encodingList['gbk'] = 'GBK'; $lang->repo->scmList['Git'] = 'Git'; $lang->repo->scmList['Subversion'] = 'SVN'; +$lang->repo->scmList['Gitlab'] = 'Gitlab'; + +$lang->repo->gitlabHost = 'Gitlab Host'; +$lang->repo->gitlabToken = 'Gitlab Token'; +$lang->repo->gitlabProject = 'Projects'; + +$lang->repo->placeholder = new stdclass; +$lang->repo->placeholder->gitlabHost = 'Input url of gitlab'; $lang->repo->notice = new stdclass(); $lang->repo->notice->syncing = 'Synchronizing. Please wait ...'; diff --git a/module/repo/lang/zh-cn.php b/module/repo/lang/zh-cn.php index eba6fe4af5..0eb819a7ce 100644 --- a/module/repo/lang/zh-cn.php +++ b/module/repo/lang/zh-cn.php @@ -124,6 +124,14 @@ $lang->repo->encodingList['gbk'] = 'GBK'; $lang->repo->scmList['Git'] = 'Git'; $lang->repo->scmList['Subversion'] = 'Subversion'; +$lang->repo->scmList['Gitlab'] = 'Gitlab'; + +$lang->repo->gitlabHost = 'Gitlab 地址'; +$lang->repo->gitlabToken = 'Gitlab Token'; +$lang->repo->gitlabProject = '项目'; + +$lang->repo->placeholder = new stdclass; +$lang->repo->placeholder->gitlabHost = '请填写gitlab访问地址'; $lang->repo->notice = new stdclass(); $lang->repo->notice->syncing = '正在同步中, 请稍等...'; diff --git a/module/repo/model.php b/module/repo/model.php index 41ebe4f62d..4079f8bb58 100644 --- a/module/repo/model.php +++ b/module/repo/model.php @@ -235,11 +235,20 @@ class repoModel extends model if(!$this->checkConnection()) return false; $data = fixer::input('post') + ->setIf($this->post->SCM == 'Gitlab', 'password', $this->post->gitlabToken) + ->setIf($this->post->SCM == 'Gitlab', 'client', $this->post->gitlabHost) ->skipSpecial('path,client,account,password') ->setDefault('product', '') ->join('product', ',') ->get(); + $data->path = sprintf($this->config->repo->gitlab->apiPath, $data->gitlabHost, $data->gitlabProject); + + unset($data->gitlabHost); + unset($data->gitlabToken); + unset($data->gitlabProject); + + $data->acl = empty($data->acl) ? '' : json_encode($data->acl); if($data->SCM == 'Subversion') @@ -1754,4 +1763,21 @@ class repoModel extends model return $buildedURL; } + + /** + * Get gitlab projects. + * + * @param string $host + * @param string $token + * @access public + * @return array + */ + public function getGitlabProjects($host, $token) + { + $host = rtrim($host, '/'); + $host .= '/api/v4/projects'; + + $projects = file_get_contents($host . "?private_token=$token"); + return json_decode($projects); + } } diff --git a/module/repo/view/create.html.php b/module/repo/view/create.html.php index b547e7e1fd..6af99a7663 100644 --- a/module/repo/view/create.html.php +++ b/module/repo/view/create.html.php @@ -10,6 +10,7 @@ ?> + @@ -31,12 +32,24 @@ repo->scmList, 'Git', "onchange='scmChanged(this.value)' class='form-control'"); ?> repo->syncTips; ?> + + repo->gitlabHost;?> + repo->placeholder}'");?> + + + repo->gitlabToken;?> + + + + repo->gitlabProject;?> + + repo->name; ?> - + repo->path; ?> @@ -49,7 +62,7 @@ repo->encodingsTips; ?> - + repo->client;?> @@ -57,11 +70,11 @@ repo->example->client->svn;?> - + repo->account;?> - + repo->password;?>
diff --git a/module/repo/view/edit.html.php b/module/repo/view/edit.html.php index 914b0715ca..272daa3d99 100644 --- a/module/repo/view/edit.html.php +++ b/module/repo/view/edit.html.php @@ -12,6 +12,7 @@ ?> +