rerun 0.13.0 → 0.13.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +27 -14
- data/Rakefile +82 -83
- data/bin/rerun +18 -18
- data/lib/goo.rb +3 -3
- data/lib/rerun.rb +15 -15
- data/lib/rerun/notification.rb +82 -82
- data/lib/rerun/options.rb +146 -145
- data/lib/rerun/runner.rb +374 -376
- data/lib/rerun/system.rb +22 -22
- data/lib/rerun/watcher.rb +134 -131
- data/rerun.gemspec +34 -34
- metadata +6 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 12916c529d417f7435294064c61ab8bc9b3e4811e61ab162725b84dc42730212
|
4
|
+
data.tar.gz: 2d32573a380ae73f845564580eced58064271d3347a09da7c5e13ad72882a8c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3d9ed3d68053c23b3c9665abc33cde89d4fd5893fa1d9930fbcb93113459450810ced0d3d0cd7e83c2bc4dc9da27446228f1104dc2a46cdb01ef53dc8bc5f48
|
7
|
+
data.tar.gz: 1df642c255cd253271015b111f2b0fa4b9023c0fd697b1bd03405b2fccb9d716658f840a82884dfa7b042395c07664205f6427c08a9b432f8742ce58413792cd
|
data/README.md
CHANGED
@@ -20,9 +20,9 @@ Use the `--pattern` option if you want to change this.
|
|
20
20
|
As of version 0.7.0, we use the Listen gem, which tries to use your OS's
|
21
21
|
built-in facilities for monitoring the filesystem, so CPU use is very light.
|
22
22
|
|
23
|
-
**UPDATE**: Now Rerun *does* work on Windows
|
23
|
+
**UPDATE**: Now Rerun *does* work on Windows! Caveats:
|
24
24
|
* not well-tested
|
25
|
-
*
|
25
|
+
* you need to press Enter after keypress input
|
26
26
|
* you may need to install the `wdm` gem manually: `gem install wdm`
|
27
27
|
* You may see this persistent `INFO` error message; to remove it, use`--no-notify`:
|
28
28
|
* `INFO: Could not find files for the given pattern(s)`
|
@@ -57,6 +57,26 @@ On *BSD, use
|
|
57
57
|
|
58
58
|
gem install rb-kqueue
|
59
59
|
|
60
|
+
## Installation via Gemfile / Bundler
|
61
|
+
|
62
|
+
If you are using rerun inside an existing Ruby application (like a Rails or Sinatra app), you can add it to your Gemfile:
|
63
|
+
|
64
|
+
``` ruby
|
65
|
+
group :development, :test do
|
66
|
+
gem "rerun"
|
67
|
+
end
|
68
|
+
```
|
69
|
+
|
70
|
+
Using a Gemfile is also an easy way to use the pre-release branch, which may have bugfixes or features you want:
|
71
|
+
|
72
|
+
``` ruby
|
73
|
+
group :development, :test do
|
74
|
+
gem "rerun", git: "https://github.com/alexch/rerun.git"
|
75
|
+
end
|
76
|
+
```
|
77
|
+
|
78
|
+
When using a Gemfile, install with `bundle install` or `bundle update`, and run using `bundle exec rerun`, to guarantee you are using the rerun version specified in the Gemfile, and not a different version in a system-wide gemset.
|
79
|
+
|
60
80
|
# Usage:
|
61
81
|
|
62
82
|
rerun [options] [--] cmd
|
@@ -138,7 +158,7 @@ Run `rerun --help` to see the actual list.
|
|
138
158
|
`--ignore pattern` file glob to ignore (can be set many times). To ignore a directory, you must append `'/*'` e.g.
|
139
159
|
`--ignore 'coverage/*'`.
|
140
160
|
|
141
|
-
|
161
|
+
`--[no-]ignore-dotfiles` By default, on top of --pattern and --ignore, we ignore any changes to files and dirs starting with a dot. Setting `--no-ignore-dotfiles` allows you to monitor a relevant file like .env, but you may also have to explicitly --ignore more dotfiles and dotdirs.
|
142
162
|
|
143
163
|
`--signal` (or `-s`) use specified signal(s) (instead of the default `TERM,INT,KILL`) to terminate the previous process. You can use a comma-delimited list if you want to try a signal, wait up to 5 seconds for the process to die, then try again with a different signal, and so on.
|
144
164
|
This may be useful for forcing the respective process to terminate as quickly as possible.
|
@@ -242,14 +262,6 @@ If running inside a shared directory using Vagrant and VirtualBox, you must pass
|
|
242
262
|
|
243
263
|
# Troubleshooting
|
244
264
|
|
245
|
-
## Vagrant ##
|
246
|
-
|
247
|
-
Rerun will not pick up changes made to shared folders. This means that the common
|
248
|
-
method of using Vagrant for an execution environment and using the `/vagrant`
|
249
|
-
shared folder for source code will not work.
|
250
|
-
|
251
|
-
Instead, use [shotgun](https://rubygems.org/gems/shotgun).
|
252
|
-
|
253
265
|
## zsh ##
|
254
266
|
|
255
267
|
If you are using `zsh` as your shell, and you are specifying your `--pattern` as `**/*.rb`, you may face this error
|
@@ -288,13 +300,13 @@ rerun -p "**/*.rb" rake test
|
|
288
300
|
|
289
301
|
# Other projects that do similar things
|
290
302
|
|
303
|
+
* Guard: <http://github.com/guard/guard>
|
291
304
|
* Restartomatic: <http://github.com/adammck/restartomatic>
|
292
305
|
* Shotgun: <http://github.com/rtomayko/shotgun>
|
293
306
|
* Rack::Reloader middleware: <http://github.com/rack/rack/blob/5ca8f82fb59f0bf0e8fd438e8e91c5acf3d98e44/lib/rack/reloader.rb>
|
294
307
|
* The Sinatra FAQ has a discussion at <http://www.sinatrarb.com/faq.html#reloading>
|
295
308
|
* Kicker: <http://github.com/alloy/kicker/>
|
296
309
|
* Watchr: <https://github.com/mynyml/watchr>
|
297
|
-
* Guard: <http://github.com/guard/guard>
|
298
310
|
* Autotest: <https://github.com/grosser/autotest>
|
299
311
|
|
300
312
|
# Why would I use this instead of Shotgun?
|
@@ -387,6 +399,9 @@ Based upon and/or inspired by:
|
|
387
399
|
|
388
400
|
# Version History
|
389
401
|
|
402
|
+
*
|
403
|
+
* --no-ignore-dotfiles option
|
404
|
+
|
390
405
|
* v0.13.0 26 January 2018
|
391
406
|
* bugfix: pause/unpause works again (thanks Barry!)
|
392
407
|
* `.rerun` config file
|
@@ -399,8 +414,6 @@ Based upon and/or inspired by:
|
|
399
414
|
* support for Windows
|
400
415
|
* use `Kernel.spawn` instead of `fork`
|
401
416
|
* use `wdm` gem for Windows Directory Monitor
|
402
|
-
* TODO: fix `INFO` error message
|
403
|
-
* TODO: fix console input contention bug
|
404
417
|
* support for notifications on GNU/Linux using [notify-send](http://www.linuxjournal.com/content/tech-tip-get-notifications-your-scripts-notify-send) (thanks terceiro)
|
405
418
|
* fix `Gem::LoadError - terminal-notifier is not part of the bundle` [bug](https://github.com/alexch/rerun/issues/108) (thanks mattheworiordan)
|
406
419
|
|
data/Rakefile
CHANGED
@@ -1,83 +1,82 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/clean'
|
3
|
-
require 'rake/testtask'
|
4
|
-
require 'rspec/core/rake_task'
|
5
|
-
|
6
|
-
task :default => [:spec]
|
7
|
-
task :test => :spec
|
8
|
-
|
9
|
-
desc "Run all specs"
|
10
|
-
RSpec::Core::RakeTask.new('spec') do |t|
|
11
|
-
ENV['ENV'] = "test"
|
12
|
-
t.pattern = 'spec/**/*_spec.rb'
|
13
|
-
t.rspec_opts = ['--color']
|
14
|
-
end
|
15
|
-
|
16
|
-
$rubyforge_project = 'pivotalrb'
|
17
|
-
|
18
|
-
$spec =
|
19
|
-
begin
|
20
|
-
require 'rubygems/specification'
|
21
|
-
data = File.read('rerun.gemspec')
|
22
|
-
spec = nil
|
23
|
-
#Thread.new { spec = eval("$SAFE = 3\n#{data}") }.join
|
24
|
-
spec = eval data
|
25
|
-
spec
|
26
|
-
end
|
27
|
-
|
28
|
-
def package(ext='')
|
29
|
-
"pkg/#{$spec.name}-#{$spec.version}" + ext
|
30
|
-
end
|
31
|
-
|
32
|
-
desc 'Exit if git is dirty'
|
33
|
-
task :check_git do
|
34
|
-
state = `git status 2> /dev/null | tail -n1`
|
35
|
-
clean = (state =~ /working (directory|tree) clean/)
|
36
|
-
unless clean
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
--
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
sh "git
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
end
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/clean'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
task :default => [:spec]
|
7
|
+
task :test => :spec
|
8
|
+
|
9
|
+
desc "Run all specs"
|
10
|
+
RSpec::Core::RakeTask.new('spec') do |t|
|
11
|
+
ENV['ENV'] = "test"
|
12
|
+
t.pattern = 'spec/**/*_spec.rb'
|
13
|
+
t.rspec_opts = ['--color']
|
14
|
+
end
|
15
|
+
|
16
|
+
$rubyforge_project = 'pivotalrb'
|
17
|
+
|
18
|
+
$spec =
|
19
|
+
begin
|
20
|
+
require 'rubygems/specification'
|
21
|
+
data = File.read('rerun.gemspec')
|
22
|
+
spec = nil
|
23
|
+
#Thread.new { spec = eval("$SAFE = 3\n#{data}") }.join
|
24
|
+
spec = eval data
|
25
|
+
spec
|
26
|
+
end
|
27
|
+
|
28
|
+
def package(ext='')
|
29
|
+
"pkg/#{$spec.name}-#{$spec.version}" + ext
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'Exit if git is dirty'
|
33
|
+
task :check_git do
|
34
|
+
state = `git status 2> /dev/null | tail -n1`
|
35
|
+
clean = (state =~ /working (directory|tree) clean/)
|
36
|
+
unless clean
|
37
|
+
warn "can't do that on an unclean git dir"
|
38
|
+
exit 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
desc 'Build packages'
|
43
|
+
task :package => %w[.gem .tar.gz].map { |e| package(e) }
|
44
|
+
|
45
|
+
desc 'Build and install as local gem'
|
46
|
+
task :install => package('.gem') do
|
47
|
+
sh "gem install #{package('.gem')}"
|
48
|
+
end
|
49
|
+
|
50
|
+
directory 'pkg/'
|
51
|
+
CLOBBER.include('pkg')
|
52
|
+
|
53
|
+
file package('.gem') => %W[pkg/ #{$spec.name}.gemspec] + $spec.files do |f|
|
54
|
+
sh "gem build #{$spec.name}.gemspec"
|
55
|
+
mv File.basename(f.name), f.name
|
56
|
+
end
|
57
|
+
|
58
|
+
file package('.tar.gz') => %w[pkg/] + $spec.files do |f|
|
59
|
+
cmd = <<-SH
|
60
|
+
git archive \
|
61
|
+
--prefix=#{$spec.name}-#{$spec.version}/ \
|
62
|
+
--format=tar \
|
63
|
+
HEAD | gzip > #{f.name}
|
64
|
+
SH
|
65
|
+
sh cmd.gsub(/ +/, ' ')
|
66
|
+
end
|
67
|
+
|
68
|
+
desc 'Publish gem and tarball to rubyforge'
|
69
|
+
task 'release' => [:check_git, package('.gem'), package('.tar.gz')] do |t|
|
70
|
+
puts "Releasing #{$spec.version}"
|
71
|
+
sh "gem push #{package('.gem')}"
|
72
|
+
puts "Tagging and pushing"
|
73
|
+
sh "git tag v#{$spec.version}"
|
74
|
+
sh "git push && git push --tags"
|
75
|
+
end
|
76
|
+
|
77
|
+
desc 'download github issues and pull requests'
|
78
|
+
task 'github' do
|
79
|
+
%w(issues pulls).each do |type|
|
80
|
+
sh "curl -o #{type}.json https://api.github.com/repos/alexch/rerun/#{type}"
|
81
|
+
end
|
82
|
+
end
|
data/bin/rerun
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
libdir = "#{File.expand_path(File.dirname(File.dirname(__FILE__)))}/lib"
|
5
|
-
$LOAD_PATH.unshift libdir unless $LOAD_PATH.include?(libdir)
|
6
|
-
|
7
|
-
require 'rerun'
|
8
|
-
require 'optparse'
|
9
|
-
|
10
|
-
options = Rerun::Options.parse config_file: ".rerun"
|
11
|
-
|
12
|
-
if options and options[:verbose]
|
13
|
-
puts "\nrerun options:\n\t#{options}"
|
14
|
-
end
|
15
|
-
|
16
|
-
exit if options.nil? or options[:cmd].nil? or options[:cmd].empty?
|
17
|
-
|
18
|
-
Rerun::Runner.keep_running(options[:cmd], options)
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
libdir = "#{File.expand_path(File.dirname(File.dirname(__FILE__)))}/lib"
|
5
|
+
$LOAD_PATH.unshift libdir unless $LOAD_PATH.include?(libdir)
|
6
|
+
|
7
|
+
require 'rerun'
|
8
|
+
require 'optparse'
|
9
|
+
|
10
|
+
options = Rerun::Options.parse config_file: ".rerun"
|
11
|
+
|
12
|
+
if options and options[:verbose]
|
13
|
+
puts "\nrerun options:\n\t#{options}"
|
14
|
+
end
|
15
|
+
|
16
|
+
exit if options.nil? or options[:cmd].nil? or options[:cmd].empty?
|
17
|
+
|
18
|
+
Rerun::Runner.keep_running(options[:cmd], options)
|
data/lib/goo.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
goooo
|
2
|
-
goooo
|
3
|
-
goooo
|
1
|
+
goooo
|
2
|
+
goooo
|
3
|
+
goooo
|
data/lib/rerun.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
here = File.expand_path(File.dirname(__FILE__))
|
2
|
-
$: << here unless $:.include?(here)
|
3
|
-
|
4
|
-
require "listen" # pull in the Listen gem
|
5
|
-
require "rerun/options"
|
6
|
-
require "rerun/system"
|
7
|
-
require "rerun/notification"
|
8
|
-
require "rerun/runner"
|
9
|
-
require "rerun/watcher"
|
10
|
-
require "rerun/glob"
|
11
|
-
|
12
|
-
module Rerun
|
13
|
-
|
14
|
-
end
|
15
|
-
|
1
|
+
here = File.expand_path(File.dirname(__FILE__))
|
2
|
+
$: << here unless $:.include?(here)
|
3
|
+
|
4
|
+
require "listen" # pull in the Listen gem
|
5
|
+
require "rerun/options"
|
6
|
+
require "rerun/system"
|
7
|
+
require "rerun/notification"
|
8
|
+
require "rerun/runner"
|
9
|
+
require "rerun/watcher"
|
10
|
+
require "rerun/glob"
|
11
|
+
|
12
|
+
module Rerun
|
13
|
+
|
14
|
+
end
|
15
|
+
|
data/lib/rerun/notification.rb
CHANGED
@@ -1,82 +1,82 @@
|
|
1
|
-
# todo: unit tests
|
2
|
-
|
3
|
-
module Rerun
|
4
|
-
class Notification
|
5
|
-
include System
|
6
|
-
|
7
|
-
attr_reader :title, :body, :options
|
8
|
-
|
9
|
-
def initialize(title, body, options = Options::DEFAULTS.dup)
|
10
|
-
@title = title
|
11
|
-
@body = body
|
12
|
-
@options = options
|
13
|
-
end
|
14
|
-
|
15
|
-
def command
|
16
|
-
# todo: strategy or subclass
|
17
|
-
|
18
|
-
s = nil
|
19
|
-
|
20
|
-
if options[:notify] == true or options[:notify] == "growl"
|
21
|
-
if (cmd = command_named("growlnotify"))
|
22
|
-
# todo: check version of growlnotify and warn if it's too old
|
23
|
-
icon_str = ("--image \"#{icon}\"" if icon)
|
24
|
-
s = "#{cmd} -n \"#{app_name}\" -m \"#{body}\" \"#{app_name} #{title}\" #{icon_str}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
if s.nil? and options[:notify] == true or options[:notify] == "osx"
|
29
|
-
if (cmd = command_named("terminal-notifier"))
|
30
|
-
icon_str = ("-appIcon \"#{icon}\"" if icon)
|
31
|
-
s = "#{cmd} -title \"#{app_name}\" -message \"#{body}\" \"#{app_name} #{title}\" #{icon_str}"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
if s.nil? and options[:notify] == true or options[:notify] == "notify-send"
|
36
|
-
if (cmd = command_named('notify-send'))
|
37
|
-
icon_str = "--icon #{icon}" if icon
|
38
|
-
s = "#{cmd} -t 500 --hint=int:transient:1 #{icon_str} \"#{app_name}: #{title}\" \"#{body}\""
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
s
|
43
|
-
end
|
44
|
-
|
45
|
-
def command_named(name)
|
46
|
-
which_command = windows? ? 'where.exe' : 'which'
|
47
|
-
# TODO: remove 'INFO' error message
|
48
|
-
path = `#{which_command
|
49
|
-
path.empty? ? nil : path
|
50
|
-
end
|
51
|
-
|
52
|
-
def send(background = true)
|
53
|
-
return unless command
|
54
|
-
with_clean_env do
|
55
|
-
`#{command}#{" &" if background}`
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def app_name
|
60
|
-
options[:name]
|
61
|
-
end
|
62
|
-
|
63
|
-
def icon
|
64
|
-
"#{icon_dir}/rails_red_sml.png" if rails?
|
65
|
-
end
|
66
|
-
|
67
|
-
def icon_dir
|
68
|
-
here = File.expand_path(File.dirname(__FILE__))
|
69
|
-
File.expand_path("#{here}/../../icons")
|
70
|
-
end
|
71
|
-
|
72
|
-
def with_clean_env
|
73
|
-
if defined?(Bundler)
|
74
|
-
Bundler.with_clean_env do
|
75
|
-
yield
|
76
|
-
end
|
77
|
-
else
|
78
|
-
yield
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
1
|
+
# todo: unit tests
|
2
|
+
|
3
|
+
module Rerun
|
4
|
+
class Notification
|
5
|
+
include System
|
6
|
+
|
7
|
+
attr_reader :title, :body, :options
|
8
|
+
|
9
|
+
def initialize(title, body, options = Options::DEFAULTS.dup)
|
10
|
+
@title = title
|
11
|
+
@body = body
|
12
|
+
@options = options
|
13
|
+
end
|
14
|
+
|
15
|
+
def command
|
16
|
+
# todo: strategy or subclass
|
17
|
+
|
18
|
+
s = nil
|
19
|
+
|
20
|
+
if options[:notify] == true or options[:notify] == "growl"
|
21
|
+
if (cmd = command_named("growlnotify"))
|
22
|
+
# todo: check version of growlnotify and warn if it's too old
|
23
|
+
icon_str = ("--image \"#{icon}\"" if icon)
|
24
|
+
s = "#{cmd} -n \"#{app_name}\" -m \"#{body}\" \"#{app_name} #{title}\" #{icon_str}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
if s.nil? and options[:notify] == true or options[:notify] == "osx"
|
29
|
+
if (cmd = command_named("terminal-notifier"))
|
30
|
+
icon_str = ("-appIcon \"#{icon}\"" if icon)
|
31
|
+
s = "#{cmd} -title \"#{app_name}\" -message \"#{body}\" \"#{app_name} #{title}\" #{icon_str}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
if s.nil? and options[:notify] == true or options[:notify] == "notify-send"
|
36
|
+
if (cmd = command_named('notify-send'))
|
37
|
+
icon_str = "--icon #{icon}" if icon
|
38
|
+
s = "#{cmd} -t 500 --hint=int:transient:1 #{icon_str} \"#{app_name}: #{title}\" \"#{body}\""
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
s
|
43
|
+
end
|
44
|
+
|
45
|
+
def command_named(name)
|
46
|
+
which_command = windows? ? 'where.exe %{cmd}' : 'which %{cmd} 2> /dev/null'
|
47
|
+
# TODO: remove 'INFO' error message
|
48
|
+
path = `#{which_command % {cmd: name}}`.chomp
|
49
|
+
path.empty? ? nil : path
|
50
|
+
end
|
51
|
+
|
52
|
+
def send(background = true)
|
53
|
+
return unless command
|
54
|
+
with_clean_env do
|
55
|
+
`#{command}#{" &" if background}`
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def app_name
|
60
|
+
options[:name]
|
61
|
+
end
|
62
|
+
|
63
|
+
def icon
|
64
|
+
"#{icon_dir}/rails_red_sml.png" if rails?
|
65
|
+
end
|
66
|
+
|
67
|
+
def icon_dir
|
68
|
+
here = File.expand_path(File.dirname(__FILE__))
|
69
|
+
File.expand_path("#{here}/../../icons")
|
70
|
+
end
|
71
|
+
|
72
|
+
def with_clean_env
|
73
|
+
if defined?(Bundler)
|
74
|
+
Bundler.with_clean_env do
|
75
|
+
yield
|
76
|
+
end
|
77
|
+
else
|
78
|
+
yield
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|