<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -10,12 +10,26 @@ module RSpactor
       ticker
     end
     
-    def self.ticker_msg(msg, seconds_to_wait = 3)
+    def self.ticker_msg(msg, seconds_to_wait = 3, &amp;block)
       $stdout.print msg
-      seconds_to_wait.times do
-        $stdout.print('.')
-        $stdout.flush
-        sleep 1
+      if block
+        @yielding_ticker = true
+        Thread.new do
+          loop do
+            $stdout.print('.') if @yielding_ticker == true
+            $stdout.flush
+            sleep 1.0
+          end
+        end
+        
+        yield
+        @yielding_ticker = false
+      else
+        seconds_to_wait.times do
+          $stdout.print('.')
+          $stdout.flush
+          sleep 1
+        end
       end
       $stdout.puts &quot;\n&quot;
     end</diff>
      <filename>lib/rspactor/interactor.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,7 +7,7 @@ module RSpactor
       new(run_in, options).start
     end
     
-    attr_reader :dir, :options, :inspector, :interactor
+    attr_reader :dir, :options, :inspector, :interactor, :spork
     
     def initialize(dir, options = {})
       @dir = dir
@@ -18,7 +18,7 @@ module RSpactor
     def start
       load_dotfile
       puts &quot;** RSpactor, now watching at '#{dir}'&quot;
-      Spork.start if options[:spork]
+      (@spork = Spork.new(self)) &amp;&amp; @spork.start if options[:spork]
       Celerity.start(dir) if options[:celerity]
       start_interactor
       start_listener</diff>
      <filename>lib/rspactor/runner.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,25 +1,65 @@
 require 'rspactor'
+require 'socket'
 
 module RSpactor
   class Spork
+    RSPEC_PORT    = 8989
+    CUCUMBER_PORT = 8990
     
-    def self.start
-      kill_and_launch
-      Interactor.ticker_msg &quot;** Launching Spork for rspec &amp; cucumber&quot;
+    attr_accessor :use_cucumber
+    
+    def initialize(runner)
+      @use_cucumber = File.exist?(File.join(runner.dir, 'features'))
+    end
+    
+    def start
+      execute(:start)
     end
     
-    def self.reload
-      kill_and_launch
-      Interactor.ticker_msg &quot;** Reloading Spork for rspec &amp; cucumber&quot;
+    def reload
+      execute(:reload)
     end
     
   private
+  
+    def execute(start_or_reload)
+      action_message = (start_or_reload == :start) ? &quot;Starting&quot; : &quot;Reloading&quot;
+      message = &quot;** #{action_message} Spork for rspec&quot;
+      message += &quot; &amp; cucumber&quot; if use_cucumber
+      kill_and_launch(message)
+    end
     
-    def self.kill_and_launch
-      system(&quot;kill $(ps aux | awk '/spork/&amp;&amp;!/awk/{print $2;}') &gt;/dev/null 2&gt;&amp;1&quot;)
-      system(&quot;spork &gt;/dev/null 2&gt;&amp;1 &lt; /dev/null &amp;&quot;)
-      system(&quot;spork cu &gt;/dev/null 2&gt;&amp;1 &lt; /dev/null &amp;&quot;)
+    def kill_and_launch(message)
+      Interactor.ticker_msg message do
+      
+        system(&quot;kill $(ps aux | awk '/spork/&amp;&amp;!/awk/{print $2;}') &gt;/dev/null 2&gt;&amp;1&quot;)
+      
+        system(&quot;spork &gt;/dev/null 2&gt;&amp;1 &lt; /dev/null &amp;&quot;)
+        wait_for('RSpec', RSPEC_PORT)
+      
+        if use_cucumber
+          system(&quot;spork cu &gt;/dev/null 2&gt;&amp;1 &lt; /dev/null &amp;&quot;)
+          wait_for('Cucumber', CUCUMBER_PORT)
+        end
+      
+      end
+    end
+    
+    def wait_for(sporker, port)
+      15.times do
+        begin
+          TCPSocket.new('localhost', port).close
+        rescue Errno::ECONNREFUSED
+          sleep(1)
+          next
+        end
+
+        return true
+      end
+      
+      raise &quot;could not load spork for #{sporker}; make sure you can use it manually first&quot;
     end
     
   end
+  
 end</diff>
      <filename>lib/rspactor/spork.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@ require 'rspactor/inspector'
 describe RSpactor::Inspector do
   before(:all) do
     options = { :view =&gt; true }
-    @inspector = described_class.new(mock('Runner', :dir =&gt; '/project', :options =&gt; options))
+    @inspector = described_class.new(mock('Runner', :dir =&gt; '/project', :options =&gt; options, :spork =&gt; false))
   end
   
   def translate(file)</diff>
      <filename>spec/inspector_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>3f96449e287b6fa5e536b5a82c3ca9b310866a5d</id>
    </parent>
    <parent>
      <id>81b0edb5890d69aab76b2afd8e25c8f60a71a101</id>
    </parent>
  </parents>
  <author>
    <name>Woody Peterson</name>
    <email>woody.peterson@gmail.com</email>
  </author>
  <url>http://github.com/rubyphunk/rspactor/commit/df31b546897488ed9216729f6533b222255a4a2c</url>
  <id>df31b546897488ed9216729f6533b222255a4a2c</id>
  <committed-date>2009-10-19T22:05:12-07:00</committed-date>
  <authored-date>2009-10-19T22:05:12-07:00</authored-date>
  <message>Merge branch 'waiting_spork_loader'</message>
  <tree>0154f4afce7dbf722a6ead5bf9607d2cdc0e18a0</tree>
  <committer>
    <name>Woody Peterson</name>
    <email>woody.peterson@gmail.com</email>
  </committer>
</commit>
