filewatcher 0.3.6 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 822dcac9d604c0ba52d968e3bf92df44da1e1512
4
- data.tar.gz: 6851bd0744d58eb1a9150c35fb27ace77f261793
3
+ metadata.gz: 2fb39cdddc7a64525396dac78226807bb53e450a
4
+ data.tar.gz: 641cea3ede6d8d1eb20fe7a0b8aa5ad75e86d75e
5
5
  SHA512:
6
- metadata.gz: 173d5fc6f40ef6180110bf21169ab6b59f6f40a78cecad86bef0a21541e218febca5f13ed57247f4b0eb84ac08f1cbd2bbac89f6a4a25e61e9378e4f5ac70d21
7
- data.tar.gz: 32a2ac8c557f68880771eb6423be097fca08b8eff914812361de881a3fe7f19342f2afc9e81f1051fe7d60c00825279405f81d9494ca2854c804654f860008f7
6
+ metadata.gz: 728a408d87cfb6be8eb5556f31bc74972645275d0bb0c3c9a1045a9d4287e1aa3ff4f5a15fb46dfa14953e837ed2b38cdcfc8ad8e34e380b6f2980a9cebbc932
7
+ data.tar.gz: bad167aae4d3e3e7fe9848ea7295f1a0fd71e4984480f35765ee869814eeee8555f0fe705b5b61a33c7dc4cc8fd95d3e6bbce6410935e3c0c22b3233effcc950
data/README.md CHANGED
@@ -8,6 +8,19 @@ Filewatcher
8
8
 
9
9
  Lightweight filewatcher weighing less than 200 LoC. No dependencies or platform specific code.
10
10
  Works everywhere. Monitors changes in the filesystem by polling. No config files needed to run.
11
+ When running filewatcher from the command line, you specify which files to monitor and what action
12
+ to perform on updates.
13
+
14
+ Search recursively for javascript files and run jshint when a file is updated, added,
15
+ renamed or deleted:
16
+
17
+ Linux/OSX:
18
+
19
+ $ filewatcher '**/*.js' 'jshint $FILENAME'
20
+
21
+ In Windows:
22
+
23
+ > filewatcher "**/*.js" "jshint %FILENAME%"
11
24
 
12
25
  Install
13
26
  -------
@@ -20,10 +33,10 @@ Command line utility
20
33
  --------------------
21
34
 
22
35
  Filewatcher scans the filesystem and execute shell commands when files are
23
- changed.
36
+ updated, added, renamed or deleted.
24
37
 
25
38
  Usage:
26
- filewatcher [-i interval] "<filename>" "<shell command>"
39
+ filewatcher [-i interval][-l] "<filename>" "<shell command>"
27
40
 
28
41
  Where
29
42
  filename: filename(s) to scan.
@@ -47,13 +60,13 @@ In Linux/OSX:
47
60
 
48
61
  Place filenames or filenames in quotes to use ruby filename globbing instead
49
62
  of shell filename globbing. This will make filewatcher look for files in
50
- subdirectories too.
63
+ subdirectories too. To watch all javascript files in subdirectories:
51
64
 
52
- > filewatcher "*.js" "node %FILENAME%"
65
+ > filewatcher "**/*.js" "node %FILENAME%"
53
66
 
54
67
  In Linux/OSX:
55
68
 
56
- > filewatcher '*.js' 'node $FILENAME'
69
+ > filewatcher '**/*.js' 'node $FILENAME'
57
70
 
58
71
  Try to run the updated file as a script when it is updated by using the
59
72
  --exec/-e option. Works with files with file extensions that looks like a
@@ -71,6 +84,13 @@ filesystem gets updated:
71
84
 
72
85
  $ filewatcher "src test" "ruby test/test_suite.rb"
73
86
 
87
+ Automatic restart of processes
88
+ ------------------------------
89
+
90
+ The `--restart` option restarts the command when changes happens on the file system. The `--dontwait` starts the command when filewatcher is started. To start a webserver and have it automatically restart when html files are updated:
91
+
92
+ $ filewatcher --dontwait --restart "*.html" "python -m SimpleHTTPServer"
93
+
74
94
  Available enviroment variables
