diff options
Diffstat (limited to 'app/controllers/import/bitbucket_server_controller.rb')
-rw-r--r-- | app/controllers/import/bitbucket_server_controller.rb | 77 |
1 files changed, 66 insertions, 11 deletions
diff --git a/app/controllers/import/bitbucket_server_controller.rb b/app/controllers/import/bitbucket_server_controller.rb index 5fb7b5dccc5..9aa8110257d 100644 --- a/app/controllers/import/bitbucket_server_controller.rb +++ b/app/controllers/import/bitbucket_server_controller.rb @@ -1,12 +1,16 @@ # frozen_string_literal: true class Import::BitbucketServerController < Import::BaseController + extend ::Gitlab::Utils::Override + include ActionView::Helpers::SanitizeHelper before_action :verify_bitbucket_server_import_enabled before_action :bitbucket_auth, except: [:new, :configure] before_action :validate_import_params, only: [:create] + rescue_from BitbucketServer::Connection::ConnectionError, with: :bitbucket_connection_error + # As a basic sanity check to prevent URL injection, restrict project # repository input and repository slugs to allowed characters. For Bitbucket: # @@ -24,7 +28,7 @@ class Import::BitbucketServerController < Import::BaseController end def create - repo = bitbucket_client.repo(@project_key, @repo_slug) + repo = client.repo(@project_key, @repo_slug) unless repo return render json: { errors: _("Project %{project_repo} could not be found") % { project_repo: "#{@project_key}/#{@repo_slug}" } }, status: :unprocessable_entity @@ -38,15 +42,13 @@ class Import::BitbucketServerController < Import::BaseController project = Gitlab::BitbucketServerImport::ProjectCreator.new(@project_key, @repo_slug, repo, project_name, target_namespace, current_user, credentials).execute if project.persisted? - render json: ProjectSerializer.new.represent(project) + render json: ProjectSerializer.new.represent(project, serializer: :import) else render json: { errors: project_save_error(project) }, status: :unprocessable_entity end else render json: { errors: _('This namespace has already been taken! Please choose another one.') }, status: :unprocessable_entity end - rescue BitbucketServer::Connection::ConnectionError => error - render json: { errors: _("Unable to connect to server: %{error}") % { error: error } }, status: :unprocessable_entity end def configure @@ -59,7 +61,9 @@ class Import::BitbucketServerController < Import::BaseController # rubocop: disable CodeReuse/ActiveRecord def status - @collection = bitbucket_client.repos(page_offset: page_offset, limit: limit_per_page, filter: sanitized_filter_param) + return super if Feature.enabled?(:new_import_ui) + + @collection = client.repos(page_offset: page_offset, limit: limit_per_page, filter: sanitized_filter_param) @repos, @incompatible_repos = @collection.partition { |repo| repo.valid? } # Use the import URL to filter beyond what BaseService#find_already_added_projects @@ -67,10 +71,6 @@ class Import::BitbucketServerController < Import::BaseController already_added_projects_names = @already_added_projects.pluck(:import_source) @repos.reject! { |repo| already_added_projects_names.include?(repo.browse_url) } - rescue BitbucketServer::Connection::ConnectionError => error - flash[:alert] = _("Unable to connect to server: %{error}") % { error: error } - clear_session_data - redirect_to new_import_bitbucket_server_path end # rubocop: enable CodeReuse/ActiveRecord @@ -78,6 +78,38 @@ class Import::BitbucketServerController < Import::BaseController render json: find_jobs('bitbucket_server') end + def realtime_changes + super + end + + protected + + # rubocop: disable CodeReuse/ActiveRecord + override :importable_repos + def importable_repos + # Use the import URL to filter beyond what BaseService#find_already_added_projects + already_added_projects = filter_added_projects('bitbucket_server', bitbucket_repos.map(&:browse_url)) + already_added_projects_names = already_added_projects.map(&:import_source) + + bitbucket_repos.reject { |repo| already_added_projects_names.include?(repo.browse_url) || !repo.valid? } + end + # rubocop: enable CodeReuse/ActiveRecord + + override :incompatible_repos + def incompatible_repos + bitbucket_repos.reject { |repo| repo.valid? } + end + + override :provider_name + def provider_name + :bitbucket_server + end + + override :provider_url + def provider_url + session[bitbucket_server_url_key] + end + private # rubocop: disable CodeReuse/ActiveRecord @@ -86,8 +118,12 @@ class Import::BitbucketServerController < Import::BaseController end # rubocop: enable CodeReuse/ActiveRecord - def bitbucket_client - @bitbucket_client ||= BitbucketServer::Client.new(credentials) + def client + @client ||= BitbucketServer::Client.new(credentials) + end + + def bitbucket_repos + @bitbucket_repos ||= client.repos(page_offset: page_offset, limit: limit_per_page, filter: sanitized_filter_param).to_a end def validate_import_params @@ -153,4 +189,23 @@ class Import::BitbucketServerController < Import::BaseController def sanitized_filter_param sanitize(params[:filter]) end + + def bitbucket_connection_error(error) + flash[:alert] = _("Unable to connect to server: %{error}") % { error: error } + clear_session_data + + respond_to do |format| + format.json do + render json: { + error: { + message: _("Unable to connect to server: %{error}") % { error: error }, + redirect: new_import_bitbucket_server_path + } + }, status: :unprocessable_entity + end + format.html do + redirect_to new_import_bitbucket_server_path + end + end + end end |