Commit 68f8ae26 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Improve manifest import logic

Signed-off-by: default avatarDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
parent 237a3597
class Import::ManifestController < Import::BaseController class Import::ManifestController < Import::BaseController
before_action :ensure_session, only: [:create, :status, :jobs] before_action :ensure_import_vars, only: [:create, :status]
before_action :group, only: [:status, :create]
def new def new
end end
def status def status
@repos = session[:projects] @already_added_projects = find_already_added_projects
already_added_import_urls = @already_added_projects.pluck(:import_url)
@already_added_projects = find_already_added_projects('manifest').where(namespace_id: group) @pending_repositories = repositories.to_a.reject do |repository|
already_added_projects_names = @already_added_projects.pluck(:import_url) already_added_import_urls.include?(repository[:url])
end
@repos = @repos.to_a.reject { |repo| already_added_projects_names.include? repo[:url] }
end end
def upload def upload
...@@ -26,11 +25,9 @@ class Import::ManifestController < Import::BaseController ...@@ -26,11 +25,9 @@ class Import::ManifestController < Import::BaseController
manifest = Gitlab::ManifestImport::Manifest.new(params[:manifest].tempfile) manifest = Gitlab::ManifestImport::Manifest.new(params[:manifest].tempfile)
if manifest.valid? if manifest.valid?
session[:projects] = manifest.projects session[:repositories] = manifest.projects
session[:group_id] = group.id session[:group_id] = group.id
flash[:notice] = "Import successfully started."
redirect_to status_import_manifest_path redirect_to status_import_manifest_path
else else
@errors = manifest.errors @errors = manifest.errors
...@@ -40,11 +37,11 @@ class Import::ManifestController < Import::BaseController ...@@ -40,11 +37,11 @@ class Import::ManifestController < Import::BaseController
end end
def jobs def jobs
render json: find_jobs('manifest') render json: find_jobs
end end
def create def create
repository = session[:projects].find do |project| repository = repositories.find do |project|
project[:id] == params[:repo_id].to_i project[:id] == params[:repo_id].to_i
end end
...@@ -59,13 +56,28 @@ class Import::ManifestController < Import::BaseController ...@@ -59,13 +56,28 @@ class Import::ManifestController < Import::BaseController
private private
def ensure_session def ensure_import_vars
if session[:projects].blank? || session[:group_id].blank? unless group && repositories.present?
redirect_to(new_import_manifest_path) redirect_to(new_import_manifest_path)
end end
end end
def group def group
@group ||= Group.find(session[:group_id]) @group ||= Group.find_by(id: session[:group_id])
end
def repositories
@repositories ||= session[:repositories]
end
def find_jobs
find_already_added_projects.to_json(only: [:id], methods: [:import_status])
end
def find_already_added_projects
group.all_projects
.where(import_type: 'manifest')
.where(creator_id: current_user)
.includes(:import_state)
end end
end end
- page_title "Manifest Import" - page_title "Manifest file import"
- header_title "Projects", root_path - header_title "Projects", root_path
%h3.page-title %h3.page-title
= icon('git') = _('Manifest file import')
Import multiple repositories
- if @errors.present? - if @errors.present?
.alert.alert-danger .alert.alert-danger
......
...@@ -3,8 +3,10 @@ ...@@ -3,8 +3,10 @@
- provider = 'manifest' - provider = 'manifest'
%h3.page-title %h3.page-title
= icon('git') = _('Manifest file import')
= _('Import multiple repositories')
%p.light
= _('Import multiple repositories by uploading a manifest file.')
%p %p
= button_tag class: "btn btn-import btn-success js-import-all" do = button_tag class: "btn btn-import btn-success js-import-all" do
...@@ -24,10 +26,10 @@ ...@@ -24,10 +26,10 @@
%tbody %tbody
- @already_added_projects.each do |project| - @already_added_projects.each do |project|
%tr{ id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}" } %tr{ id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}" }
%td
= link_to_project project
%td %td
= project.import_url = project.import_url
%td
= link_to_project project
%td.job-status %td.job-status
- if project.import_status == 'finished' - if project.import_status == 'finished'
%span %span
...@@ -41,15 +43,15 @@ ...@@ -41,15 +43,15 @@
- else - else
= project.human_import_status_name = project.human_import_status_name
- @repos.each do |repo| - @pending_repositories.each do |repository|
%tr{ id: "repo_#{repo[:id]}" } %tr{ id: "repo_#{repository[:id]}" }
%td %td
= repo[:url] = repository[:url]
%td.import-target %td.import-target
= import_project_target(@group.path, repo[:path]) = import_project_target(@group.full_path, repository[:path])
%td.import-actions.job-status %td.import-actions.job-status
= button_tag class: "btn btn-import js-add-to-import" do = button_tag class: "btn btn-import js-add-to-import" do
Import = _('Import')
= icon("spinner spin", class: "loading-icon") = icon("spinner spin", class: "loading-icon")
.js-importer-status{ data: { jobs_import_path: "#{url_for([:jobs, :import, provider])}", .js-importer-status{ data: { jobs_import_path: "#{url_for([:jobs, :import, provider])}",
......
...@@ -17,7 +17,7 @@ module Gitlab ...@@ -17,7 +17,7 @@ module Gitlab
def import_project def import_project
group_full_path, _, project_path = repository[:path].rpartition('/') group_full_path, _, project_path = repository[:path].rpartition('/')
group_full_path = File.join(destination.path, group_full_path) if destination group_full_path = File.join(destination.full_path, group_full_path) if destination
group = Group.find_by_full_path(group_full_path) || group = Group.find_by_full_path(group_full_path) ||
create_group_with_parents(group_full_path) create_group_with_parents(group_full_path)
......
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