Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

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
  • Loading branch information...
commit 072d5404ee9e5ba7c07b529912954b1f8b655480 2 parents 9ebc59f + 8c6a307
@netzpirat netzpirat authored
View
5 CHANGELOG.md
@@ -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
48 lib/guard/interactor.rb
@@ -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 @@ def initialize
@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 @@ def start
# 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
59 man/guard
@@ -18,6 +18,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
142 man/guard.html
@@ -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 @@ <h2 id="NAME">NAME</h2>
<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 @@ <h2 id="NAME">NAME</h2>
<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 @@ <h2 id="NAME">NAME</h2>
</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 @@ <h2 id="NAME">NAME</h2>
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
8 spec/guard/interactor_spec.rb
@@ -4,20 +4,22 @@
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
Please sign in to comment.
Something went wrong with that request. Please try again.