75
95
  ------------------------------
76
96
 
@@ -101,7 +121,7 @@ Watch a list of files and directories:
101
121
  require 'filewatcher'
102
122
 
103
123
  FileWatcher.new(["lib/", "Rakefile"]).watch do |filename|
104
- puts "Updated " + filename
124
+ puts "Changed " + filename
105
125
  end
106
126
 
107
127
  Watch a single directory, for changes in all files and subdirectories:
@@ -142,6 +162,8 @@ To detect if a file is updated, added or deleted:
142
162
  end
143
163
  end
144
164
 
165
+ When a file is renamed it is detected as a deletion and a file addition.
166
+
145
167
  To check for changes more often than the default once every second:
146
168
 
147
169
  FileWatcher.new(["README.rdoc"]).watch(0.5) do |filename|
@@ -172,14 +194,14 @@ with no dependencies.
172
194
 
173
195
  Credits
174
196
  -------
197
+ This project would not be where it is today without the generous help provided by people reporting issues and these contributors:
175
198
 
176
- Support for absolute and globbed paths by flbulgarelli: https://github.com/flbulgarelli
177
199
 
178
- Code inspired by Tom Lieber's blogg posting: http://alltom.com/pages/detecting-file-changes-with-ruby
200
+ * Support for absolute and globbed paths by Franco Leonardo Bulgarelli: https://github.com/flbulgarelli
179
201
 
180
- Find method by c00lrguy: http://snippets.dzone.com/posts/show/5457
202
+ * Command line globbing by Kristoffer Roupé https://github.com/kitofr
181
203
 
182
- Globbing by Kristoffer Roupé https://github.com/kitofr
204
+ This gem was initially inspired by Tom Lieber's blogg posting: http://alltom.com/pages/detecting-file-changes-with-ruby
183
205
 
184
206
  Note on Patches/Pull Requests
185
207
  -----------------------------
@@ -194,4 +216,4 @@ Note on Patches/Pull Requests
194
216
  Copyright
195
217
  ---------
196
218
 
197
- Copyright (c) 2011 - 2014 Thomas Flemming. See LICENSE for details.
219
+ Copyright (c) 2011 - 2015 Thomas Flemming. See LICENSE for details.
data/Rakefile CHANGED
@@ -3,6 +3,8 @@ require 'rake'
3
3
  require 'rake/testtask'
4
4
 
5
5
  task :default => :test
6
+
7
+ desc "Run tests"
6
8
  task :test do
7
9
  sh "bacon -Ilib -Itest --automatic --quiet"
8
10
  end
data/bin/filewatcher CHANGED
@@ -3,9 +3,10 @@ require 'rubygems'
3
3
  require 'filewatcher'
4
4
  require 'trollop'
5
5
  require 'pathname'
6
+ require 'thread'
6
7
 
7
8
  options = Trollop::options do
8
- version "filewatcher, version #{FileWatcher.VERSION} by Thomas Flemming 2014"
9
+ version "filewatcher, version #{FileWatcher.VERSION} by Thomas Flemming 2015"
9
10
  banner <<-EOS
10
11
  Filewatcher scans the filesystem and executes shell commands when files changes.
11
12
 
@@ -22,11 +23,13 @@ Examples:
22
23
  Options:
23
24
  EOS
24
25
 
25
- opt :interval, "Interval to scan filesystem. Defaults to 0.5 seconds.", :short => 'i', :type => :float, :default => 0.5
26
+ opt :dontwait, "Do not wait for filesystem updates before running", :short => 'd', :type => :boolean, :default => false
27
+ opt :restart, "Restart process when filesystem is updated", :short => 'r', :type => :boolean, :default => false
28
+ opt :list, "Print name of files being watched"
26
29
  opt :exec, "Execute file as a script when file is updated.", :short => 'e', :type => :boolean, :default => false
27
30
  opt :include, "Include files", :type => :string, :default => "*"
28
31
  opt :exclude, "Exclude file(s) matching", :type => :string, :default => ""
