rerun 0.2.1 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +8 -3
- data/README.md +56 -18
- data/bin/rerun +4 -0
- data/lib/osxwatcher.rb +2 -11
- data/lib/rerun.rb +25 -10
- data/lib/system.rb +26 -16
- data/rerun.gemspec +1 -1
- metadata +2 -2
data/LICENSE
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
Rerun
|
2
2
|
Copyright (c) 2009 Alex Chaffee <alex@stinky.com>
|
3
3
|
|
4
4
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
@@ -21,9 +21,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
21
21
|
---
|
22
22
|
|
23
23
|
rerun partially based on code from Rspactor
|
24
|
-
|
24
|
+
Copyright (c) 2009 Mislav Marohnić
|
25
|
+
License as above (MIT open source).
|
25
26
|
|
26
27
|
rerun partially based on code from FileSystemWatcher
|
27
28
|
http://paulhorman.com/filesystemwatcher/
|
28
|
-
|
29
|
+
No license provided; assumed public domain.
|
30
|
+
|
31
|
+
rerun partially based on code from Shotgun
|
32
|
+
Copyright (c) 2009 Ryan Tomayko <tomayko.com/about>
|
33
|
+
License as above (MIT open source).
|
29
34
|
|
data/README.md
CHANGED
@@ -5,25 +5,34 @@
|
|
5
5
|
Launches your app, then watches the filesystem. If a relevant file
|
6
6
|
changes, then it restarts your app.
|
7
7
|
|
8
|
-
Currently only *.rb files are watched
|
9
|
-
|
8
|
+
Currently only *.rb files are watched. This is pretty lame so it will
|
9
|
+
change soon.
|
10
10
|
|
11
11
|
If you're on Mac OS X, it uses the built-in facilities for monitoring
|
12
|
-
the filesystem, so CPU use is very light.
|
12
|
+
the filesystem, so CPU use is very light. And if you have "growlnotify"
|
13
|
+
available on the PATH, it sends notifications to growl in addition to
|
14
|
+
the console. Here's how to install
|
15
|
+
[growlnotify](http://growl.info/documentation/growlnotify.php):
|
13
16
|
|
14
|
-
|
15
|
-
|
17
|
+
> In your shell, cd to the directory on the Growl disk image
|
18
|
+
> containing growlnotify, and type ./install.sh. That script
|
19
|
+
> will install growlnotify to /usr/local/bin and the manpage
|
20
|
+
> to /usr/local/man.
|
21
|
+
|
22
|
+
Rerun does not work on Windows. Sorry, but you can't do much relaunching
|
23
|
+
without "fork".
|
16
24
|
|
17
25
|
# Installation:
|
18
26
|
|
19
27
|
sudo gem install rerun
|
20
28
|
|
21
|
-
|
29
|
+
If you want to use the latest version, grab it off Github:
|
22
30
|
|
23
31
|
gem sources -a http://gems.github.com/
|
24
32
|
sudo gem install alexch-rerun
|
25
33
|
|
26
|
-
|
34
|
+
I'll bump the version on Github for release candidates, and deploy to
|
35
|
+
Rubyforge only when it's had some time to bake.
|
27
36
|
|
28
37
|
# Usage:
|
29
38
|
|
@@ -35,20 +44,24 @@ app.rb:
|
|
35
44
|
rerun app.rb
|
36
45
|
|
37
46
|
Or if you're running a Rack app that's configured in config.ru
|
38
|
-
but you want
|
47
|
+
but you want it on port 4000 and in debug mode:
|
39
48
|
|
40
|
-
rerun "thin start --port=4000 -R config.ru"
|
41
|
-
|
49
|
+
rerun "thin start --debug --port=4000 -R config.ru"
|
42
50
|
|
43
51
|
# Options:
|
44
52
|
|
45
|
-
|
53
|
+
--dir directory to watch (default = ".")
|
54
|
+
|
55
|
+
Also --version and --help.
|
46
56
|
|
47
57
|
# To Do:
|
48
58
|
|
59
|
+
* If the cmd is, or starts with, a ".rb" file, then run it with ruby
|
60
|
+
* Watch arbitrary file types via globbing
|
49
61
|
* Allow arbitrary sets of directories and file types, possibly with "include" and "exclude" sets
|
50
62
|
* ".rerun" file to specify options per project or in $HOME.
|
51
|
-
* Test on
|
63
|
+
* Test on Linux.
|
64
|
+
* Test on Mac without Growlnotify.
|
52
65
|
|
53
66
|
# Other projects that do similar things
|
54
67
|
|
@@ -56,6 +69,10 @@ Restartomatic: <http://github.com/adammck/restartomatic>
|
|
56
69
|
|
57
70
|
Shotgun: <http://github.com/rtomayko/shotgun>
|
58
71
|
|
72
|
+
Rack::Reloader middleware: <http://github.com/rack/rack/blob/5ca8f82fb59f0bf0e8fd438e8e91c5acf3d98e44/lib/rack/reloader.rb>
|
73
|
+
|
74
|
+
and the Sinatra FAQ has a discussion at <http://www.sinatrarb.com/faq.html#reloading>
|
75
|
+
|
59
76
|
# Why would I use this instead of Shotgun?
|
60
77
|
|
61
78
|
Shotgun does a "fork" after the web framework has loaded but before
|
@@ -78,14 +95,30 @@ server so this doesn't affect them too much.
|
|
78
95
|
|
79
96
|
YMMV!
|
80
97
|
|
98
|
+
# Why would I use this instead of Rack::Reloader?
|
99
|
+
|
100
|
+
Rack::Reloader is certifiably beautiful code, and is a very elegant use
|
101
|
+
of Rack's middleware architecture. But because it relies on the
|
102
|
+
LOADED_FEATURES variable, it only reloads .rb files that were 'require'd,
|
103
|
+
not 'load'ed. That leaves out (non-Erector) template files, and also,
|
104
|
+
the way I was doing it, sub-actions (see
|
105
|
+
[this thread](http://groups.google.com/group/sinatrarb/browse_thread/thread/7329727a9296e96a#
|
106
|
+
)).
|
107
|
+
|
108
|
+
Rack::Reloader also doesn't reload configuration changes or redo other
|
109
|
+
things that happen during app startup. Rerun takes the attitude that if
|
110
|
+
you want to restart an app, you should just restart the whole app. You know?
|
111
|
+
|
81
112
|
# Why did you write this?
|
82
113
|
|
83
|
-
I've been using [Sinatra](http://sinatrarb.com) and loving it. In
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
I still wanted automatic reloading during
|
88
|
-
working for me (see above) so I spliced
|
114
|
+
I've been using [Sinatra](http://sinatrarb.com) and loving it. In order
|
115
|
+
to simplify their system, the Rat Pack just removed auto-reloading from
|
116
|
+
Sinatra proper. I approve of this: a web application framework should be
|
117
|
+
focused on serving requests, not on munging Ruby ObjectSpace for
|
118
|
+
dev-time convenience. But I still wanted automatic reloading during
|
119
|
+
development. Shotgun wasn't working for me (see above) so I spliced
|
120
|
+
Rerun together out of code from Rspactor, FileSystemWatcher, and Shotgun
|
121
|
+
-- with a heavy amount of refactoring and rewriting.
|
89
122
|
|
90
123
|
# Credits
|
91
124
|
|
@@ -96,9 +129,14 @@ Based upon and/or inspired by:
|
|
96
129
|
Shotgun: <http://github.com/rtomayko/shotgun>
|
97
130
|
|
98
131
|
Rspactor: <http://github.com/mislav/rspactor>
|
132
|
+
(In turn based on http://rails.aizatto.com/2007/11/28/taming-the-autotest-beast-with-fsevents/ )
|
99
133
|
|
100
134
|
FileSystemWatcher: <http://paulhorman.com/filesystemwatcher/>
|
101
135
|
|
136
|
+
Patches by:
|
137
|
+
|
138
|
+
David Billskog <billskog@gmail.com>
|
139
|
+
|
102
140
|
# License
|
103
141
|
|
104
142
|
Open Source MIT License. See "LICENSE" file.
|
data/bin/rerun
CHANGED
@@ -20,6 +20,10 @@ opts = OptionParser.new("", 24, ' ') { |opts|
|
|
20
20
|
opts.separator ""
|
21
21
|
opts.separator "Options:"
|
22
22
|
|
23
|
+
opts.on("-d dir", "--dir dir", "directory to watch") do |dir|
|
24
|
+
options[:dir] = dir
|
25
|
+
end
|
26
|
+
|
23
27
|
opts.on_tail("-h", "--help", "--usage", "show this message") do
|
24
28
|
puts opts
|
25
29
|
exit
|
data/lib/osxwatcher.rb
CHANGED
@@ -1,17 +1,8 @@
|
|
1
1
|
require "system"
|
2
2
|
require "watcher"
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
OSX.require_framework '/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework'
|
7
|
-
rescue MissingSourceFile
|
8
|
-
# this is to not fail when running on a non-Mac
|
9
|
-
end
|
10
|
-
|
11
|
-
# stolen from RSpactor, http://github.com/mislav/rspactor
|
12
|
-
# based on http://rails.aizatto.com/2007/11/28/taming-the-autotest-beast-with-fsevents/
|
13
|
-
|
14
|
-
#TODO: make it notice deleted files
|
4
|
+
#TODO: make it notice deleted files natively, rather than passing to 'examine'
|
5
|
+
#TODO: use http://github.com/spicycode/fsevent
|
15
6
|
require "watcher"
|
16
7
|
module Rerun
|
17
8
|
class OSXWatcher < Rerun::Watcher
|
data/lib/rerun.rb
CHANGED
@@ -3,7 +3,7 @@ require "watcher"
|
|
3
3
|
require "osxwatcher"
|
4
4
|
require "fswatcher"
|
5
5
|
|
6
|
-
# todo: make this
|
6
|
+
# todo: make sure this works in non-Mac environments (also Macs without growlnotify)
|
7
7
|
module Rerun
|
8
8
|
class Runner
|
9
9
|
|
@@ -20,7 +20,15 @@ module Rerun
|
|
20
20
|
@restarting = false
|
21
21
|
end
|
22
22
|
|
23
|
+
def dir
|
24
|
+
@options[:dir] || "."
|
25
|
+
end
|
26
|
+
|
23
27
|
def start
|
28
|
+
if windows?
|
29
|
+
raise "Sorry, Rerun does not work on Windows."
|
30
|
+
end
|
31
|
+
|
24
32
|
if (!@already_running)
|
25
33
|
taglines = [
|
26
34
|
"To infinity... and beyond!",
|
@@ -37,13 +45,20 @@ module Rerun
|
|
37
45
|
end
|
38
46
|
|
39
47
|
@pid = Kernel.fork do
|
40
|
-
|
41
|
-
|
48
|
+
begin
|
49
|
+
# Signal.trap("INT") { exit }
|
50
|
+
exec(@run_command)
|
51
|
+
rescue => e
|
52
|
+
puts e
|
53
|
+
exit
|
54
|
+
end
|
42
55
|
end
|
56
|
+
Process.detach(@pid) # so if the child exits, it dies
|
43
57
|
|
44
|
-
Signal.trap("INT")
|
45
|
-
|
46
|
-
|
58
|
+
Signal.trap("INT") do # INT = control-C
|
59
|
+
stop # first stop the child
|
60
|
+
exit
|
61
|
+
end
|
47
62
|
|
48
63
|
begin
|
49
64
|
sleep 2
|
@@ -59,16 +74,16 @@ module Rerun
|
|
59
74
|
end
|
60
75
|
|
61
76
|
unless @watcher
|
62
|
-
watcher_class =
|
77
|
+
watcher_class = mac? ? OSXWatcher : FSWatcher
|
63
78
|
# watcher_class = FSWatcher
|
64
79
|
|
65
80
|
watcher = watcher_class.new do
|
66
81
|
restart unless @restarting
|
67
82
|
end
|
68
|
-
|
83
|
+
puts "Watching #{dir}"
|
84
|
+
watcher.add_directory(dir, "**/*.rb")
|
69
85
|
watcher.sleep_time = 1
|
70
86
|
watcher.start
|
71
|
-
|
72
87
|
@watcher = watcher
|
73
88
|
end
|
74
89
|
|
@@ -110,7 +125,7 @@ module Rerun
|
|
110
125
|
end
|
111
126
|
|
112
127
|
def notify(title, body)
|
113
|
-
growl title, body
|
128
|
+
growl title, body
|
114
129
|
puts
|
115
130
|
puts "#{Time.now.strftime("%T")} - #{app_name} #{title}"
|
116
131
|
end
|
data/lib/system.rb
CHANGED
@@ -1,22 +1,30 @@
|
|
1
|
+
def mac?
|
2
|
+
RUBY_PLATFORM =~ /darwin/i && !$osx_foundation_failed_to_load
|
3
|
+
end
|
4
|
+
|
5
|
+
def windows?
|
6
|
+
RUBY_PLATFORM =~ /mswin/i
|
7
|
+
end
|
1
8
|
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
+
def linux?
|
10
|
+
RUBY_PLATFORM =~ /linux/i
|
11
|
+
end
|
12
|
+
|
13
|
+
if mac?
|
14
|
+
begin
|
15
|
+
require 'osx/foundation'
|
16
|
+
OSX.require_framework '/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework'
|
17
|
+
rescue LoadError
|
18
|
+
$osx_foundation_failed_to_load = true
|
19
|
+
end
|
9
20
|
end
|
10
21
|
|
11
22
|
module Rerun
|
12
23
|
module System
|
13
|
-
|
14
|
-
$osx
|
15
|
-
end
|
16
|
-
|
24
|
+
|
17
25
|
# do we have growl or not?
|
18
|
-
def
|
19
|
-
growlcmd != ""
|
26
|
+
def growl?
|
27
|
+
mac? && (growlcmd != "")
|
20
28
|
end
|
21
29
|
|
22
30
|
def growlcmd
|
@@ -29,9 +37,11 @@ module Rerun
|
|
29
37
|
end
|
30
38
|
|
31
39
|
def growl(title, body, background = true)
|
32
|
-
|
33
|
-
|
34
|
-
|
40
|
+
if growl?
|
41
|
+
s = "#{growlcmd} -n \"#{app_name}\" -m \"#{body}\" \"#{app_name} #{title}\""
|
42
|
+
s += " &" if background
|
43
|
+
`#{s}`
|
44
|
+
end
|
35
45
|
end
|
36
46
|
|
37
47
|
end
|
data/rerun.gemspec
CHANGED
@@ -3,7 +3,7 @@ $spec = Gem::Specification.new do |s|
|
|
3
3
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
4
4
|
|
5
5
|
s.name = 'rerun'
|
6
|
-
s.version = '0.
|
6
|
+
s.version = '0.4'
|
7
7
|
s.date = '2009-06-16'
|
8
8
|
|
9
9
|
s.description = "Restarts your app when a file changes"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rerun
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: "0.4"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Chaffee
|
@@ -56,7 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
56
56
|
requirements: []
|
57
57
|
|
58
58
|
rubyforge_project: pivotalrb
|
59
|
-
rubygems_version: 1.3.
|
59
|
+
rubygems_version: 1.3.5
|
60
60
|
signing_key:
|
61
61
|
specification_version: 2
|
62
62
|
summary: Launches an app, and restarts it whenever the filesystem changes.
|