2018-06-25 20:06:10 +00:00
|
|
|
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
|
|
|
|
|
2018-07-01 12:13:15 +00:00
|
|
|
repo_owner = current_user.username
|
2018-06-25 20:06:10 +00:00
|
|
|
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)
|
2018-06-26 05:40:11 +00:00
|
|
|
project = Gitlab::BitbucketServerImport::ProjectCreator.new(project_slug, repo_slug, repo, project_name, target_namespace, current_user, credentials).execute
|
2018-06-25 20:06:10 +00:00
|
|
|
|
|
|
|
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? &&
|
2018-06-29 05:26:33 +00:00
|
|
|
session[bitbucket_server_username_key].present? &&
|
|
|
|
session[personal_access_token_key].present?
|
2018-06-25 20:06:10 +00:00
|
|
|
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],
|
2018-07-01 12:13:15 +00:00
|
|
|
user: session[bitbucket_server_username_key],
|
2018-06-26 05:40:11 +00:00
|
|
|
password: session[personal_access_token_key]
|
2018-06-25 20:06:10 +00:00
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|