Merge pull request #137 from hron/guard

---

It seems like the new interactor eats input from $stdin even while it is locked. This disallow using tools like ruby-debug or pry in specs or cucumber.

The fix just kills the interactor when it is locked and runs it again when ulocked.

Conflicts:
	lib/guard/interactor.rb
This commit is contained in:
Michael Kessler 2011-09-21 00:34:11 +02:00
commit 072d5404ee
5 changed files with 242 additions and 20 deletions

View File

@ -1,3 +1,7 @@
## Master
- Pull request [#137](https://github.com/guard/guard/pull/137): Fix interacting with tools like ruby-debug. ([@hron][] & [@netzpirat][])
## 0.7.0 - September 14, 2011
## 0.7.0.rc1 - September 5, 2011
@ -250,6 +254,7 @@
[@fnichol]: https://github.com/fnichol
[@Gazer]: https://github.com/Gazer
[@gix]: https://github.com/gix
[@hron]: https://github.com/hron
[@hashrocketeer]: https://github.com/hashrocketeer
[@ianwhite]: https://github.com/ianwhite
[@indirect]: https://github.com/indirect

View File

@ -4,6 +4,7 @@ module Guard
# specific action upon them unless its locked.
#
# Currently the following actions are implemented:
#
# - stop, quit, exit, s, q, e => Exit Guard
# - reload, r, z => Reload Guard
# - pause, p => Pause Guard
@ -11,6 +12,9 @@ module Guard
#
class Interactor
class LockException < Exception; end
class UnlockException < Exception; end
attr_reader :locked
# Initialize the interactor in unlocked state.
@ -19,25 +23,31 @@ module Guard
@locked = false
end
# Start the interactor in a own thread.
# Start the interactor in its own thread.
#
def start
return if ENV["GUARD_ENV"] == 'test'
Thread.new do
@thread = Thread.new do
loop do
if (entry = $stdin.gets) && !@locked
entry.gsub! /\n/, ''
case entry
when 'stop', 'quit', 'exit', 's', 'q', 'e'
::Guard.stop
when 'reload', 'r', 'z'
::Guard.reload
when 'pause', 'p'
::Guard.pause
else
::Guard.run_all
begin
if !@locked && (entry = $stdin.gets)
entry.gsub! /\n/, ''
case entry
when 'stop', 'quit', 'exit', 's', 'q', 'e'
::Guard.stop
when 'reload', 'r', 'z'
::Guard.reload
when 'pause', 'p'
::Guard.pause
else
::Guard.run_all
end
end
rescue LockException
lock
rescue UnlockException
unlock
end
end
end
@ -46,13 +56,21 @@ module Guard
# Lock the interactor.
#
def lock
@locked = true
if !@thread || @thread == Thread.current
@locked = true
else
@thread.raise(LockException)
end
end
# Unlock the interactor.
#
def unlock
@locked = false
if !@thread || @thread == Thread.current
@locked = false
else
@thread.raise(UnlockException)
end
end
end

View File

@ -17,6 +17,47 @@
.
.nf
<a href="#NAME">NAME</a>
<a href="#NAME">NAME</a>
.
.fi
.
.IP "" 0
.
.P
.
.P
.
.IP "" 4
.
.nf
<li class=\'tl\'>guard</li>
<li class=\'tc\'></li>
<li class=\'tr\'>guard</li>
.
.fi
.
.IP "" 0
.
.P
.
.P
.
.P
\fBguard\fR
.
.P
\fI!DOCTYPE html\fR
.
.P
.
.P
.
.IP "" 4
.
.nf
<a href="#NAME">NAME</a>
.
.fi
@ -66,4 +107,22 @@
.P
.
.P
.
.P
.
.IP "" 4
.
.nf
<li class=\'tl\'></li>
<li class=\'tc\'>September 2011</li>
<li class=\'tr\'>guard</li>
.
.fi
.
.IP "" 0
.
.P
.
.P

View File

@ -55,6 +55,7 @@
<div class='man-navigation' style='display:none'>
<a href="#NAME">NAME</a>
<a href="#NAME">NAME</a>
<a href="#NAME">NAME</a>
</div>
<ol class='man-decor man-head man head'>
@ -70,10 +71,10 @@
<p><var>!DOCTYPE html</var>
<html>
<head>
<meta http-equiv="content-type" value="text/html;charset=utf8" />
<meta value="text/html;charset=utf8" http-equiv="content-type" />
<meta name="generator" value="Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)" />
<title>guard</title>
<style type="text/css" media="all">
<style media="all" type="text/css">
/<em> style: man </em>/
body#manpage {margin:0}
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
@ -127,6 +128,7 @@
<p> <div class="man-navigation" style="display:none" /></p>
<pre><code>&lt;a href="#NAME"&gt;NAME&lt;/a&gt;
&lt;a href="#NAME"&gt;NAME&lt;/a&gt;
</code></pre>
<p> </p>
@ -147,6 +149,117 @@
</p>
<p><var>!DOCTYPE html</var>
<html>
<head>
<meta value="text/html;charset=utf8" http-equiv="content-type" />
<meta name="generator" value="Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)" />
<title>guard</title>
<style media="all" type="text/css">
/<em> style: man </em>/
body#manpage {margin:0}
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
.mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
.mp h2 {margin:10px 0 0 0}
.mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
.mp h3 {margin:0 0 0 4ex}
.mp dt {margin:0;clear:left}
.mp dt.flush {float:left;width:8ex}
.mp dd {margin:0 0 0 9ex}
.mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
.mp pre {margin-bottom:20px}
.mp pre+h2,.mp pre+h3 {margin-top:22px}
.mp h2+pre,.mp h3+pre {margin-top:5px}
.mp img {display:block;margin:auto}
.mp h1.man-title {display:none}
.mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
.mp h2 {font-size:16px;line-height:1.25}
.mp h1 {font-size:20px;line-height:2}
.mp {text-align:justify;background:#fff}
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
.mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
.mp u {text-decoration:underline}
.mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
.mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
.mp b.man-ref {font-weight:normal;color:#434241}
.mp pre {padding:0 4ex}
.mp pre code {font-weight:normal;color:#434241}
.mp h2+pre,h3+pre {padding-left:0}
ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
ol.man-decor {width:100%}
ol.man-decor li.tl {text-align:left}
ol.man-decor li.tc {text-align:center;letter-spacing:4px}
ol.man-decor li.tr {text-align:right;float:right}
</style>
</head></html></p>
<!--
The following styles are deprecated and will be removed at some point:
div#man, div#man ol.man, div#man ol.head, div#man ol.man.
The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
.man-navigation should be used instead.
-->
<p><body id="manpage">
<div class="mp" id="man" /></body></p>
<p> <div class="man-navigation" style="display:none" /></p>
<pre><code>&lt;a href="#NAME"&gt;NAME&lt;/a&gt;
</code></pre>
<p> </p>
<p> <ol class="man-decor man-head man head" /></p>
<pre><code>&lt;li class='tl'&gt;guard&lt;/li&gt;
&lt;li class='tc'&gt;&lt;/li&gt;
&lt;li class='tr'&gt;guard&lt;/li&gt;
</code></pre>
<p> </p>
<p> <h2 id="NAME">NAME</h2></p>
<p class="man-name">
<code>guard</code>
</p>
<p>.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
@ -242,6 +355,31 @@ This manual has been written by Remy Coutable.
https://github.com/guard/guard</p>
<p> <ol class="man-decor man-foot man foot" /></p>
<pre><code>&lt;li class='tl'&gt;&lt;/li&gt;
&lt;li class='tc'&gt;September 2011&lt;/li&gt;
&lt;li class='tr'&gt;guard&lt;/li&gt;
</code></pre>
<p> </p>
<p>
</p>
<p> <ol class="man-decor man-foot man foot" /></p>
<pre><code>&lt;li class='tl'&gt;&lt;/li&gt;

View File

@ -4,20 +4,22 @@ describe Guard::Interactor do
subject { Guard::Interactor.new }
describe "#initialize" do
it "un-lock by default" do
it "unlocks the interactor by default" do
subject.locked.should be_false
end
end
describe "#lock" do
it "locks" do
it "locks the interactor" do
subject.start
subject.lock
subject.locked.should be_true
end
end
describe "#unlock" do
it "unlocks" do
it "unlocks the interactor" do
subject.start
subject.unlock
subject.locked.should be_false
end