From a648e950f4a586468b2f8214139c901c3636297f Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 7 Mar 2018 21:26:39 +0000 Subject: Merge branch 'ce-3839-ci-cd-only-github-projects-fe' into 'master' Create CI/CD-only projects from GitHub -- CE backport See merge request gitlab-org/gitlab-ce!17432 # Conflicts: # locale/gitlab.pot --- app/assets/javascripts/importer_status.js | 31 +++++++-- app/controllers/import/github_controller.rb | 18 ++++-- app/helpers/import_helper.rb | 36 +++++++++++ app/views/import/_githubish_status.html.haml | 22 ++++--- app/views/import/github/new.html.haml | 38 ++++------- app/views/import/github/status.html.haml | 6 +- app/views/projects/new.html.haml | 2 +- lib/gitlab/legacy_github_import/project_creator.rb | 9 +-- locale/gitlab.pot | 75 ++++++++++++++++++++++ spec/features/projects/new_project_spec.rb | 4 +- spec/javascripts/importer_status_spec.js | 15 +++-- 11 files changed, 197 insertions(+), 59 deletions(-) diff --git a/app/assets/javascripts/importer_status.js b/app/assets/javascripts/importer_status.js index 35094f8e73b..523bd2adb93 100644 --- a/app/assets/javascripts/importer_status.js +++ b/app/assets/javascripts/importer_status.js @@ -1,11 +1,14 @@ -import { __ } from './locale'; +import _ from 'underscore'; +import { __, sprintf } from './locale'; import axios from './lib/utils/axios_utils'; import flash from './flash'; +import { convertPermissionToBoolean } from './lib/utils/common_utils'; class ImporterStatus { - constructor(jobsUrl, importUrl) { + constructor({ jobsUrl, importUrl, ciCdOnly }) { this.jobsUrl = jobsUrl; this.importUrl = importUrl; + this.ciCdOnly = ciCdOnly; this.initStatusPage(); this.setAutoUpdate(); } @@ -45,6 +48,7 @@ class ImporterStatus { repo_id: id, target_namespace: targetNamespace, new_name: newName, + ci_cd_only: this.ciCdOnly, }) .then(({ data }) => { const job = $(`tr#repo_${id}`); @@ -54,7 +58,13 @@ class ImporterStatus { $('table.import-jobs tbody').prepend(job); job.addClass('active'); - job.find('.import-actions').html(' started'); + const connectingVerb = this.ciCdOnly ? __('connecting') : __('importing'); + job.find('.import-actions').html(sprintf( + _.escape(__('%{loadingIcon} Started')), { + loadingIcon: ``, + }, + false, + )); }) .catch(() => flash(__('An error occurred while importing project'))); } @@ -71,13 +81,16 @@ class ImporterStatus { switch (job.import_status) { case 'finished': jobItem.removeClass('active').addClass('success'); - statusField.html(' done'); + statusField.html(` ${__('Done')}`); break; case 'scheduled': - statusField.html(`${spinner} scheduled`); + statusField.html(`${spinner} ${__('Scheduled')}`); break; case 'started': - statusField.html(`${spinner} started`); + statusField.html(`${spinner} ${__('Started')}`); + break; + case 'failed': + statusField.html(__('Failed')); break; default: statusField.html(job.import_status); @@ -98,7 +111,11 @@ function initImporterStatus() { if (importerStatus) { const data = importerStatus.dataset; - return new ImporterStatus(data.jobsImportPath, data.importPath); + return new ImporterStatus({ + jobsUrl: data.jobsImportPath, + importUrl: data.importPath, + ciCdOnly: convertPermissionToBoolean(data.ciCdOnly), + }); } } diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb index 69fb8121ded..eb7d5fca367 100644 --- a/app/controllers/import/github_controller.rb +++ b/app/controllers/import/github_controller.rb @@ -42,7 +42,9 @@ class Import::GithubController < Import::BaseController target_namespace = find_or_create_namespace(namespace_path, current_user.namespace_path) if can?(current_user, :create_projects, target_namespace) - project = Gitlab::LegacyGithubImport::ProjectCreator.new(repo, project_name, target_namespace, current_user, access_params, type: provider).execute + project = Gitlab::LegacyGithubImport::ProjectCreator + .new(repo, project_name, target_namespace, current_user, access_params, type: provider) + .execute(extra_project_attrs) if project.persisted? render json: ProjectSerializer.new.represent(project) @@ -73,15 +75,15 @@ class Import::GithubController < Import::BaseController end def new_import_url - public_send("new_import_#{provider}_url") # rubocop:disable GitlabSecurity/PublicSend + public_send("new_import_#{provider}_url", extra_import_params) # rubocop:disable GitlabSecurity/PublicSend end def status_import_url - public_send("status_import_#{provider}_url") # rubocop:disable GitlabSecurity/PublicSend + public_send("status_import_#{provider}_url", extra_import_params) # rubocop:disable GitlabSecurity/PublicSend end def callback_import_url - public_send("callback_import_#{provider}_url") # rubocop:disable GitlabSecurity/PublicSend + public_send("callback_import_#{provider}_url", extra_import_params) # rubocop:disable GitlabSecurity/PublicSend end def provider_unauthorized @@ -116,4 +118,12 @@ class Import::GithubController < Import::BaseController def client_options {} end + + def extra_project_attrs + {} + end + + def extra_import_params + {} + end end diff --git a/app/helpers/import_helper.rb b/app/helpers/import_helper.rb index b484a868f92..9149d79ecb8 100644 --- a/app/helpers/import_helper.rb +++ b/app/helpers/import_helper.rb @@ -36,6 +36,42 @@ module ImportHelper _('Please wait while we import the repository for you. Refresh at will.') end + def import_github_title + _('Import repositories from GitHub') + end + + def import_github_authorize_message + _('To import GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:') + end + + def import_github_personal_access_token_message + personal_access_token_link = link_to _('Personal Access Token'), 'https://github.com/settings/tokens' + + if github_import_configured? + _('Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the repo scope, so we can display a list of your public and private repositories which are available to import.').html_safe % { personal_access_token_link: personal_access_token_link } + else + _('To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the repo scope, so we can display a list of your public and private repositories which are available to import.').html_safe % { personal_access_token_link: personal_access_token_link } + end + end + + def import_configure_github_admin_message + github_integration_link = link_to 'GitHub integration', help_page_path('integration/github') + + if current_user.admin? + _('Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token.').html_safe % { github_integration_link: github_integration_link } + else + _('Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token.').html_safe % { github_integration_link: github_integration_link } + end + end + + def import_githubish_choose_repository_message + _('Choose which repositories you want to import.') + end + + def import_all_githubish_repositories_button_label + _('Import all repositories') + end + private def github_project_url(full_path) diff --git a/app/views/import/_githubish_status.html.haml b/app/views/import/_githubish_status.html.haml index e9a04e6c122..638c8b5a672 100644 --- a/app/views/import/_githubish_status.html.haml +++ b/app/views/import/_githubish_status.html.haml @@ -2,11 +2,11 @@ - provider_title = Gitlab::ImportSources.title(provider) %p.light - Select projects you want to import. + = import_githubish_choose_repository_message %hr %p = button_tag class: "btn btn-import btn-success js-import-all" do - Import all projects + = import_all_githubish_repositories_button_label = icon("spinner spin", class: "loading-icon") .table-responsive @@ -16,9 +16,9 @@ %colgroup.import-jobs-status-col %thead %tr - %th From #{provider_title} - %th To GitLab - %th Status + %th= _('From %{provider_title}') % { provider_title: provider_title } + %th= _('To GitLab') + %th= _('Status') %tbody - @already_added_projects.each do |project| %tr{ id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}" } @@ -30,10 +30,12 @@ - if project.import_status == 'finished' %span %i.fa.fa-check - done + = _('Done') - elsif project.import_status == 'started' %i.fa.fa-spinner.fa-spin - started + = _('Started') + - elsif project.import_status == 'failed' + = _('Failed') - else = project.human_import_status_name @@ -55,7 +57,9 @@ = text_field_tag :path, repo.name, class: "input-mini form-control", tabindex: 2, autofocus: true, required: true %td.import-actions.job-status = button_tag class: "btn btn-import js-add-to-import" do - Import + = has_ci_cd_only_params? ? _('Connect') : _('Import') = icon("spinner spin", class: "loading-icon") -.js-importer-status{ data: { jobs_import_path: "#{url_for([:jobs, :import, provider])}", import_path: "#{url_for([:import, provider])}" } } +.js-importer-status{ data: { jobs_import_path: "#{url_for([:jobs, :import, provider])}", + import_path: "#{url_for([:import, provider])}", + ci_cd_only: "#{has_ci_cd_only_params?}" } } diff --git a/app/views/import/github/new.html.haml b/app/views/import/github/new.html.haml index 9c2da3a3eec..ca47ab5f274 100644 --- a/app/views/import/github/new.html.haml +++ b/app/views/import/github/new.html.haml @@ -1,43 +1,31 @@ -- page_title "GitHub Import" +- title = has_ci_cd_only_params? ? _('Connect repositories from GitHub') : _('GitHub import') +- page_title title +- breadcrumb_title title - header_title "Projects", root_path %h3.page-title - = icon 'github', text: 'Import Projects from GitHub' + = icon 'github', text: import_github_title - if github_import_configured? %p - To import a GitHub project, you first need to authorize GitLab to access - the list of your GitHub repositories: + = import_github_authorize_message - = link_to 'List your GitHub repositories', status_import_github_path, class: 'btn btn-success' + = link_to _('List your GitHub repositories'), status_import_github_path, class: 'btn btn-success' %hr %p - - if github_import_configured? - Alternatively, - - else - To import a GitHub project, - you can use a - = succeed '.' do - = link_to 'Personal Access Token', 'https://github.com/settings/tokens' - When you create your Personal Access Token, - you will need to select the repo scope, so we can display a - list of your public and private repositories which are available for import. + = import_github_personal_access_token_message = form_tag personal_access_token_import_github_path, method: :post, class: 'form-inline' do .form-group - = text_field_tag :personal_access_token, '', class: 'form-control', placeholder: "Personal Access Token", size: 40 - = submit_tag 'List your GitHub repositories', class: 'btn btn-success' + = text_field_tag :personal_access_token, '', class: 'form-control', placeholder: _('Personal Access Token'), size: 40 + = submit_tag _('List your GitHub repositories'), class: 'btn btn-success' + + -# EE-specific start + -# EE-specific end - unless github_import_configured? %hr %p - Note: - - if current_user.admin? - As an administrator you may like to configure - - else - Consider asking your GitLab administrator to configure - = link_to 'GitHub integration', help_page_path("integration/github") - which will allow login via GitHub and allow importing projects without - generating a Personal Access Token. + = import_configure_github_admin_message diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml index 0fe578a0036..b00b972d9c9 100644 --- a/app/views/import/github/status.html.haml +++ b/app/views/import/github/status.html.haml @@ -1,6 +1,8 @@ -- page_title "GitHub Import" +- title = has_ci_cd_only_params? ? _('Connect repositories from GitHub') : _('GitHub import') +- page_title title +- breadcrumb_title title - header_title "Projects", root_path %h3.page-title - = icon 'github', text: 'Import Projects from GitHub' + = icon 'github', text: import_github_title = render 'import/githubish_status', provider: 'github' diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 1d31b58a2cc..8cdb0a6aff4 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -73,7 +73,7 @@ = icon('gitlab', text: 'GitLab export') %div - if github_import_enabled? - = link_to new_import_github_path, class: 'btn import_github' do + = link_to new_import_github_path, class: 'btn js-import-github' do = icon('github', text: 'GitHub') %div - if bitbucket_import_enabled? diff --git a/lib/gitlab/legacy_github_import/project_creator.rb b/lib/gitlab/legacy_github_import/project_creator.rb index cbabe5454ca..3ce245a8050 100644 --- a/lib/gitlab/legacy_github_import/project_creator.rb +++ b/lib/gitlab/legacy_github_import/project_creator.rb @@ -12,9 +12,8 @@ module Gitlab @type = type end - def execute - ::Projects::CreateService.new( - current_user, + def execute(extra_attrs = {}) + attrs = { name: name, path: name, description: repo.description, @@ -24,7 +23,9 @@ module Gitlab import_source: repo.full_name, import_url: import_url, skip_wiki: skip_wiki - ).execute + }.merge!(extra_attrs) + + ::Projects::CreateService.new(current_user, attrs).execute end private diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 8a2176a4d72..9ad7ad98c25 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -59,6 +59,9 @@ msgid_plural "%{count} participants" msgstr[0] "" msgstr[1] "" +msgid "%{loadingIcon} Started" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -210,6 +213,9 @@ msgstr "" msgid "Allows you to add and manage Kubernetes clusters." msgstr "" +msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the repo scope, so we can display a list of your public and private repositories which are available to import." +msgstr "" + msgid "An error occurred previewing the blob" msgstr "" @@ -569,6 +575,9 @@ msgstr "" msgid "Choose file..." msgstr "" +msgid "Choose which repositories you want to import." +msgstr "" + msgid "CiStatusLabel|canceled" msgstr "" @@ -1032,6 +1041,12 @@ msgstr "" msgid "Confidentiality" msgstr "" +msgid "Connect" +msgstr "" + +msgid "Connect repositories from GitHub" +msgstr "" + msgid "Container Registry" msgstr "" @@ -1247,6 +1262,9 @@ msgstr "" msgid "Don't show again" msgstr "" +msgid "Done" +msgstr "" + msgid "Download" msgstr "" @@ -1397,6 +1415,9 @@ msgstr "" msgid "Explore public groups" msgstr "" +msgid "Failed" +msgstr "" + msgid "Failed Jobs" msgstr "" @@ -1462,6 +1483,9 @@ msgstr "" msgid "Format" msgstr "" +msgid "From %{provider_title}" +msgstr "" + msgid "From issue creation until deploy to production" msgstr "" @@ -1489,6 +1513,9 @@ msgstr "" msgid "Git version" msgstr "" +msgid "GitHub import" +msgstr "" + msgid "GitLab Runner section" msgstr "" @@ -1608,9 +1635,18 @@ msgstr "" msgid "If your HTTP repository is not publicly accessible, add authentication information to the URL: https://username:password@gitlab.company.com/group/project.git." msgstr "" +msgid "Import" +msgstr "" + +msgid "Import all repositories" +msgstr "" + msgid "Import in progress" msgstr "" +msgid "Import repositories from GitHub" +msgstr "" + msgid "Import repository" msgstr "" @@ -1760,6 +1796,9 @@ msgstr "" msgid "Leave project" msgstr "" +msgid "List your GitHub repositories" +msgstr "" + msgid "Loading the GitLab IDE..." msgstr "" @@ -1954,6 +1993,12 @@ msgstr "" msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}" msgstr "" +msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token." +msgstr "" + +msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token." +msgstr "" + msgid "Notification events" msgstr "" @@ -2071,6 +2116,12 @@ msgstr "" msgid "Password" msgstr "" +msgid "Pending" +msgstr "" + +msgid "Personal Access Token" +msgstr "" + msgid "Pipeline" msgstr "" @@ -2505,6 +2556,9 @@ msgstr "" msgid "Schedule a new pipeline" msgstr "" +msgid "Scheduled" +msgstr "" + msgid "Schedules" msgstr "" @@ -2753,6 +2807,12 @@ msgstr "" msgid "Start the Runner!" msgstr "" +msgid "Started" +msgstr "" + +msgid "Status" +msgstr "" + msgid "Stopped" msgstr "" @@ -3170,6 +3230,15 @@ msgstr "" msgid "Tip:" msgstr "" +msgid "To GitLab" +msgstr "" + +msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the repo scope, so we can display a list of your public and private repositories which are available to import." +msgstr "" + +msgid "To import GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:" +msgstr "" + msgid "To import an SVN repository, check out %{svn_link}." msgstr "" @@ -3497,6 +3566,9 @@ msgstr "" msgid "confidentiality|You are going to turn on the confidentiality. This means that only team members with at least Reporter access are able to see and leave comments on the issue." msgstr "" +msgid "connecting" +msgstr "" + msgid "day" msgid_plural "days" msgstr[0] "" @@ -3505,6 +3577,9 @@ msgstr[1] "" msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgstr "" +msgid "importing" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb index fd561288091..a5954fec54b 100644 --- a/spec/features/projects/new_project_spec.rb +++ b/spec/features/projects/new_project_spec.rb @@ -173,11 +173,11 @@ feature 'New project' do context 'from GitHub' do before do - first('.import_github').click + first('.js-import-github').click end it 'shows import instructions' do - expect(page).to have_content('Import Projects from GitHub') + expect(page).to have_content('Import repositories from GitHub') expect(current_path).to eq new_import_github_path end end diff --git a/spec/javascripts/importer_status_spec.js b/spec/javascripts/importer_status_spec.js index 71a2cd51f63..0575d02886d 100644 --- a/spec/javascripts/importer_status_spec.js +++ b/spec/javascripts/importer_status_spec.js @@ -29,7 +29,10 @@ describe('Importer Status', () => { `); spyOn(ImporterStatus.prototype, 'initStatusPage').and.callFake(() => {}); spyOn(ImporterStatus.prototype, 'setAutoUpdate').and.callFake(() => {}); - instance = new ImporterStatus('', importUrl); + instance = new ImporterStatus({ + jobsUrl: '', + importUrl, + }); }); it('sets table row to active after post request', (done) => { @@ -65,7 +68,9 @@ describe('Importer Status', () => { spyOn(ImporterStatus.prototype, 'initStatusPage').and.callFake(() => {}); spyOn(ImporterStatus.prototype, 'setAutoUpdate').and.callFake(() => {}); - instance = new ImporterStatus(jobsUrl); + instance = new ImporterStatus({ + jobsUrl, + }); }); function setupMock(importStatus) { @@ -86,17 +91,17 @@ describe('Importer Status', () => { it('sets the job status to done', (done) => { setupMock('finished'); - expectJobStatus(done, 'done'); + expectJobStatus(done, 'Done'); }); it('sets the job status to scheduled', (done) => { setupMock('scheduled'); - expectJobStatus(done, 'scheduled'); + expectJobStatus(done, 'Scheduled'); }); it('sets the job status to started', (done) => { setupMock('started'); - expectJobStatus(done, 'started'); + expectJobStatus(done, 'Started'); }); it('sets the job status to custom status', (done) => { -- cgit v1.2.3