Commit 7a531bb1 authored by James Lopez's avatar James Lopez

Merge branches 'feature/project-export-ui-experimental' and...

Merge branches 'feature/project-export-ui-experimental' and 'feature/project-import' of gitlab.com:gitlab-org/gitlab-ce into feature/project-export-ui-experimental
parents 14dd2d4a a4d242b8
class Import::GitlabProjectController < Import::BaseController
before_action :verify_gitlab_project_import_enabled
before_action :gitlab_project_auth, except: :callback
rescue_from OAuth::Error, with: :gitlab_project_unauthorized
#TODO permissions stuff
def callback
redirect_to status_import_gitlab_project_url
end
def status
@repos = client.projects
@incompatible_repos = client.incompatible_projects
@already_added_projects = current_user.created_projects.where(import_type: "gitlab_project")
already_added_projects_names = @already_added_projects.pluck(:import_source)
@repos.to_a.reject!{ |repo| already_added_projects_names.include? "#{repo["owner"]}/#{repo["slug"]}" }
end
def jobs
jobs = current_user.created_projects.where(import_type: "gitlab_project").to_json(only: [:id, :import_status])
render json: jobs
end
def create
@file = params[:file]
repo_owner = current_user.username
@target_namespace = params[:new_namespace].presence || repo_owner
# namespace = get_or_create_namespace || (render and return)
@project = Gitlab::ImportExport::ImportService.execute(archive_file: file, owner: repo_owner)
end
private
def verify_gitlab_project_import_enabled
render_404 unless gitlab_project_import_enabled?
end
end
...@@ -41,7 +41,7 @@ module Gitlab ...@@ -41,7 +41,7 @@ module Gitlab
current_key = hash.keys.first current_key = hash.keys.first
value = process_current_class(hash, included_classes_hash, value) value = process_current_class(hash, included_classes_hash, value)
if included_classes_hash[current_key] if included_classes_hash[current_key]
add_class(current_key, included_classes_hash, value) add_to_class(current_key, included_classes_hash, value)
else else
add_new_class(current_key, included_classes_hash, value) add_new_class(current_key, included_classes_hash, value)
end end
...@@ -58,13 +58,18 @@ module Gitlab ...@@ -58,13 +58,18 @@ module Gitlab
def add_new_class(current_key, included_classes_hash, value) def add_new_class(current_key, included_classes_hash, value)
only_except_hash = check_only_and_except(value) only_except_hash = check_only_and_except(value)
# TODO: refactor this parsed_hash = { include: value }
value = (value.is_a?(Hash) ? value.merge(only_except_hash) : { value => only_except_hash }) if only_except_hash unless only_except_hash.empty?
new_hash = { include: value } if value.is_a?(Hash)
included_classes_hash[current_key] = new_hash parsed_hash = { include: value.merge(only_except_hash) }
else
parsed_hash = { include: { value => only_except_hash } }
end
end
included_classes_hash[current_key] = parsed_hash
end end
def add_class(current_key, included_classes_hash, value) def add_to_class(current_key, included_classes_hash, value)
only_except_hash = check_only_and_except(value) only_except_hash = check_only_and_except(value)
value = { value => only_except_hash } unless only_except_hash.empty? value = { value => only_except_hash } unless only_except_hash.empty?
old_values = included_classes_hash[current_key][:include] old_values = included_classes_hash[current_key][:include]
......
...@@ -9,7 +9,7 @@ module Gitlab ...@@ -9,7 +9,7 @@ module Gitlab
def initialize(archive_file:, owner:, namespace_id:, project_path:) def initialize(archive_file:, owner:, namespace_id:, project_path:)
@archive_file = archive_file @archive_file = archive_file
@current_user = owner @current_user = owner
@namespace_path = Namespace.find(namespace_id).path @namespace = Namespace.find(namespace_id)
@project_path = project_path @project_path = project_path
end end
...@@ -25,7 +25,7 @@ module Gitlab ...@@ -25,7 +25,7 @@ module Gitlab
end end
def project_tree def project_tree
@project_tree ||= Gitlab::ImportExport::ProjectTreeRestorer.new(path: storage_path, user: @current_user, project_path: @project_path) @project_tree ||= Gitlab::ImportExport::ProjectTreeRestorer.new(path: storage_path, user: @current_user, project_path: @project_path, namespace_id: @namespace.id)
end end
def restore_repo def restore_repo
...@@ -37,7 +37,7 @@ module Gitlab ...@@ -37,7 +37,7 @@ module Gitlab
end end
def path_with_namespace def path_with_namespace
File.join(@namespace_path, @project_path) File.join(@namespace.path, @project_path)
end end
end end
end end
......
...@@ -3,17 +3,19 @@ module Gitlab ...@@ -3,17 +3,19 @@ module Gitlab
module ProjectFactory module ProjectFactory
extend self extend self
def create(project_params:, user:) def create(project_params:, user:, namespace_id:)
project = Project.new(project_params.except('id')) project = Project.new(project_params.except('id'))
project.creator = user project.creator = user
check_namespace(project_params['namespace_id'], project, user) check_namespace(namespace_id, project, user)
end end
def check_namespace(namespace_id, project, user) def check_namespace(namespace_id, project, user)
if namespace_id if namespace_id
# Find matching namespace and check if it allowed # Find matching namespace and check if it allowed
# for current user if namespace_id passed. # for current user if namespace_id passed.
unless allowed_namespace?(user, namespace_id) if allowed_namespace?(user, namespace_id)
project.namespace_id = namespace_id
else
project.namespace_id = nil project.namespace_id = nil
deny_namespace(project) deny_namespace(project)
end end
...@@ -34,7 +36,6 @@ module Gitlab ...@@ -34,7 +36,6 @@ module Gitlab
def deny_namespace(project) def deny_namespace(project)
project.errors.add(:namespace, "is not valid") project.errors.add(:namespace, "is not valid")
end end
end end
end end
end end
...@@ -2,10 +2,11 @@ module Gitlab ...@@ -2,10 +2,11 @@ module Gitlab
module ImportExport module ImportExport
class ProjectTreeRestorer class ProjectTreeRestorer
def initialize(path:, user:, project_path:) def initialize(path:, user:, project_path:, namespace_id:)
@path = File.join(path, 'project.json') @path = File.join(path, 'project.json')
@user = user @user = user
@project_path = project_path @project_path = project_path
@namespace_id = namespace_id
end end
def restore def restore
...@@ -30,9 +31,8 @@ module Gitlab ...@@ -30,9 +31,8 @@ module Gitlab
saved = [] saved = []
relation_list.each do |relation| relation_list.each do |relation|
next if !relation.is_a?(Hash) && tree_hash[relation.to_s].blank? next if !relation.is_a?(Hash) && tree_hash[relation.to_s].blank?
if relation.is_a?(Hash) create_sub_relations(relation, tree_hash) if relation.is_a?(Hash)
create_sub_relations(relation, tree_hash)
end
relation_key = relation.is_a?(Hash) ? relation.keys.first : relation relation_key = relation.is_a?(Hash) ? relation.keys.first : relation
relation_hash = create_relation(relation_key, tree_hash[relation_key.to_s]) relation_hash = create_relation(relation_key, tree_hash[relation_key.to_s])
saved << project.update_attribute(relation_key, relation_hash) saved << project.update_attribute(relation_key, relation_hash)
...@@ -47,7 +47,7 @@ module Gitlab ...@@ -47,7 +47,7 @@ module Gitlab
def create_project def create_project
project_params = @tree_hash.reject { |_key, value| value.is_a?(Array) } project_params = @tree_hash.reject { |_key, value| value.is_a?(Array) }
project = Gitlab::ImportExport::ProjectFactory.create( project = Gitlab::ImportExport::ProjectFactory.create(
project_params: project_params, user: @user) project_params: project_params, user: @user, namespace_id: @namespace_id)
project.path = @project_path project.path = @project_path
project.name = @project_path project.name = @project_path
project.save project.save
......
...@@ -3,7 +3,7 @@ module Gitlab ...@@ -3,7 +3,7 @@ module Gitlab
class RepoRestorer class RepoRestorer
include Gitlab::ImportExport::CommandLineUtil include Gitlab::ImportExport::CommandLineUtil
def initialize(project: , path: ) def initialize(project:, path:)
@project = project @project = project
# TODO remove magic keyword and move it to a shared config # TODO remove magic keyword and move it to a shared config
@path = File.join(path, 'project.bundle') @path = File.join(path, 'project.bundle')
......
...@@ -4,7 +4,8 @@ describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do ...@@ -4,7 +4,8 @@ describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do
describe :restore do describe :restore do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:project_tree_restorer) { Gitlab::ImportExport::ProjectTreeRestorer.new(path: "fixtures/import_export/project.json", user: user) } let(:namespace) { create(:namespace, owner: user) }
let(:project_tree_restorer) { Gitlab::ImportExport::ProjectTreeRestorer.new(path: "lib/gitlab/import_export/", user: user, project_path: 'project', namespace_id: namespace.id) }
context 'JSON' do context 'JSON' do
let(:restored_project_json) do let(:restored_project_json) do
......
...@@ -58,3 +58,7 @@ RSpec::Rails::ViewRendering::EmptyTemplatePathSetDecorator.class_eval do ...@@ -58,3 +58,7 @@ RSpec::Rails::ViewRendering::EmptyTemplatePathSetDecorator.class_eval do
end end
ActiveRecord::Migration.maintain_test_schema! ActiveRecord::Migration.maintain_test_schema!
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, timeout: 1.minute)
end
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment