BigW Consortium Gitlab

google_code_controller.rb 3.25 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 6 7 8 9 10 11

  def new
  end

  def callback
    dump_file = params[:dump_file]

    unless dump_file.respond_to?(:read)
12
      return redirect_back_or_default(options: { 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_back_or_default(options: { alert: "The uploaded file is not a valid Google Takeout archive." })
19 20
    end

21 22
    client = Gitlab::GoogleCodeImport::Client.new(dump)
    unless client.valid?
23
      return redirect_back_or_default(options: { alert: "The uploaded file is not a valid Google Takeout archive." })
24 25 26
    end

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

    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

56 57 58 59 60
    # 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

61 62 63 64
    session[:google_code_user_map] = user_map

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

65 66 67 68 69
    redirect_to status_import_google_code_path
  end

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

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

    @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

95 96 97
    user_map = session[:google_code_user_map]

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

  private

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

106
  def verify_google_code_import_enabled
107
    render_404 unless google_code_import_enabled?
108 109
  end

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