importing.rb revision 51da3d91f66d9b359075e91acf63b46b7c13b604
282f31b2b7ad4ca69287402d6d3a91a280bcb15eJulian Kornberger# * pending - Job is enqueued.
282f31b2b7ad4ca69287402d6d3a91a280bcb15eJulian Kornberger# * fetching - Fetching new commits from the remote repository.
282f31b2b7ad4ca69287402d6d3a91a280bcb15eJulian Kornberger# * processing - Inserting fetched commits into the local database-
282f31b2b7ad4ca69287402d6d3a91a280bcb15eJulian Kornberger# * done - Everthing is fine, nothing to do-
282f31b2b7ad4ca69287402d6d3a91a280bcb15eJulian Kornberger# * failed - Something has gone wrong.
5379e11f2c6c49c6df4872d6a55f2ff390969e66Julian Kornberger scope :with_source, where("source_type IS NOT null")
5379e11f2c6c49c6df4872d6a55f2ff390969e66Julian Kornberger # Ready for pulling
5379e11f2c6c49c6df4872d6a55f2ff390969e66Julian Kornberger .where("imported_at IS NULL or imported_at < ?", IMPORT_INTERVAL.ago )
63690d8280c5282c6bd057da5330a6ae8859af35Eugen Kuksa validates_with SourceTypeValidator, if: :source_address?
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa validates_presence_of :remote_type, if: :source_address?
63690d8280c5282c6bd057da5330a6ae8859af35Eugen Kuksa after_create ->() { async_remote :clone }, if: :source_address?
282f31b2b7ad4ca69287402d6d3a91a280bcb15eJulian Kornberger # do not allow new actions in specific states
5379e11f2c6c49c6df4872d6a55f2ff390969e66Julian Kornberger args << source_address if method == 'clone'
5379e11f2c6c49c6df4872d6a55f2ff390969e66Julian Kornberger # build method name
93ff918a7a1656d812f27a767a976ea33da0921fJulian Kornberger method = method.to_s
5379e11f2c6c49c6df4872d6a55f2ff390969e66Julian Kornberger method += '_svn' if source_type == 'svn'
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger do_or_set_failed do
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa process_fetch(method, args, remote_type)
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa def process_fetch(method, args, remote_type)
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa update_state! 'fetching'
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa result = git.send(method, *args)
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa convert_to_local! if remote_type == 'fork'
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa update_state! 'processing'
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa update_database_after_fetch(result)
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa self.imported_at = Time.now
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa update_state! 'done'
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa def update_database_after_fetch(range)
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa suspended_save_ontologies \
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa start_oid: range.current,
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa stop_oid: range.previous,
d94a4d9e48f0ca6d52f1bb7ed7860dbcadbd90d6Eugen Kuksa walk_order: Rugged::SORT_REVERSE
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger module ClassMethods
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa # Creates a new repository and imports the contents from the remote
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa # repository.
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger def import_remote(type, user, source, name, params={})
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa unless SOURCE_TYPES.include?(type)
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa raise ArgumentError, "invalid source type: #{type}"
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa unless GitRepository.send "is_#{type}_repository?", source
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa raise Repository::ImportError, "#{source} is not a #{type} repository"
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger params[:name] = name
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger params[:source_type] = type
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger params[:source_address] = source
e81334464ee46b772442343c2f871ea82d4a3c82Eugen Kuksa params[:access] = params[:access] ?
e81334464ee46b772442343c2f871ea82d4a3c82Eugen Kuksa Repository::Access.as_read_only(params[:access]) :
e81334464ee46b772442343c2f871ea82d4a3c82Eugen Kuksa Repository::Access::DEFAULT_OPTION
89575ed6ea1f9c9058164005c0c8a64e8aeae3a4Julian Kornberger r = Repository.new(params)
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa class RemoteTypeValidator < ActiveModel::Validator
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa def validate(record)
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa if REMOTE_TYPES.include?(record.remote_type) &&
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa !record.source_address.present?
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa record.errors[:remote_type] =
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa "Source address not set for #{record.remote_type}"
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa elsif record.remote_type == 'mirror' && !record.source_type?
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa record.errors[:remote_type] =
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa "Source type not set for #{record.remote_type}"
39d0ed9f8e3c74205b66e86abcf317c6a56900ccEugen Kuksa class SourceTypeValidator < ActiveModel::Validator
39d0ed9f8e3c74205b66e86abcf317c6a56900ccEugen Kuksa def validate(record)
1d30f949f910951ed77a466a5267ae3069df8410Eugen Kuksa if record.mirror? && !record.source_type.present?
51da3d91f66d9b359075e91acf63b46b7c13b604Eugen Kuksa record.errors[:source_address] = 'not a valid remote repository '\
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa "(types supported: #{SOURCE_TYPES.join(', ')})"
39d0ed9f8e3c74205b66e86abcf317c6a56900ccEugen Kuksa record.errors[:source_type] = "not present"
51da3d91f66d9b359075e91acf63b46b7c13b604Eugen Kuksa def clean_and_initialize_record
51da3d91f66d9b359075e91acf63b46b7c13b604Eugen Kuksa self.remote_type = nil unless source_address?
51da3d91f66d9b359075e91acf63b46b7c13b604Eugen Kuksa detect_source_type if new_record?
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa def detect_source_type
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa if GitRepository.is_git_repository?(source_address)
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa self.source_type = 'git'
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa elsif GitRepository.is_svn_repository?(source_address)
8f845e804ef24c045876941e34930a9ac6720dbfEugen Kuksa self.source_type = 'svn'