diff --git a/app/controllers/import/gitlab_projects_controller.rb b/app/controllers/import/gitlab_projects_controller.rb index 0e94915765c..36be79a39c4 100644 --- a/app/controllers/import/gitlab_projects_controller.rb +++ b/app/controllers/import/gitlab_projects_controller.rb @@ -7,7 +7,8 @@ class Import::GitlabProjectsController < Import::BaseController #TODO permissions stuff def new - + @namespace_id = project_params[:namespace_id] + @path = project_params[:path] end def status @@ -27,14 +28,14 @@ class Import::GitlabProjectsController < Import::BaseController def create file = params[:file] - # @project_name = repo_owner = current_user.username @target_namespace = params[:new_namespace].presence || repo_owner - namespace = get_or_create_namespace || (render and return) - - @project = Project.create_from_import_job(current_user.id, File.expand_path(file.path)) + @project = Project.create_from_import_job(current_user_id: current_user.id, + tmp_file: File.expand_path(file.path), + namespace_id: @namespace_id, + project_path: @path) end private @@ -42,4 +43,10 @@ class Import::GitlabProjectsController < Import::BaseController def verify_gitlab_project_import_enabled render_404 unless gitlab_project_import_enabled? end + + def project_params + params.require(:project).permit( + :path, :namespace_id, + ) + end end diff --git a/app/models/project.rb b/app/models/project.rb index 18e647045cd..70921e02759 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -360,13 +360,13 @@ class Project < ActiveRecord::Base where(id: user.authorized_projects.select(:id).reorder(nil)) end - def create_from_import_job(current_user_id:, tmp_file:) - job_id = ProjectImportWorker.perform_async(current_user_id, tmp_file) + def create_from_import_job(current_user_id:, tmp_file:, namespace_id:, project_path:) + job_id = ProjectImportWorker.perform_async(current_user_id, tmp_file, namespace_id, project_path) if job_id - Rails.logger.info "Import job started for #{path_with_namespace} with job ID #{job_id}" + Rails.logger.info "Import job started for export #{tmp_file} with job ID #{job_id}" else - Rails.logger.error "Import job failed to start for #{path_with_namespace}" + Rails.logger.error "Import job failed to start for #{tmp_file}" end end end diff --git a/app/views/import/gitlab_projects/new.html.haml b/app/views/import/gitlab_projects/new.html.haml index 9e798b8a63f..323b7810c59 100644 --- a/app/views/import/gitlab_projects/new.html.haml +++ b/app/views/import/gitlab_projects/new.html.haml @@ -5,7 +5,7 @@ Import projects from FogBugz %hr -= form_tag import_gitlab_project_path, class: 'form-horizontal' do += form_tag import_gitlab_project_path, class: 'form-horizontal', multipart: true do %p To get started you add your project export file below. .form-group diff --git a/app/workers/project_import_worker.rb b/app/workers/project_import_worker.rb index 6dd514b56a0..0e8b9552442 100644 --- a/app/workers/project_import_worker.rb +++ b/app/workers/project_import_worker.rb @@ -2,12 +2,15 @@ class ProjectImportWorker include Sidekiq::Worker include Gitlab::ShellAdapter - sidekiq_options queue: :gitlab_shell + sidekiq_options queue: :gitlab_shell, retry: false - def perform(current_user_id, tmp_file) + def perform(current_user_id, tmp_file, namespace_id, path) current_user = User.find(current_user_id) - project = Gitlab::ImportExport::ImportService.execute(archive_file: tmp_file, owner: current_user) + project = Gitlab::ImportExport::ImportService.execute(archive_file: tmp_file, + owner: current_user, + namespace_id: namespace_id, + project_path: path) # TODO: Move this to import service # if result[:status] == :error diff --git a/lib/gitlab/import_export/import_service.rb b/lib/gitlab/import_export/import_service.rb index 978a581f57a..5152d6ac182 100644 --- a/lib/gitlab/import_export/import_service.rb +++ b/lib/gitlab/import_export/import_service.rb @@ -6,15 +6,17 @@ module Gitlab new(args).execute end - def initialize(options = {}) - @archive_file = options[:archive_file] - @current_user = options[:owner] + def initialize(archive_file:, owner:, namespace_id:, project_path:) + @archive_file = archive_file + @current_user = owner + @namespace_path = Namespace.find(namespace_id).path + @project_path = project_path end def execute Gitlab::ImportExport::Importer.import(archive_file: @archive_file, storage_path: storage_path) restore_project_tree - restore_repo(project_tree.project) + restore_repo end private @@ -27,12 +29,16 @@ module Gitlab @project_tree ||= Gitlab::ImportExport::ProjectTreeRestorer.new(path: storage_path, user: @current_user) end - def restore_repo(project) - Gitlab::ImportExport::RepoRestorer.new(path: storage_path, project: project).restore + def restore_repo + Gitlab::ImportExport::RepoRestorer.new(path: storage_path, project: project_tree.project).restore end def storage_path - @storage_path ||= Gitlab::ImportExport.export_path(relative_path: project.path_with_namespace) + @storage_path ||= Gitlab::ImportExport.export_path(relative_path: path_with_namespace) + end + + def path_with_namespace + File.join(@namespace_path, @project_path) end end end diff --git a/lib/gitlab/import_export/project_tree_restorer.rb b/lib/gitlab/import_export/project_tree_restorer.rb index 4e0f555afe9..445f1d884d0 100644 --- a/lib/gitlab/import_export/project_tree_restorer.rb +++ b/lib/gitlab/import_export/project_tree_restorer.rb @@ -49,6 +49,7 @@ module Gitlab project = Gitlab::ImportExport::ProjectFactory.create( project_params: project_params, user: @user) project.save + project.import_start project end