summaryrefslogtreecommitdiff
path: root/node_modules/forever/node_modules/watch/main.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/forever/node_modules/watch/main.js')
-rw-r--r--node_modules/forever/node_modules/watch/main.js121
1 files changed, 121 insertions, 0 deletions
diff --git a/node_modules/forever/node_modules/watch/main.js b/node_modules/forever/node_modules/watch/main.js
new file mode 100644
index 0000000..9752f85
--- /dev/null
+++ b/node_modules/forever/node_modules/watch/main.js
@@ -0,0 +1,121 @@
+// Copyright 2010-2011 Mikeal Rogers
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+var sys = require('util')
+ , fs = require('fs')
+ , path = require('path')
+ , events = require('events')
+ ;
+
+function walk (dir, options, callback) {
+ if (!callback) {callback = options; options = {}}
+ if (!callback.files) callback.files = {};
+ if (!callback.pending) callback.pending = 0;
+ callback.pending += 1;
+ fs.stat(dir, function (err, stat) {
+ if (err) return callback(err);
+ callback.files[dir] = stat;
+ fs.readdir(dir, function (err, files) {
+ if (err) return callback(err);
+ callback.pending -= 1;
+ files.forEach(function (f, index) {
+ f = path.join(dir, f);
+ callback.pending += 1;
+ fs.stat(f, function (err, stat) {
+ var enoent = false
+ , done = false;
+
+ if (err) {
+ if (err.code !== 'ENOENT') {
+ return callback(err);
+ } else {
+ enoent = true;
+ }
+ }
+ callback.pending -= 1;
+ done = callback.pending === 0;
+ if (!enoent) {
+ if (options.ignoreDotFiles && path.basename(f)[0] === '.') return done && callback(null, callback.files);
+ if (options.filter && options.filter(f, stat)) return done && callback(null, callback.files);
+ callback.files[f] = stat;
+ if (stat.isDirectory()) walk(f, options, callback);
+ if (done) callback(null, callback.files);
+ }
+ })
+ })
+ if (callback.pending === 0) callback(null, callback.files);
+ })
+ if (callback.pending === 0) callback(null, callback.files);
+ })
+
+}
+exports.watchTree = function ( root, options, callback ) {
+ if (!callback) {callback = options; options = {}}
+ walk(root, options, function (err, files) {
+ if (err) throw err;
+ var fileWatcher = function (f) {
+ fs.watchFile(f, options, function (c, p) {
+ // Check if anything actually changed in stat
+ if (files[f] && !files[f].isDirectory() && c.nlink !== 0 && files[f].mtime.getTime() == c.mtime.getTime()) return;
+ files[f] = c;
+ if (!files[f].isDirectory()) callback(f, c, p);
+ else {
+ fs.readdir(f, function (err, nfiles) {
+ if (err) return;
+ nfiles.forEach(function (b) {
+ var file = path.join(f, b);
+ if (!files[file] && (options.ignoreDotFiles !== true || b[0] != '.')) {
+ fs.stat(file, function (err, stat) {
+ callback(file, stat, null);
+ files[file] = stat;
+ fileWatcher(file);
+ })
+ }
+ })
+ })
+ }
+ if (c.nlink === 0) {
+ // unwatch removed files.
+ delete files[f]
+ fs.unwatchFile(f);
+ }
+ })
+ }
+ fileWatcher(root);
+ for (var i in files) {
+ fileWatcher(i);
+ }
+ callback(files, null, null);
+ })
+}
+
+exports.createMonitor = function (root, options, cb) {
+ if (!cb) {cb = options; options = {}}
+ var monitor = new events.EventEmitter();
+ exports.watchTree(root, options, function (f, curr, prev) {
+ if (typeof f == "object" && prev == null && curr === null) {
+ monitor.files = f;
+ return cb(monitor);
+ }
+ if (prev === null) {
+ return monitor.emit("created", f, curr);
+ }
+ if (curr.nlink === 0) {
+ return monitor.emit("removed", f, curr);
+ }
+ monitor.emit("changed", f, curr, prev);
+ })
+}
+
+exports.walk = walk;