importing.rb revision 5422b48ab5841a2909cd9e53905dae4cd8418f0a
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornbergermodule Repository::Importing
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger extend ActiveSupport::Concern
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger SOURCE_TYPES = %w( git svn )
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger STATES = %w( pending processing done failed )
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger included do
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger include StateUpdater
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger @queue = 'import'
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger validates_inclusion_of :state, in: STATES
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger validates_inclusion_of :source_type, in: SOURCE_TYPES, if: :remote?
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger after_create :async_clone, if: :remote?
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger end
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger def remote?
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger source_address?
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger end
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger # do not allow new actions if running
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger def locked?
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger %w( pending processing ).include?(state)
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger end
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger # enqueues a clone job
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger def async_clone
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger async_remote :clone
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger end
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger # enqueues a synchronize job
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger def async_synchronize
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger async_remote :synchronize
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger end
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger # enqueues a remote job
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger def async_remote(method)
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger raise "object is #{state}" if locked?
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger update_state! 'pending'
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger async :remote_send, method
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger end
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger def remote_send(method)
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger update_state! 'processing'
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger do_or_set_failed do
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger remote_repository.send method
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger update_state! 'done'
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger end
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger end
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger def remote_repository
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger RemoteRepository.instance(self)
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger end
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger module ClassMethods
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger # creates a new repository and imports the contents from the remote repository
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger def import_remote(type, user, source, name, params={})
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger raise ArgumentError, "invalid source type: #{type}" unless SOURCE_TYPES.include?(type)
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger raise Repository::ImportError, "#{source} is not a #{type} repository" unless GitRepository.send "is_#{type}_repository?", source
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger params[:name] = name
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger params[:source_type] = type
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger params[:source_address] = source
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger r = Repository.create!(params)
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger r.user = user
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger r.save!
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger r
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger end
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger end
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornberger
5422b48ab5841a2909cd9e53905dae4cd8418f0aJulian Kornbergerend