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:
commit
072d5404ee
@ -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 - September 14, 2011
|
||||||
|
|
||||||
## 0.7.0.rc1 - September 5, 2011
|
## 0.7.0.rc1 - September 5, 2011
|
||||||
@ -250,6 +254,7 @@
|
|||||||
[@fnichol]: https://github.com/fnichol
|
[@fnichol]: https://github.com/fnichol
|
||||||
[@Gazer]: https://github.com/Gazer
|
[@Gazer]: https://github.com/Gazer
|
||||||
[@gix]: https://github.com/gix
|
[@gix]: https://github.com/gix
|
||||||
|
[@hron]: https://github.com/hron
|
||||||
[@hashrocketeer]: https://github.com/hashrocketeer
|
[@hashrocketeer]: https://github.com/hashrocketeer
|
||||||
[@ianwhite]: https://github.com/ianwhite
|
[@ianwhite]: https://github.com/ianwhite
|
||||||
[@indirect]: https://github.com/indirect
|
[@indirect]: https://github.com/indirect
|
||||||
|
@ -4,6 +4,7 @@ module Guard
|
|||||||
# specific action upon them unless its locked.
|
# specific action upon them unless its locked.
|
||||||
#
|
#
|
||||||
# Currently the following actions are implemented:
|
# Currently the following actions are implemented:
|
||||||
|
#
|
||||||
# - stop, quit, exit, s, q, e => Exit Guard
|
# - stop, quit, exit, s, q, e => Exit Guard
|
||||||
# - reload, r, z => Reload Guard
|
# - reload, r, z => Reload Guard
|
||||||
# - pause, p => Pause Guard
|
# - pause, p => Pause Guard
|
||||||
@ -11,6 +12,9 @@ module Guard
|
|||||||
#
|
#
|
||||||
class Interactor
|
class Interactor
|
||||||
|
|
||||||
|
class LockException < Exception; end
|
||||||
|
class UnlockException < Exception; end
|
||||||
|
|
||||||
attr_reader :locked
|
attr_reader :locked
|
||||||
|
|
||||||
# Initialize the interactor in unlocked state.
|
# Initialize the interactor in unlocked state.
|
||||||
@ -19,25 +23,31 @@ module Guard
|
|||||||
@locked = false
|
@locked = false
|
||||||
end
|
end
|
||||||
|
|
||||||
# Start the interactor in a own thread.
|
# Start the interactor in its own thread.
|
||||||
#
|
#
|
||||||
def start
|
def start
|
||||||
return if ENV["GUARD_ENV"] == 'test'
|
return if ENV["GUARD_ENV"] == 'test'
|
||||||
|
|
||||||
Thread.new do
|
@thread = Thread.new do
|
||||||
loop do
|
loop do
|
||||||
if (entry = $stdin.gets) && !@locked
|
begin
|
||||||
entry.gsub! /\n/, ''
|
if !@locked && (entry = $stdin.gets)
|
||||||
case entry
|
entry.gsub! /\n/, ''
|
||||||
when 'stop', 'quit', 'exit', 's', 'q', 'e'
|
case entry
|
||||||
::Guard.stop
|
when 'stop', 'quit', 'exit', 's', 'q', 'e'
|
||||||
when 'reload', 'r', 'z'
|
::Guard.stop
|
||||||
::Guard.reload
|
when 'reload', 'r', 'z'
|
||||||
when 'pause', 'p'
|
::Guard.reload
|
||||||
::Guard.pause
|
when 'pause', 'p'
|
||||||
else
|
::Guard.pause
|
||||||
::Guard.run_all
|
else
|
||||||
|
::Guard.run_all
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
rescue LockException
|
||||||
|
lock
|
||||||
|
rescue UnlockException
|
||||||
|
unlock
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -46,13 +56,21 @@ module Guard
|
|||||||
# Lock the interactor.
|
# Lock the interactor.
|
||||||
#
|
#
|
||||||
def lock
|
def lock
|
||||||
@locked = true
|
if !@thread || @thread == Thread.current
|
||||||
|
@locked = true
|
||||||
|
else
|
||||||
|
@thread.raise(LockException)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Unlock the interactor.
|
# Unlock the interactor.
|
||||||
#
|
#
|
||||||
def unlock
|
def unlock
|
||||||
@locked = false
|
if !@thread || @thread == Thread.current
|
||||||
|
@locked = false
|
||||||
|
else
|
||||||
|
@thread.raise(UnlockException)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
59
man/guard
59
man/guard
@ -17,6 +17,47 @@
|
|||||||
.
|
.
|
||||||
.nf
|
.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>
|
<a href="#NAME">NAME</a>
|
||||||
.
|
.
|
||||||
.fi
|
.fi
|
||||||
@ -66,4 +107,22 @@
|
|||||||
.P
|
.P
|
||||||
.
|
.
|
||||||
.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
|
||||||
|
|
||||||
|
142
man/guard.html
142
man/guard.html
@ -55,6 +55,7 @@
|
|||||||
<div class='man-navigation' style='display:none'>
|
<div class='man-navigation' style='display:none'>
|
||||||
<a href="#NAME">NAME</a>
|
<a href="#NAME">NAME</a>
|
||||||
<a href="#NAME">NAME</a>
|
<a href="#NAME">NAME</a>
|
||||||
|
<a href="#NAME">NAME</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ol class='man-decor man-head man head'>
|
<ol class='man-decor man-head man head'>
|
||||||
@ -70,10 +71,10 @@
|
|||||||
<p><var>!DOCTYPE html</var>
|
<p><var>!DOCTYPE html</var>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<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)" />
|
<meta name="generator" value="Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)" />
|
||||||
<title>guard</title>
|
<title>guard</title>
|
||||||
<style type="text/css" media="all">
|
<style media="all" type="text/css">
|
||||||
/<em> style: man </em>/
|
/<em> style: man </em>/
|
||||||
body#manpage {margin:0}
|
body#manpage {margin:0}
|
||||||
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
|
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
|
||||||
@ -127,6 +128,7 @@
|
|||||||
<p> <div class="man-navigation" style="display:none" /></p>
|
<p> <div class="man-navigation" style="display:none" /></p>
|
||||||
|
|
||||||
<pre><code><a href="#NAME">NAME</a>
|
<pre><code><a href="#NAME">NAME</a>
|
||||||
|
<a href="#NAME">NAME</a>
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
|
||||||
<p> </p>
|
<p> </p>
|
||||||
@ -147,6 +149,117 @@
|
|||||||
</p>
|
</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><a href="#NAME">NAME</a>
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p> </p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p> <ol class="man-decor man-head man head" /></p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<pre><code><li class='tl'>guard</li>
|
||||||
|
<li class='tc'></li>
|
||||||
|
<li class='tr'>guard</li>
|
||||||
|
</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
|
<p>.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.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>
|
https://github.com/guard/guard</p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p> <ol class="man-decor man-foot man foot" /></p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<pre><code><li class='tl'></li>
|
||||||
|
<li class='tc'>September 2011</li>
|
||||||
|
<li class='tr'>guard</li>
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p> </p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<p> <ol class="man-decor man-foot man foot" /></p>
|
<p> <ol class="man-decor man-foot man foot" /></p>
|
||||||
|
|
||||||
<pre><code><li class='tl'></li>
|
<pre><code><li class='tl'></li>
|
||||||
|
@ -4,20 +4,22 @@ describe Guard::Interactor do
|
|||||||
subject { Guard::Interactor.new }
|
subject { Guard::Interactor.new }
|
||||||
|
|
||||||
describe "#initialize" do
|
describe "#initialize" do
|
||||||
it "un-lock by default" do
|
it "unlocks the interactor by default" do
|
||||||
subject.locked.should be_false
|
subject.locked.should be_false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#lock" do
|
describe "#lock" do
|
||||||
it "locks" do
|
it "locks the interactor" do
|
||||||
|
subject.start
|
||||||
subject.lock
|
subject.lock
|
||||||
subject.locked.should be_true
|
subject.locked.should be_true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#unlock" do
|
describe "#unlock" do
|
||||||
it "unlocks" do
|
it "unlocks the interactor" do
|
||||||
|
subject.start
|
||||||
subject.unlock
|
subject.unlock
|
||||||
subject.locked.should be_false
|
subject.locked.should be_false
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user