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

  def new
6

7 8 9 10 11 12
  end

  def callback
    dump_file = params[:dump_file]

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

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

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

    session[:google_code_dump] = dump
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 57

    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

58 59 60 61 62
    # 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

63 64 65 66
    session[:google_code_user_map] = user_map

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

67 68 69 70 71
    redirect_to status_import_google_code_path
  end

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

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

    @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

97 98 99
    user_map = session[:google_code_user_map]

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

  private

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

108
  def verify_google_code_import_enabled
109
    render_404 unless google_code_import_enabled?
110 111
  end

112 113 114 115 116 117 118 119 120 121
  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
122
end