diff options
author | James Lopez <james@jameslopez.es> | 2017-11-06 09:11:26 +0100 |
---|---|---|
committer | James Lopez <james@jameslopez.es> | 2017-11-06 16:15:11 +0100 |
commit | 4e440d697586204b2c8aa163f62967a280ad1c94 (patch) | |
tree | 7f48f03bed7b12e5085cc950aa52c51f335bf544 | |
parent | fcc4e171824adff85e8d822eb2c78049ade2bd05 (diff) | |
download | gitlab-ce-4e440d697586204b2c8aa163f62967a280ad1c94.tar.gz |
refactor and rename classes
-rw-r--r-- | lib/gitlab/bare_repository_import/bare_repository.rb | 30 | ||||
-rw-r--r-- | lib/gitlab/bare_repository_import/importer.rb | 96 | ||||
-rw-r--r-- | lib/gitlab/bare_repository_importer.rb | 96 | ||||
-rw-r--r-- | lib/gitlab/project_repo_path.rb | 28 | ||||
-rw-r--r-- | lib/tasks/gitlab/import.rake | 2 | ||||
-rw-r--r-- | spec/lib/gitlab/bare_repository_import/bare_repository_spec.rb (renamed from spec/lib/gitlab/project_repo_path_spec.rb) | 2 | ||||
-rw-r--r-- | spec/lib/gitlab/bare_repository_import/importer_spec.rb (renamed from spec/lib/gitlab/bare_repository_importer_spec.rb) | 6 |
7 files changed, 131 insertions, 129 deletions
diff --git a/lib/gitlab/bare_repository_import/bare_repository.rb b/lib/gitlab/bare_repository_import/bare_repository.rb new file mode 100644 index 00000000000..edaba157b18 --- /dev/null +++ b/lib/gitlab/bare_repository_import/bare_repository.rb @@ -0,0 +1,30 @@ +module Gitlab + module BareRepositoryImport + class BareRepository + attr_reader :group_path, :project_name, :repo_path + + def initialize(root_path, repo_path) + @root_path = root_path + @repo_path = repo_path + + # Split path into 'all/the/namespaces' and 'project_name' + @group_path, _sep, @project_name = repo_relative_path.rpartition('/') + end + + def wiki? + @wiki ||= @repo_path.end_with?('.wiki.git') + end + + def project_full_path + @project_full_path ||= "#{group_path}/#{project_name}" + end + + private + + def repo_relative_path + # Remove root path and `.git` at the end + repo_path.sub(/\A#{@root_path}/, '').sub(/\.git$/, '') + end + end + end +end diff --git a/lib/gitlab/bare_repository_import/importer.rb b/lib/gitlab/bare_repository_import/importer.rb new file mode 100644 index 00000000000..43795965801 --- /dev/null +++ b/lib/gitlab/bare_repository_import/importer.rb @@ -0,0 +1,96 @@ +module Gitlab + module BareRepositoryImport + class Importer + include Gitlab::ShellAdapter + + NoAdminError = Class.new(StandardError) + + def self.execute(import_path) + import_path << '/' unless import_path.ends_with?('/') + repos_to_import = Dir.glob(import_path + '/**/*.git') + + repos_to_import.each do |repo_path| + bare_repo = Gitlab::BareRepositoryImport::BareRepository.new(import_path, repo_path) + + if bare_repo.wiki? + log " * Skipping wiki repo" + + next + end + + log "Processing #{repo_path}".color(:yellow) + + new(bare_repo).create_project_if_needed + end + end + + attr_reader :storage_name, :user, :project_name, :bare_repo + + delegate :log, to: :class + delegate :project_name, :project_full_path, :group_path, :repo_path, to: :bare_repo + + def initialize(bare_repo) + unless @user = User.admins.order_id_asc.first + raise NoAdminError.new('No admin user found to import repositories') + end + + @bare_repo = bare_repo + end + + def create_project_if_needed + if project = Project.find_by_full_path(project_full_path) + log " * #{project.name} (#{project_full_path}) exists" + + return project + end + + create_project + end + + private + + def create_project + group = find_or_create_groups + + project = Projects::CreateService.new(user, + name: project_name, + path: project_name, + skip_disk_validation: true, + import_type: 'gitlab_project', + namespace_id: group&.id).execute + + if project.persisted? && import_repo(project) + + log " * Created #{project.name} (#{project_full_path})".color(:green) + + ProjectCacheWorker.perform_async(project.id) + else + log " * Failed trying to create #{project.name} (#{project_full_path})".color(:red) + log " Errors: #{project.errors.messages}".color(:red) + end + + project + end + + def import_repo(project) + gitlab_shell.import_repository(project.repository_storage_path, project.disk_path, repo_path) + end + + def find_or_create_groups + return nil unless group_path.present? + + log " * Using namespace: #{group_path}" + + Groups::NestedCreateService.new(user, group_path: group_path).execute + end + + # This is called from within a rake task only used by Admins, so allow writing + # to STDOUT + # + # rubocop:disable Rails/Output + def self.log(message) + puts message + end + end + end +end diff --git a/lib/gitlab/bare_repository_importer.rb b/lib/gitlab/bare_repository_importer.rb deleted file mode 100644 index 31d7ac46621..00000000000 --- a/lib/gitlab/bare_repository_importer.rb +++ /dev/null @@ -1,96 +0,0 @@ -module Gitlab - class BareRepositoryImporter - include Gitlab::ShellAdapter - - NoAdminError = Class.new(StandardError) - - def self.execute(import_path) - import_path << '/' unless import_path.ends_with?('/') - repos_to_import = Dir.glob(import_path + '/**/*.git') - - repos_to_import.each do |repo_path| - project_repo_path = Gitlab::ProjectRepoPath.new(import_path, repo_path) - - if project_repo_path.wiki? - log " * Skipping wiki repo" - - next - end - - log "Processing #{repo_path}".color(:yellow) - - new(project_repo_path).create_project_if_needed - end - end - - attr_reader :storage_name, :user, :project_name - delegate :log, to: :class - - def initialize(project_repo_path) - unless @user = User.admins.order_id_asc.first - raise NoAdminError.new('No admin user found to import repositories') - end - - @project_repo_path = project_repo_path - @project_name = project_repo_path.project_name - end - - def create_project_if_needed - if project = Project.find_by_full_path(@project_repo_path.project_full_path) - log " * #{project.name} (#{@project_repo_path.project_full_path}) exists" - - return project - end - - create_project - end - - private - - def create_project - group = find_or_create_groups - - project = Projects::CreateService.new(user, - name: project_name, - path: project_name, - skip_disk_validation: true, - import_type: 'gitlab_project', - namespace_id: group&.id).execute - - if project.persisted? && import_repo(project) - - log " * Created #{project.name} (#{@project_repo_path.project_full_path})".color(:green) - - ProjectCacheWorker.perform_async(project.id) - else - log " * Failed trying to create #{project.name} (#{@project_repo_path.project_full_path})".color(:red) - log " Errors: #{project.errors.messages}".color(:red) - end - - project - end - - def import_repo(project) - gitlab_shell.import_repository(project.repository_storage_path, project.disk_path, @project_repo_path.repo_path) - end - - def find_or_create_groups - group_path = @project_repo_path.group_path - - return nil unless group_path.present? - - log " * Using namespace: #{group_path}" - - Groups::NestedCreateService.new(user, group_path: group_path).execute - end - - # This is called from within a rake task only used by Admins, so allow writing - # to STDOUT - # - # rubocop:disable Rails/Output - def self.log(message) - puts message - end - # rubocop:enable Rails/Output - end -end diff --git a/lib/gitlab/project_repo_path.rb b/lib/gitlab/project_repo_path.rb deleted file mode 100644 index 4e5c8a1d790..00000000000 --- a/lib/gitlab/project_repo_path.rb +++ /dev/null @@ -1,28 +0,0 @@ -module Gitlab - class ProjectRepoPath - attr_reader :group_path, :project_name, :repo_path - - def initialize(root_path, repo_path) - @root_path = root_path - @repo_path = repo_path - - # Split path into 'all/the/namespaces' and 'project_name' - @group_path, _sep, @project_name = repo_relative_path.rpartition('/') - end - - def wiki? - @wiki ||= @repo_path.end_with?('.wiki.git') - end - - def project_full_path - @project_full_path ||= "#{group_path}/#{project_name}" - end - - private - - def repo_relative_path - # Remove root path and `.git` at the end - repo_path.sub(/\A#{@root_path}/, '').sub(/\.git$/, '') - end - end -end diff --git a/lib/tasks/gitlab/import.rake b/lib/tasks/gitlab/import.rake index c7531787b76..adfcc3cda22 100644 --- a/lib/tasks/gitlab/import.rake +++ b/lib/tasks/gitlab/import.rake @@ -16,7 +16,7 @@ namespace :gitlab do exit 1 end - Gitlab::BareRepositoryImporter.execute(args.import_path) + Gitlab::BareRepositoryImport::Importer.execute(args.import_path) end end end diff --git a/spec/lib/gitlab/project_repo_path_spec.rb b/spec/lib/gitlab/bare_repository_import/bare_repository_spec.rb index 65061af54ef..1bbbb64a8c7 100644 --- a/spec/lib/gitlab/project_repo_path_spec.rb +++ b/spec/lib/gitlab/bare_repository_import/bare_repository_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe ::Gitlab::ProjectRepoPath do +describe ::Gitlab::BareRepositoryImport::BareRepository do let(:project_repo_path) { described_class.new('/full/path/', '/full/path/to/repo.git') } it 'stores the repo path' do diff --git a/spec/lib/gitlab/bare_repository_importer_spec.rb b/spec/lib/gitlab/bare_repository_import/importer_spec.rb index 7ed79e3e8a1..f4dd36f6080 100644 --- a/spec/lib/gitlab/bare_repository_importer_spec.rb +++ b/spec/lib/gitlab/bare_repository_import/importer_spec.rb @@ -1,8 +1,8 @@ require 'spec_helper' -describe Gitlab::BareRepositoryImporter, repository: true do +describe Gitlab::BareRepositoryImport::Importer, repository: true do let!(:admin) { create(:admin) } - let(:project_repo_path) { Gitlab::ProjectRepoPath.new(TestEnv.repos_path, File.join(TestEnv.repos_path, "#{project_path}.git")) } + let(:project_repo_path) { Gitlab::BareRepositoryImport::BareRepository.new(TestEnv.repos_path, File.join(TestEnv.repos_path, "#{project_path}.git")) } subject(:importer) { described_class.new(project_repo_path) } @@ -38,7 +38,7 @@ describe Gitlab::BareRepositoryImporter, repository: true do let(:admin) { nil } it 'raises an error' do - expect { importer }.to raise_error(Gitlab::BareRepositoryImporter::NoAdminError) + expect { importer }.to raise_error(Gitlab::BareRepositoryImport::Importer::NoAdminError) end end end |