import_service.rb 1.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
module Projects
  class ImportService < BaseService
    include Gitlab::ShellAdapter

    class Error < StandardError; end

    ALLOWED_TYPES = [
      'bitbucket',
      'fogbugz',
      'gitlab',
      'github',
12 13
      'google_code',
      'gitlab_project'
14 15 16
    ]

    def execute
17
      add_repository_to_project unless project.gitlab_project_import?
18 19 20 21

      import_data

      success
22
    rescue => e
23 24 25 26 27
      error(e.message)
    end

    private

28 29 30 31 32 33 34 35 36
    def add_repository_to_project
      if unknown_url?
        # In this case, we only want to import issues, not a repository.
        create_repository
      else
        import_repository
      end
    end

37 38 39 40 41 42 43 44
    def create_repository
      unless project.create_repository
        raise Error, 'The repository could not be created.'
      end
    end

    def import_repository
      begin
45
        gitlab_shell.import_repository(project.repository_storage_path, project.path_with_namespace, project.import_url)
46
      rescue Gitlab::Shell::Error => e
J
James Lopez 已提交
47
        raise Error,  "Error importing repository #{project.import_url} into #{project.path_with_namespace} - #{e.message}"
48 49 50 51 52 53
      end
    end

    def import_data
      return unless has_importer?

54
      project.repository.before_import unless project.gitlab_project_import?
55

56 57 58 59 60 61 62 63 64 65
      unless importer.execute
        raise Error, 'The remote data could not be imported.'
      end
    end

    def has_importer?
      ALLOWED_TYPES.include?(project.import_type)
    end

    def importer
66
      return Gitlab::ImportExport::Importer.new(project) if @project.gitlab_project_import?
67

68 69 70 71 72 73 74 75 76
      class_name = "Gitlab::#{project.import_type.camelize}Import::Importer"
      class_name.constantize.new(project)
    end

    def unknown_url?
      project.import_url == Project::UNKNOWN_IMPORT_URL
    end
  end
end