29
- opt :list, "Print name of files being watched"
32
+ opt :interval, "Interval to scan filesystem. Defaults to 0.5 seconds.", :short => 'i', :type => :float, :default => 0.5
30
33
  end
31
34
 
32
35
  Trollop::die "must have at least one argument" if(ARGV.size == 0)
@@ -56,7 +59,45 @@ end
56
59
 
57
60
  files = split_files_void_escaped_whitespace(files)
58
61
 
59
- FileWatcher.new(files, options[:list]).watch(options[:interval]) do |filename, event|
62
+ def fork_process(env, cmd)
63
+ pipe_read, pipe_write = IO.pipe
64
+ fork do
65
+ pipe_read.close
66
+ pipe_write.write Process.spawn(env,cmd).to_s
67
+ exit
68
+ end
69
+
70
+ Kernel.sleep 1
71
+ pipe_write.close
72
+ child_pid = pipe_read.read.to_i
73
+ pipe_read.close
74
+ return child_pid
75
+ end
76
+
77
+ def kill_process(child_pid)
78
+ still_running = true
79
+ begin
80
+ Process.kill(1, child_pid)
81
+ rescue Errno::ESRCH
82
+ still_running = false
83
+ end
84
+ while still_running do
85
+ begin
86
+ Process.getpgid( child_pid)
87
+ still_running = true
88
+ rescue Errno::ESRCH
89
+ still_running = false
90
+ end
91
+ Kernel.sleep 0.1
92
+ end
93
+ end
94
+
95
+ if(options[:restart])
96
+ rd, wr = IO.pipe
97
+ child_pid = nil
98
+ end
99
+
100
+ FileWatcher.new(files, options[:list], options[:dontwait]).watch(options[:interval]) do |filename, event|
60
101
  cmd = nil
61
102
  if(options[:exec] and File.exist?(filename))
62
103
  extension = filename[/(\.[^\.]*)$/,0]
@@ -91,8 +132,23 @@ FileWatcher.new(files, options[:list]).watch(options[:interval]) do |filename, e
91
132
  if(event != :delete)
92
133
  ENV['FILEPATH'] = path.realpath.to_s
93
134
  end
94
- pid = Process.spawn(env, cmd);
95
- pid = Process.wait();
135
+
136
+ if(options[:restart])
137
+ if(child_pid == nil)
138
+ child_pid = fork_process(env, cmd)
139
+ else
140
+ kill_process(child_pid)
141
+ child_pid = fork_process(env, cmd)
142
+ end
143
+ else
144
+ begin
145
+ pid = Process.spawn(env, cmd)
146
+ Process.wait()
147
+ rescue SystemExit, Interrupt
148
+ exit(0)
149
+ end
150
+ end
151
+
96
152
  else
97
153
  case(event)
98
154
  when :changed
data/lib/filewatcher.rb CHANGED
@@ -6,14 +6,14 @@ class FileWatcher
6
6
  attr_accessor :filenames
7
7
 
8
8
  def self.VERSION
9
- return '0.3.6'
9
+ return '0.4.0'
10
10
  end
11
11
 
12
- def initialize(unexpanded_filenames, print_filelist=false)
12
+ def initialize(unexpanded_filenames, print_filelist=false, dontwait=false)
13
13
  @unexpanded_filenames = unexpanded_filenames
14
14
  @last_mtimes = { }
15
15
  @filenames = expand_directories(@unexpanded_filenames)
16
-
16
+ @dontwait = dontwait
17
17
  puts 'Watching:' if print_filelist
18
18
  @filenames.each do |filename|
19
19
  raise 'File does not exist' unless File.exist?(filename)
@@ -23,6 +23,9 @@ class FileWatcher
23
23
  end
24
24
 
25
25
  def watch(sleep=1, &on_update)
26
+ if(@dontwait)
27
+ yield '',''
28
+ end
26
29
  loop do
27
30
  begin
28
31
  Kernel.sleep sleep until filesystem_updated?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: filewatcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Flemming
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-30 00:00:00.000000000 Z
11
+ date: 2015-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: trollop