summaryrefslogtreecommitdiff
path: root/app/controllers/import/bitbucket_server_controller.rb
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2018-06-25 13:06:10 -0700
committerStan Hu <stanhu@gmail.com>2018-06-25 13:06:10 -0700
commitebd8e4333a263138abf2113dd315a97352851cbe (patch)
tree4e4975eab778d490c20c9252785761a1d78fae26 /app/controllers/import/bitbucket_server_controller.rb
parent2bac2918b2d6f12d94f739f4b6865b9e9221c642 (diff)
downloadgitlab-ce-ebd8e4333a263138abf2113dd315a97352851cbe.tar.gz
WIP: Add support for Bitbucket Server imports
Diffstat (limited to 'app/controllers/import/bitbucket_server_controller.rb')
-rw-r--r--app/controllers/import/bitbucket_server_controller.rb92
1 files changed, 92 insertions, 0 deletions
diff --git a/app/controllers/import/bitbucket_server_controller.rb b/app/controllers/import/bitbucket_server_controller.rb
new file mode 100644
index 00000000000..3662708c890
--- /dev/null
+++ b/app/controllers/import/bitbucket_server_controller.rb
@@ -0,0 +1,92 @@
+class Import::BitbucketServerController < Import::BaseController
+ before_action :verify_bitbucket_server_import_enabled
+ before_action :bitbucket_auth, except: [:new, :configure]
+
+ def new
+ end
+
+ def create
+ bitbucket_client = BitbucketServer::Client.new(credentials)
+
+ repo_id = params[:repo_id].to_s
+ # XXX must be a better way
+ project_slug, repo_slug = repo_id.split("___")
+ repo = bitbucket_client.repo(project_slug, repo_slug)
+ project_name = params[:new_name].presence || repo.name
+
+ repo_owner = repo.owner
+ repo_owner = current_user.username if repo_owner == bitbucket_client.user.username
+ namespace_path = params[:new_namespace].presence || repo_owner
+ target_namespace = find_or_create_namespace(namespace_path, current_user)
+
+ if current_user.can?(:create_projects, target_namespace)
+ project = Gitlab::BitbucketImport::ProjectCreator.new(repo, project_name, target_namespace, current_user, credentials).execute
+
+ if project.persisted?
+ render json: ProjectSerializer.new.represent(project)
+ 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
+ end
+
+ def configure
+ session[personal_access_token_key] = params[:personal_access_token]
+ session[bitbucket_server_username_key] = params[:bitbucket_username]
+ session[bitbucket_server_url_key] = params[:bitbucket_server_url]
+
+ redirect_to status_import_bitbucket_server_path
+ end
+
+ def status
+ bitbucket_client = BitbucketServer::Client.new(credentials)
+ repos = bitbucket_client.repos
+
+ @repos, @incompatible_repos = repos.partition { |repo| repo.valid? }
+
+ @already_added_projects = find_already_added_projects('bitbucket_server')
+ already_added_projects_names = @already_added_projects.pluck(:import_source)
+
+ @repos.to_a.reject! { |repo| already_added_projects_names.include?(repo.full_name) }
+ end
+
+ def jobs
+ render json: find_jobs('bitbucket_server')
+ end
+
+ private
+
+ def bitbucket_auth
+ unless session[bitbucket_server_url_key].present? &&
+ session[bitbucket_server_username_key].present? &&
+ session[personal_access_token_key].present?
+ redirect_to new_import_bitbucket_server_path
+ end
+ end
+
+ def verify_bitbucket_server_import_enabled
+ render_404 unless bitbucket_server_import_enabled?
+ end
+
+ def bitbucket_server_url_key
+ :bitbucket_server_url
+ end
+
+ def bitbucket_server_username_key
+ :bitbucket_server_username
+ end
+
+ def personal_access_token_key
+ :bitbucket_server_personal_access_token
+ end
+
+ def credentials
+ {
+ base_uri: session[bitbucket_server_url_key],
+ username: session[bitbucket_server_username_key],
+ personal_access_token: session[personal_access_token_key]
+ }
+ end
+end