summaryrefslogtreecommitdiff
path: root/app/workers/repository_import_worker.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/workers/repository_import_worker.rb')
-rw-r--r--app/workers/repository_import_worker.rb46
1 files changed, 31 insertions, 15 deletions
diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb
index b33ba2ed7c1..2c2d1e8b91f 100644
--- a/app/workers/repository_import_worker.rb
+++ b/app/workers/repository_import_worker.rb
@@ -1,29 +1,45 @@
class RepositoryImportWorker
+ ImportError = Class.new(StandardError)
+
include Sidekiq::Worker
include DedicatedSidekiqQueue
- sidekiq_options status_expiration: StuckImportJobsWorker::IMPORT_EXPIRATION
-
- attr_accessor :project, :current_user
+ sidekiq_options status_expiration: StuckImportJobsWorker::IMPORT_JOBS_EXPIRATION
def perform(project_id)
- @project = Project.find(project_id)
- @current_user = @project.creator
-
- Gitlab::Metrics.add_event(:import_repository,
- import_url: @project.import_url,
- path: @project.path_with_namespace)
+ project = Project.find(project_id)
- project.update_columns(import_jid: self.jid, import_error: nil)
+ return unless start_import(project)
- result = Projects::ImportService.new(project, current_user).execute
+ Gitlab::Metrics.add_event(:import_repository,
+ import_url: project.import_url,
+ path: project.full_path)
- if result[:status] == :error
- project.mark_import_as_failed(result[:message])
- return
- end
+ result = Projects::ImportService.new(project, project.creator).execute
+ raise ImportError, result[:message] if result[:status] == :error
project.repository.after_import
project.import_finish
+ rescue ImportError => ex
+ fail_import(project, ex.message)
+ raise
+ rescue => ex
+ return unless project
+
+ fail_import(project, ex.message)
+ raise ImportError, "#{ex.class} #{ex.message}"
+ end
+
+ private
+
+ def start_import(project)
+ return true if project.import_start
+
+ Rails.logger.info("Project #{project.full_path} was in inconsistent state (#{project.import_status}) while importing.")
+ false
+ end
+
+ def fail_import(project, message)
+ project.mark_import_as_failed(message)
end
end