diff --git a/module/common/lang/menu.php b/module/common/lang/menu.php index bfa0c99279..bdc3bf6a2f 100644 --- a/module/common/lang/menu.php +++ b/module/common/lang/menu.php @@ -317,14 +317,14 @@ $lang->qa->dividerMenu = ',bug,testtask,caselib,'; $lang->devops->menu = new stdclass(); $lang->devops->menu->code = array('link' => "{$lang->repo->common}|repo|browse|repoID=%s", 'alias' => 'diff,view,revision,log,blame,showsynccommit'); $lang->devops->menu->compile = array('link' => "{$lang->devops->compile}|job|browse", 'subModule' => 'compile,job'); -// $lang->devops->menu->gitlab = array('link' => "Gitlab|gitlab|browse", 'alias' => 'create,edit'); +$lang->devops->menu->gitlab = array('link' => "GitLab|gitlab|browse", 'alias' => 'create,edit'); $lang->devops->menu->jenkins = array('link' => "Jenkins|jenkins|browse", 'alias' => 'create,edit'); $lang->devops->menu->maintain = array('link' => "{$lang->devops->repo}|repo|maintain", 'alias' => 'create,edit'); $lang->devops->menu->rules = array('link' => "{$lang->devops->rules}|repo|setrules"); $lang->devops->menuOrder[5] = 'code'; $lang->devops->menuOrder[10] = 'compile'; -// $lang->devops->menuOrder[15] = 'gitlab'; +$lang->devops->menuOrder[15] = 'gitlab'; $lang->devops->menuOrder[20] = 'jenkins'; $lang->devops->menuOrder[25] = 'maintain'; $lang->devops->menuOrder[30] = 'rules'; diff --git a/module/doc/js/objectlibs.js b/module/doc/js/objectlibs.js index db5256d142..78ada9cc4c 100644 --- a/module/doc/js/objectlibs.js +++ b/module/doc/js/objectlibs.js @@ -1,3 +1,8 @@ +$(function() +{ + if($.cookie('isFullScreen') == 1) fullScreen(); +}) + /** * Ajax delete doc. * @@ -45,25 +50,32 @@ function fullScreen() { $('#content .actions').addClass('hidden'); requestMethod.call(element); + $.cookie('isFullScreen', 1); } } +function exitFullScreen() +{ + $('#content .actions').removeClass('hidden'); + $.cookie('isFullScreen', 0); +} + document.addEventListener("fullscreenchange", function (e) { - if(!document.fullscreenElement) $('#content .actions').removeClass('hidden'); + if(!document.fullscreenElement) exitFullScreen(); }) document.addEventListener("webkitfullscreenchange", function (e) { - if(!document.webkitFullscreenElement) $('#content .actions').removeClass('hidden'); + if(!document.webkitFullscreenElement) exitFullScreen(); }) document.addEventListener("mozfullscreenchange", function (e) { - if(!document.mozFullScreenElement) $('#content .actions').removeClass('hidden'); + if(!document.mozFullScreenElement) exitFullScreen(); }) document.addEventListener("msfullscreenChange", function (e) { - if(!document.msfullscreenElement) $('#content .actions').removeClass('hidden'); + if(!document.msfullscreenElement) exitFullScreen(); }) diff --git a/module/gitlabpipeline/model.php b/module/gitlabpipeline/model.php new file mode 100644 index 0000000000..747536a539 --- /dev/null +++ b/module/gitlabpipeline/model.php @@ -0,0 +1,213 @@ + + * @package product + * @version $Id: $ + * @link http://www.zentao.net + */ + +class gitlabpipelineModel extends model +{ + /** + * Get single pipline by api. + * + * @param integer $projectID + * @param integer $pipelineID + * @access public + * @return object + * @docment https://docs.gitlab.com/ee/api/pipelines.html#get-a-single-pipeline + */ + + public function apiGetPiplineByID($projectID, $pipelineID) + { + //Priv 1 + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/{$projectID}/pipelines/{$piplinesID}"); + return json_decode(commonModel::http($url)); + } + + /** + * Get piplines list by api. + * + * @param integer $projectID + * @access public + * @return object + * @docment https://docs.gitlab.com/ee/api/pipelines.html#list-project-pipelines + */ + + public function apiGetPiplines($projectID) + { + //Later + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/{$projectID}/pipelines"); + return json_decode(commonModel::http($url)); + } + + /** + * Get a pipeline’s report by api. + * + * @param integer $projectID + * @param integer $pipelineID + * @access public + * @return object + * @docment https://docs.gitlab.com/ee/api/pipelines.html#get-a-pipelines-test-report + */ + public function apiGetPiplineReport($projectID, $pipelineID) + { + //Later + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/{$projectID}/pipelines/{$pipelineID}/test_report"); + return json_decode(commonModel::http($url)); + } + + /** + * Create a new pipeline by api. + * + * @param integer $projectID + * @param string $reference + * @access public + * @return object + * @docment https://docs.gitlab.com/ee/api/pipelines.html#create-a-new-pipeline + */ + public function apiCreatePipeline($projectID, $reference) + { + //Priv 1 + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/{$projectID}/pipeline"); + return json_decode(commonModel::http($url, $reference)); + } + + /** + * Retry jobs in a pipeline by api. + * + * @param integer $projectID + * @param integer $pipelineID + * @return object + * @docment https://docs.gitlab.com/ee/api/pipelines.html#retry-jobs-in-a-pipeline + */ + public function apiRetryPipeline($projectID, $pipelineID) + { + //Priv 2 + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/{$projectID}/pipelines/{$piplineID}/retry"); + return json_decode(commonModel::http($url)); + } + + /** + * Cancel a pipeline’s jobs by api. + * + * @param integer $projectID + * @param integer $pipelineID + * @return object + * @docment https://docs.gitlab.com/ee/api/pipelines.html#cancel-a-pipelines-jobs + */ + public function apiPipelineCancel($projectID, $piplineID) + { + //Priv 1 + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/{$projectID}/pipelines/{$pipelineID}/cancel"); + return json_decode(commonModel::http($url)); + } + + /** + * Delete a pipeline-·· by api. + * + * @param integer $projectID + * @param integer $pipelineID + * @return object + * @docment https://docs.gitlab.com/ee/api/pipelines.html#delete-a-pipeline + */ + public function apiDeletePipeline($projectID, $piplineID) + { + //Later + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/{$projectID}/pipelines/{$piplineID}"); + return json_decode(commonModel::http($url, null, array(CURLOPT_CUSTOMREQUEST => 'DELETE'))); + } + + /** + * Get all pipeline schedules by api. + * + * @param integer $projectID + * @return object + * @docment https://docs.gitlab.com/ee/api/pipeline_schedules.html#get-all-pipeline-schedules + */ + public function apiGetPiplineSchedules($projectID) + { + //Later + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/{$projectID}/pipeline_schedules"); + return json_decode(commonModel::http($url)); + } + + /** + * Delete a pipeline schedule by api. + * + * @param integer $projectID + * @param integer $pipelineScheduleID + * @return object + * @docment https://docs.gitlab.com/ee/api/pipeline_schedules.html#delete-a-pipeline-schedule + */ + public function apiDeletePiplineSchedules($projectID, $pipelineScheduleID) + { + //Later + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/{$projectID}/pipeline_schedules/{$pipelineScheduleID}/play"); + return json_decode(commonModel::http($url, null, array(CURLOPT_CUSTOMREQUEST => 'DELETE'))); + } + + /** + * Run a scheduled pipeline immediately by api. + * + * @param integer $projectID + * @param integer $pipelineScheduleID + * @return object + * @docment https://docs.gitlab.com/ee/api/pipeline_schedules.html#run-a-scheduled-pipeline-immediately + */ + public function apiRunPiplineSchedule() + { + //Later + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/{$projectID}/jobs/{$jobID}/trace"); + return json_decode(commonModel::http($url)); + } + + /** + * Get a log file by api. + * + * @param integer $projectID + * @param integer $jobID + * @return object + * @docment https://docs.gitlab.com/ee/api/jobs.html#get-a-log-file + */ + public function apiPipelineGetlog($projectID, $jobID) + { + //Priv 2 + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/{$projectID}/jobs/{$jobID}/trace"); + return json_decode(commonModel::http($url)); + } + + /** + * List pipeline jobs by api. + * + * @param integer $projectID + * @param integer $pipelineID + * @return object + * @docment https://docs.gitlab.com/ee/api/jobs.html#list-pipeline-jobs + */ + public function apiGetPipelineJobs($projectID, $pipelineID) + { + //Priv 2 + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/{$projectID}/pipelines/{$pipelineID}/jobs"); + return json_decode(commonModel::http($url)); + } + + /** + * Get a single job by api. + * + * @param integer $projectID + * @param integer $jobID + * @return object + * @docment https://docs.gitlab.com/ee/api/jobs.html#get-a-single-job + */ + public function apiGetSingleJob($projectID, $jobID) + { + //Priv 2 + $url = sprintf($this->loadModel('gitlab')->getApiRoot($gitlabID), "/projects/{$projectID}/jobs/{$jobID}"); + return json_decode(commonModel::http($url)); + } +} diff --git a/module/job/js/create.js b/module/job/js/create.js index 1e4801e4bf..8213ede9f0 100644 --- a/module/job/js/create.js +++ b/module/job/js/create.js @@ -1,6 +1,12 @@ $('#repo').change(function() { var repoID = $(this).val(); + $.getJSON(createLink('job', 'ajaxGetProductByRepo', 'repoID=' + repoID), function(product) + { + console.log(product); + } + ); + var type = 'Git'; if(typeof(repoTypes[repoID]) != 'undefined') type = repoTypes[repoID]; @@ -82,37 +88,15 @@ $('#triggerType').change(function() } }); -$('#gitlabServer').change(function() -{ - var repoID = $('#repo').val(); - $('#gitlabServerTR #pipeline').remove(); - $('#gitlabServerTR #pipeline_chosen').remove(); - $('#gitlabServerTR .input-group').append("
"); - $.getJSON(createLink('gitlab', 'ajaxGetGitlabPipeline', 'repoID=' + repoID), function(tasks) - { - html = "'; - $('#gitlabServerTR .loading').remove(); - $('#gitlabServerTR .input-group').append(html); - - $('#gitlabServerTR #pipeline').chosen({drop_direction: 'auto'}); - }) -}) - $('#jkServer').change(function() { var jenkinsID = $(this).val(); - $('#jenkinsServerTR #JkTask').remove(); - $('#jenkinsServerTR #JkTask_chosen').remove(); + $('#jenkinsServerTR #jkTask').remove(); + $('#jenkinsServerTR #jkTask_chosen').remove(); $('#jenkinsServerTR .input-group').append("
"); $.getJSON(createLink('jenkins', 'ajaxGetJenkinsTasks', 'jenkinsID=' + jenkinsID), function(tasks) { - html = ""; for(taskKey in tasks) { var task = tasks[taskKey]; @@ -122,7 +106,7 @@ $('#jkServer').change(function() $('#jenkinsServerTR .loading').remove(); $('#jenkinsServerTR .input-group').append(html); - $('#jenkinsServerTR #JkTask').chosen({drop_direction: 'auto'}); + $('#jenkinsServerTR #jkTask').chosen({drop_direction: 'auto'}); }) }) diff --git a/module/job/lang/zh-cn.php b/module/job/lang/zh-cn.php index 7c49a0ea49..75caac07ae 100644 --- a/module/job/lang/zh-cn.php +++ b/module/job/lang/zh-cn.php @@ -76,6 +76,6 @@ $lang->job->engineList['gitlab'] = 'GitLab'; $lang->job->engineList['jenkins'] = 'Jenkins'; $lang->job->engineTips = new stdclass; -$lang->job->engineTips->success = '构建引擎将使用GitLab项目内置的流水线'; -$lang->job->engineTips->error = '当前GitLab项目内没有可用的流水线,请先前往GitLab配置'; +$lang->job->engineTips->success = '构建引擎将使用GitLab项目内置的流水线.'; +$lang->job->engineTips->error = '当前GitLab项目内没有可用的流水线,请先前往GitLab配置.'; diff --git a/module/job/model.php b/module/job/model.php index 5ac819f9a0..d4d0a91fc0 100644 --- a/module/job/model.php +++ b/module/job/model.php @@ -119,6 +119,20 @@ class jobModel extends model ->add('createdDate', helper::now()) ->remove('repoType') ->get(); + + if($job->engine == 'jenkins') + { + $job->server = $job->jkServer; + $job->pipeline = $job->jkTask; + unset($job->jkServer); + unset($job->jkTask); + } + + if(strtolower($job->engine) == 'gitlab') + { + var_dump($job);exit; + } + if($job->triggerType == 'schedule') $job->atDay = empty($_POST['atDay']) ? '' : join(',', $this->post->atDay); $job->svnDir = ''; @@ -158,7 +172,6 @@ class jobModel extends model ->batchCheckIF($job->triggerType === 'schedule', "atDay,atTime", 'notempty') ->batchCheckIF($job->triggerType === 'commit', "comment", 'notempty') ->batchCheckIF(($this->post->repoType == 'Subversion' and $job->triggerType == 'tag'), "svnDir", 'notempty') - ->autoCheck() ->exec(); diff --git a/module/job/view/browse.html.php b/module/job/view/browse.html.php index 4e580471c0..380da547a9 100644 --- a/module/job/view/browse.html.php +++ b/module/job/view/browse.html.php @@ -30,6 +30,7 @@ job->name);?> job->repo);?> job->frame);?> + job->engine);?> job->jenkins);?> job->triggerType;?> job->lastStatus);?> @@ -44,6 +45,7 @@ createLink('job', 'view', "jobID={$job->id}", 'html', true), $job->name, '', "class='iframe' data-width='90%'") : $job->name;?> repoName; ?> job->frameList, $job->frame);?> + engine;?> pipeline) . '@' . $job->jenkinsName;?> job->getTriggerConfig($job);?> diff --git a/module/job/view/create.html.php b/module/job/view/create.html.php index 4645621a96..39097bb5ee 100644 --- a/module/job/view/create.html.php +++ b/module/job/view/create.html.php @@ -55,16 +55,16 @@
job->pipeline; ?> - ''), '', "class='form-control chosen'"); ?> + ''), '', "class='form-control chosen'"); ?>
- job->server; ?> + - + job->engineTips->success; ?> diff --git a/module/repo/control.php b/module/repo/control.php index 48b06b0b12..8b99377f61 100644 --- a/module/repo/control.php +++ b/module/repo/control.php @@ -129,11 +129,12 @@ class repo extends control $this->app->loadLang('action'); - $this->view->title = $this->lang->repo->common . $this->lang->colon . $this->lang->repo->create; - $this->view->position[] = $this->lang->repo->create; - $this->view->groups = $this->loadModel('group')->getPairs(); - $this->view->users = $this->loadModel('user')->getPairs('noletter|noempty|nodeleted'); - $this->view->products = $this->loadModel('product')->getProductPairsByProject($objectID); + $this->view->title = $this->lang->repo->common . $this->lang->colon . $this->lang->repo->create; + $this->view->position[] = $this->lang->repo->create; + $this->view->groups = $this->loadModel('group')->getPairs(); + $this->view->users = $this->loadModel('user')->getPairs('noletter|noempty|nodeleted'); + $this->view->products = $this->loadModel('product')->getProductPairsByProject($objectID); + $this->view->gitlabHosts = $this->loadModel('gitlab')->getPairs(); $this->display(); } @@ -168,23 +169,24 @@ class repo extends control if($repo->SCM == 'Gitlab') { + $projects = $this->loadModel('gitlab')->apiGetProjects($repo->gitlab, $repo->password); - $projects = $this->repo->getGitlabProjects($repo->client, $repo->password); $options = array(); - foreach($projects as $project) $options[$project->id] = $project->name . ':' . $project->http_url_to_repo; + foreach($projects as $project) $options[$project->id] = $project->name_with_namespace; $this->view->projects = $options; } - $repo->repoType = $repo->id . '-' . $repo->SCM; - $this->view->repo = $repo; - $this->view->repoID = $repoID; - $this->view->objectID = $objectID; - $this->view->groups = $this->loadModel('group')->getPairs(); - $this->view->users = $this->loadModel('user')->getPairs('noletter|noempty|nodeleted'); - $this->view->products = $objectID ? $this->loadModel('product')->getProductPairsByProject($objectID) : $this->loadModel('product')->getPairs(); + $this->view->title = $this->lang->repo->common . $this->lang->colon . $this->lang->repo->edit; + $repo->repoType = $repo->id . '-' . $repo->SCM; + $this->view->repo = $repo; + $this->view->repoID = $repoID; + $this->view->objectID = $objectID; + $this->view->groups = $this->loadModel('group')->getPairs(); + $this->view->users = $this->loadModel('user')->getPairs('noletter|noempty|nodeleted'); + $this->view->products = $objectID ? $this->loadModel('product')->getProductPairsByProject($objectID) : $this->loadModel('product')->getPairs(); + $this->view->gitlabHosts = $this->loadModel('gitlab')->getPairs(); - $this->view->title = $this->lang->repo->common . $this->lang->colon . $this->lang->repo->edit; $this->view->position[] = html::a(inlink('maintain'), $this->lang->repo->common); $this->view->position[] = $this->lang->repo->edit; @@ -1108,22 +1110,22 @@ class repo extends control /** * Ajax get gitlab projects. * - * @param string $host + * @param string $gitlabID * @param string $token * @access public * @return void */ - public function ajaxGetGitlabProjects($host, $token) + public function ajaxGetGitlabProjects($gitlabID, $projectIdList = '') { - $host = helper::safe64decode($host); - $projects = $this->repo->getgitlabprojects($host, $token); + $projects = $this->loadModel('gitlab')->apiGetProjects($gitlabID); if(!$projects) $this->send(array('message' => array())); - + $projectIdList = $projectIdList ? explode(',', $projectIdList) : null; $options = ""; foreach($projects as $project) { - $options .= ""; + if(!empty($projectIdList) and $project and !in_array($project->id, $projectIdList)) continue; + $options .= ""; } die($options); diff --git a/module/repo/js/create.js b/module/repo/js/create.js index c78d5fd862..b34a474ff8 100644 --- a/module/repo/js/create.js +++ b/module/repo/js/create.js @@ -7,12 +7,11 @@ $(function() $form.css('min-height', $form.height()); }) - $('#gitlabHost, #gitlabToken').change(function() + $('#gitlabHost').change(function() { - host = Base64.encode($('#gitlabHost').val()); - token = $('#gitlabToken').val(); - url = createLink('repo', 'ajaxgetgitlabprojects', "host=" + host + '&token=' + token); - if(host == '' || token == '') return false; + host = $('#gitlabHost').val(); + url = createLink('repo', 'ajaxgetgitlabprojects', "host=" + host); + if(host == '') return false; $.get(url, function(response) { diff --git a/module/repo/js/edit.js b/module/repo/js/edit.js index cc79cbb2a5..74ef12e6f8 100644 --- a/module/repo/js/edit.js +++ b/module/repo/js/edit.js @@ -7,12 +7,11 @@ $(function() $form.css('min-height', $form.height()); }) - $('#gitlabHost, #gitlabToken').change(function() + $('#gitlabHost').change(function() { - host = Base64.encode($('#gitlabHost').val()); - token = $('#gitlabToken').val(); - url = createLink('repo', 'ajaxgetgitlabprojects', "host=" + host + '&token=' + token); - if(host == '' || token == '') return false; + host = $('#gitlabHost').val(); + if(host == '') return false; + url = createLink('repo', 'ajaxgetgitlabprojects', "host=" + host); $.get(url, function(response) { @@ -20,7 +19,7 @@ $(function() $('#gitlabProject').chosen().trigger("chosen:updated");; }); }); - + $('#gitlabProject').change(function() { $option = $(this).find('option:selected'); @@ -28,7 +27,6 @@ $(function() $('#name').val($option.data('name')); $(this).chosen().trigger("chosen:updated"); }); - }); function scmChanged(scm) diff --git a/module/repo/model.php b/module/repo/model.php index 583dcd107d..18ce9a4bfe 100644 --- a/module/repo/model.php +++ b/module/repo/model.php @@ -153,6 +153,8 @@ class repoModel extends model if(!$hasPriv) unset($repos[$i]); } } + + if($repo->SCM == 'Gitlab') $repo = $this->processGitlab($repo); } return $repos; @@ -197,6 +199,7 @@ class repoModel extends model $data = fixer::input('post') ->setIf($this->post->SCM == 'Gitlab', 'password', $this->post->gitlabToken) + ->setIf($this->post->SCM == 'Gitlab', 'path', $this->post->gitlabProject) ->setIf($this->post->SCM == 'Gitlab', 'client', $this->post->gitlabHost) ->setIf($this->post->SCM == 'Gitlab', 'extra', $this->post->gitlabProject) ->skipSpecial('path,client,account,password') @@ -204,7 +207,7 @@ class repoModel extends model ->join('product', ',') ->get(); - if($this->post->SCM == 'Gitlab') $data->path = sprintf($this->config->repo->gitlab->apiPath, $data->gitlabHost, $this->post->gitlabProject); + if($this->post->SCM == 'Gitlab') $data->path = $this->post->gitlabProject; $data->acl = empty($data->acl) ? '' : json_encode($data->acl); @@ -243,6 +246,7 @@ class repoModel extends model $data = fixer::input('post') ->setIf($this->post->SCM == 'Gitlab', 'password', $this->post->gitlabToken) + ->setIf($this->post->SCM == 'Gitlab', 'path', $this->post->gitlabProject) ->setIf($this->post->SCM == 'Gitlab', 'client', $this->post->gitlabHost) ->setIf($this->post->SCM == 'Gitlab', 'extra', $this->post->gitlabProject) ->setDefault('client', 'svn') @@ -252,7 +256,6 @@ class repoModel extends model ->join('product', ',') ->get(); - if($this->post->SCM == 'Gitlab') $data->path = sprintf($this->config->repo->gitlab->apiPath, $data->gitlabHost, $this->post->gitlabProject); if($data->path != $repo->path) $data->synced = 0; $data->acl = empty($data->acl) ? '' : json_encode($data->acl); @@ -622,7 +625,6 @@ class repoModel extends model { $commitID = $this->dao->lastInsertID(); if($branch) $this->dao->replace(TABLE_REPOBRANCH)->set('repo')->eq($repoID)->set('revision')->eq($commitID)->set('branch')->eq($branch)->exec(); - $file = array(); foreach($logs['files'][$i] as $file) { $parentPath = dirname($file->path); diff --git a/module/repo/view/create.html.php b/module/repo/view/create.html.php index 446da06b4e..bce732117e 100644 --- a/module/repo/view/create.html.php +++ b/module/repo/view/create.html.php @@ -34,15 +34,11 @@ repo->gitlabHost;?> - repo->placeholder->gitlabHost}'");?> - - - repo->gitlabToken;?> - + repo->placeholder->gitlabHost}'");?> repo->gitlabProject;?> - + repo->name; ?> diff --git a/module/repo/view/edit.html.php b/module/repo/view/edit.html.php index 15f6d76846..ebfda168e9 100644 --- a/module/repo/view/edit.html.php +++ b/module/repo/view/edit.html.php @@ -34,21 +34,15 @@ repo->type; ?> repo->scmList, $repo->SCM, "onchange='scmChanged(this.value)' class='form-control'"); ?> - - repo->syncTips; ?> - + repo->syncTips; ?> repo->gitlabHost;?> - client, "class='form-control' placeholder='{$lang->repo->placeholder->gitlabHost}'");?> - - - repo->gitlabToken;?> - password, "class='form-control'");?> + gitlab, "class='form-control' placeholder='{$lang->repo->placeholder->gitlabHost}'");?> repo->gitlabProject;?> - extra, "class='form-control chosen'");?> + project, "class='form-control chosen'");?> repo->name; ?> @@ -59,8 +53,8 @@ repo->path; ?> path, "class='form-control'"); ?> - repo->example->path->git;?> - repo->example->path->svn;?> + repo->example->path->git;?> + repo->example->path->svn;?> @@ -72,8 +66,8 @@ repo->client;?> client, "class='form-control'")?> - repo->example->client->git;?> - repo->example->client->svn;?> + repo->example->client->git;?> + repo->example->client->svn;?> @@ -112,7 +106,7 @@ - + goback, '', 'class="btn btn-wide"'); ?>