importing.rb revision 5379e11f2c6c49c6df4872d6a55f2ff390969e66
#
# States:
# * pending - Job is enqueued.
# * fetching - Fetching new commits from the remote repository.
# * processing - Inserting fetched commits into the local database-
# * done - Everthing is fine, nothing to do-
# * failed - Something has gone wrong.
#
module Repository::Importing
extend ActiveSupport::Concern
SOURCE_TYPES = %w( git svn )
STATES = %w( pending fetching processing done failed )
IMPORT_INTERVAL = 15.minutes
included do
include StateUpdater
scope :with_source, where("source_type IS NOT null")
# Ready for pulling
scope :outdated, ->{
with_source
.where("imported_at IS NULL or imported_at < ?", IMPORT_INTERVAL.ago )
.where(state: 'done')
}
validates_inclusion_of :state, in: STATES
validates_inclusion_of :source_type, in: SOURCE_TYPES, if: :remote?
after_create ->{ async_remote :clone }, if: :remote?
end
def remote?
source_address?
end
# do not allow new actions in specific states
def locked?
!%w( done failed ).include?(state)
end
# enqueues a pull/clone job
def async_remote(method)
raise "object is #{state}" if locked?
update_state! 'pending'
async :remote_send, method
end
# executes a pull/clone job
def remote_send(method)
# build arguments
args = []
args << source_address if method == 'clone'
# build method name
method = method.to_s
method += '_svn' if source_type == 'svn'
do_or_set_failed do
update_state! 'fetching'
result = git.send(method, *args)
update_state! 'processing'
save_current_ontologies
self.imported_at = Time.now
update_state! 'done'
result
end
end
module ClassMethods
# creates a new repository and imports the contents from the remote repository
def import_remote(type, user, source, name, params={})
raise ArgumentError, "invalid source type: #{type}" unless SOURCE_TYPES.include?(type)
raise Repository::ImportError, "#{source} is not a #{type} repository" unless GitRepository.send "is_#{type}_repository?", source
params[:name] = name
params[:source_type] = type
params[:source_address] = source
r = Repository.new(params)
r.user = user
r.save!
r
end
end
end