Class: Rake::RemoteTask::Action

Inherits:
Object
  • Object
show all
Defined in:
lib/rake_remote_task.rb

Overview

Action is used to run a task’s remote_actions in parallel on each of its hosts. Actions are created automatically in Rake::RemoteTask#enhance.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(task, block) ⇒ Action

Creates a new Action that will run block for task.



560
561
562
563
564
# File 'lib/rake_remote_task.rb', line 560

def initialize task, block
  @task  = task
  @block = block
  @workers = []
end

Instance Attribute Details

#blockObject (readonly)

The block this action will execute.



550
551
552
# File 'lib/rake_remote_task.rb', line 550

def block
  @block
end

#taskObject (readonly)

The task this action is attached to.



545
546
547
# File 'lib/rake_remote_task.rb', line 545

def task
  @task
end

#workersObject (readonly)

An Array of threads, one for each host this action executes on.



555
556
557
# File 'lib/rake_remote_task.rb', line 555

def workers
  @workers
end

Instance Method Details

#==(other) ⇒ Object

:nodoc:



566
567
568
569
# File 'lib/rake_remote_task.rb', line 566

def == other # :nodoc:
  return false unless Action === other
  block == other.block && task == other.task
end

#execute(hosts, task, args) ⇒ Object

Execute this action on hosts in parallel. Returns when block has completed for each host.



575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
# File 'lib/rake_remote_task.rb', line 575

def execute hosts, task, args
  hosts.each do |host|
    t = task.clone
    t.target_host = host
    thread = Thread.new(t) do |task|
      Thread.current[:task] = task
      case block.arity
      when 1
        block.call task
      else
        block.call task, args
      end
    end
    @workers << thread
  end
  @workers.each { |w| w.join }
end