google_code_controller.rb 3.05 KB
Newer Older
1
class Import::GoogleCodeController < Import::BaseController
2
  before_action :user_map, only: [:new_user_map, :create_user_map]
3 4

  def new
5

6 7 8 9 10 11
  end

  def callback
    dump_file = params[:dump_file]

    unless dump_file.respond_to?(:read)
12
      return redirect_to :back, alert: "You need to upload a Google Takeout archive."
13 14 15 16 17
    end

    begin
      dump = JSON.parse(dump_file.read)
    rescue
18
      return redirect_to :back, alert: "The uploaded file is not a valid Google Takeout archive."
19 20
    end

Douwe Maan's avatar
Douwe Maan committed
21 22
    client = Gitlab::GoogleCodeImport::Client.new(dump)
    unless client.valid?
23
      return redirect_to :back, alert: "The uploaded file is not a valid Google Takeout archive."
24 25 26
    end

    session[:google_code_dump] = dump
Douwe Maan's avatar
Douwe Maan committed
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

    if params[:create_user_map] == "1"
      redirect_to new_user_map_import_google_code_path
    else
      redirect_to status_import_google_code_path
    end
  end

  def new_user_map

  end

  def create_user_map
    user_map_json = params[:user_map]
    user_map_json = "{}" if user_map_json.blank?

    begin
      user_map = JSON.parse(user_map_json)
    rescue
      flash.now[:alert] = "The entered user map is not a valid JSON user map."

      render "new_user_map" and return
    end

    unless user_map.is_a?(Hash) && user_map.all? { |k, v| k.is_a?(String) && v.is_a?(String) }
      flash.now[:alert] = "The entered user map is not a valid JSON user map."

      render "new_user_map" and return
    end

57 58 59 60 61
    # This is the default, so let's not save it into the database.
    user_map.reject! do |key, value|
      value == Gitlab::GoogleCodeImport::Client.mask_email(key)
    end

Douwe Maan's avatar
Douwe Maan committed
62 63 64 65
    session[:google_code_user_map] = user_map

    flash[:notice] = "The user map has been saved. Continue by selecting the projects you want to import."

66 67 68 69 70
    redirect_to status_import_google_code_path
  end

  def status
    unless client.valid?
71
      return redirect_to new_import_google_code_path
72 73 74
    end

    @repos = client.repos
75
    @incompatible_repos = client.incompatible_repos
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

    @already_added_projects = current_user.created_projects.where(import_type: "google_code")
    already_added_projects_names = @already_added_projects.pluck(:import_source)

    @repos.reject! { |repo| already_added_projects_names.include? repo.name }
  end

  def jobs
    jobs = current_user.created_projects.where(import_type: "google_code").to_json(only: [:id, :import_status])
    render json: jobs
  end

  def create
    @repo_id = params[:repo_id]
    repo = client.repo(@repo_id)
    @target_namespace = current_user.namespace
    @project_name = repo.name

    namespace = @target_namespace

Douwe Maan's avatar
Douwe Maan committed
96 97 98
    user_map = session[:google_code_user_map]

    @project = Gitlab::GoogleCodeImport::ProjectCreator.new(repo, namespace, current_user, user_map).execute
99 100 101 102 103 104 105 106
  end

  private

  def client
    @client ||= Gitlab::GoogleCodeImport::Client.new(session[:google_code_dump])
  end

Douwe Maan's avatar
Douwe Maan committed
107 108 109 110 111 112 113 114 115 116
  def user_map
    @user_map ||= begin
      user_map = client.user_map

      stored_user_map = session[:google_code_user_map]
      user_map.update(stored_user_map) if stored_user_map

      Hash[user_map.sort]
    end
  end
117
end