1
0
mirror of https://github.com/adobe/brackets.git synced 2024-11-20 09:53:00 +01:00

explain better

forgotten arg name in jsdoc

jsdoc comment

do a bit of renaming

remove unnecessary export

refactor FileWatcherDomain
This commit is contained in:
Martin Zagora 2016-08-23 10:51:05 +10:00
parent 9a6d16e4c8
commit be4c7c84d8
7 changed files with 112 additions and 98 deletions

View File

@ -262,7 +262,7 @@ define(function (require, exports, module) {
var impl = this._impl, var impl = this._impl,
recursiveWatch = impl.recursiveWatch, recursiveWatch = impl.recursiveWatch,
commandName = shouldWatch ? "watchPath" : "unwatchPath", commandName = shouldWatch ? "watchPath" : "unwatchPath",
ignored = watchedRoot.globFilter; filterGlobs = watchedRoot.filterGlobs;
if (recursiveWatch) { if (recursiveWatch) {
// The impl can watch the entire subtree with one call on the root (we also fall into this case for // The impl can watch the entire subtree with one call on the root (we also fall into this case for
@ -274,7 +274,7 @@ define(function (require, exports, module) {
} else { } else {
// The impl will handle finding all subdirectories to watch. // The impl will handle finding all subdirectories to watch.
this._enqueueWatchRequest(function (requestCb) { this._enqueueWatchRequest(function (requestCb) {
impl[commandName].call(impl, entry.fullPath, ignored, requestCb); impl[commandName].call(impl, entry.fullPath, filterGlobs, requestCb);
}.bind(this), callback); }.bind(this), callback);
} }
} else if (shouldWatch) { } else if (shouldWatch) {
@ -315,7 +315,7 @@ define(function (require, exports, module) {
}; };
entriesToWatch.forEach(function (entry) { entriesToWatch.forEach(function (entry) {
impl.watchPath(entry.fullPath, ignored, watchCallback); impl.watchPath(entry.fullPath, filterGlobs, watchCallback);
}); });
}); });
}, callback); }, callback);
@ -852,17 +852,17 @@ define(function (require, exports, module) {
* @param {function(string): boolean} filter - Returns true if a particular item should * @param {function(string): boolean} filter - Returns true if a particular item should
* be watched, given its name (not full path). Items that are ignored are also * be watched, given its name (not full path). Items that are ignored are also
* filtered from Directory.getContents() results within this subtree. * filtered from Directory.getContents() results within this subtree.
* @param {string} globFilter - glob compatible string definition for filtering out events * @param {Array<string>} filterGlobs - glob compatible string definitions for
* on the node side. * filtering out events on the node side.
* @param {function(?string)=} callback - A function that is called when the watch has * @param {function(?string)=} callback - A function that is called when the watch has
* completed. If the watch fails, the function will have a non-null FileSystemError * completed. If the watch fails, the function will have a non-null FileSystemError
* string parametr. * string parametr.
*/ */
FileSystem.prototype.watch = function (entry, filter, globFilter, callback) { FileSystem.prototype.watch = function (entry, filter, filterGlobs, callback) {
// make globFilter an optional argument to stay backwards compatible // make filterGlobs an optional argument to stay backwards compatible
if (typeof callback === "undefined" && typeof globFilter === "function") { if (typeof callback === "undefined" && typeof filterGlobs === "function") {
callback = globFilter; callback = filterGlobs;
globFilter = null; filterGlobs = null;
} }
var fullPath = entry.fullPath; var fullPath = entry.fullPath;
@ -891,7 +891,7 @@ define(function (require, exports, module) {
return; return;
} }
var watchedRoot = new WatchedRoot(entry, filter, globFilter); var watchedRoot = new WatchedRoot(entry, filter, filterGlobs);
this._watchedRoots[fullPath] = watchedRoot; this._watchedRoots[fullPath] = watchedRoot;

View File

@ -37,12 +37,12 @@ define(function (require, exports, module) {
* @constructor * @constructor
* @param {File|Directory} entry * @param {File|Directory} entry
* @param {function(string, string):boolean} filter * @param {function(string, string):boolean} filter
* @param {string} globFilter * @param {Array<string>} filterGlobs
*/ */
function WatchedRoot(entry, filter, globFilter) { function WatchedRoot(entry, filter, filterGlobs) {
this.entry = entry; this.entry = entry;
this.filter = filter; this.filter = filter;
this.globFilter = globFilter; this.filterGlobs = filterGlobs;
} }
// Status constants // Status constants
@ -63,7 +63,7 @@ define(function (require, exports, module) {
/** /**
* @type {string} * @type {string}
*/ */
WatchedRoot.prototype.globFilter = null; WatchedRoot.prototype.filterGlobs = null;
/** /**
* @type {number} * @type {number}

View File

@ -533,9 +533,9 @@ define(function (require, exports, module) {
/** /**
* Stop providing change notifications for the file or directory at the * Stop providing change notifications for the file or directory at the
* given path, calling back asynchronously with a possibly null FileSystemError * given path, calling back asynchronously with a possibly null FileSystemError
* string when the operation is complete. This function needs to mirror the * string when the operation is complete.
* signature of watchPath and hence the ignored argument is passed from * This function needs to mirror the signature of watchPath
* FileSystem code * because of FileSystem.prototype._watchOrUnwatchEntry implementation.
* *
* @param {string} path * @param {string} path
* @param {function(?string)=} callback * @param {function(?string)=} callback
@ -577,7 +577,7 @@ define(function (require, exports, module) {
/** /**
* Indicates whether or not recursive watching notifications are supported * Indicates whether or not recursive watching notifications are supported
* by the watchPath call. With chokidar, every platform supports recursive watching. * by the watchPath call.
* *
* @type {boolean} * @type {boolean}
*/ */

View File

@ -0,0 +1,78 @@
var fspath = require("path");
var chokidar = require('chokidar');
/**
* Transform Node's native fs.stats to a format that can be sent through domain
* @param {stats} nodeFsStats Node's fs.stats result
* @return {object} Can be consumed by new FileSystemStats(object); in Brackets
*/
function normalizeStats(nodeFsStats) {
// from shell: If "filename" is a symlink,
// realPath should be the actual path to the linked object
// not implemented in shell yet
return {
isFile: nodeFsStats.isFile(),
isDirectory: nodeFsStats.isDirectory(),
mtime: nodeFsStats.mtime,
size: nodeFsStats.size,
realPath: null,
hash: nodeFsStats.mtime.getTime()
};
}
function watchPath(path, ignored, _watcherMap) {
if (_watcherMap.hasOwnProperty(path)) {
return;
}
try {
var watcher = chokidar.watch(path, {
persistent: true,
ignoreInitial: true,
ignorePermissionErrors: true,
followSymlinks: true,
ignored: ignored,
usePolling: process.platform === "win32"
});
watcher.on("all", function (type, filename, nodeFsStats) {
var event;
switch (type) {
case "change":
event = "changed";
break;
case "add":
case "addDir":
event = "created";
break;
case "unlink":
case "unlinkDir":
event = "deleted";
break;
default:
event = null;
}
if (!event || !filename) {
return;
}
// make sure stats are normalized for domain transfer
var statsObj = nodeFsStats ? normalizeStats(nodeFsStats) : null;
// make sure it's normalized
filename = filename.replace(/\\/g, "/");
var parentDirPath = fspath.dirname(filename) + "/";
var entryName = fspath.basename(filename);
_domainManager.emitEvent("fileWatcher", "change", [event, parentDirPath, entryName, statsObj]);
});
_watcherMap[path] = watcher;
watcher.on("error", function (err) {
console.error("Error watching file " + path + ": " + (err && err.message));
unwatchPath(path);
});
} catch (err) {
console.warn("Failed to watch file " + path + ": " + (err && err.message));
}
}
exports.watchPath = watchPath;

View File

@ -25,10 +25,13 @@
"use strict"; "use strict";
var fspath = require("path");
var fs = require("fs");
var os = require("os"); var os = require("os");
var chokidar = require('chokidar'); var watcherImpl;
if (process.platform === "win32") {
watcherImpl = require("./ChokidarWatcher"); // TODO: "./CSharpWatcher"
} else {
watcherImpl = require("./ChokidarWatcher");
}
var _domainManager, var _domainManager,
_watcherMap = {}; _watcherMap = {};
@ -64,83 +67,13 @@ function unwatchPath(path) {
}); });
} }
/**
* Transform Node's native fs.stats to a format that can be sent through domain
* @param {stats} Node's fs.stats result
* @return {object} Can be consumed by new FileSystemStats(object); in Brackets
*/
function normalizeStats(nodeFsStats) {
// from shell: If "filename" is a symlink,
// realPath should be the actual path to the linked object
// not implemented in shell yet
return {
isFile: nodeFsStats.isFile(),
isDirectory: nodeFsStats.isDirectory(),
mtime: nodeFsStats.mtime,
size: nodeFsStats.size,
realPath: null,
hash: nodeFsStats.mtime.getTime()
};
}
/** /**
* Watch a file or directory. * Watch a file or directory.
* @param {string} path File or directory to watch. * @param {string} path File or directory to watch.
* @param {array} ignored List of File or directory to NOT watch. * @param {array} ignored List of entries to ignore during watching.
*/ */
function watchPath(path, ignored) { function watchPath(path, ignored) {
if (_watcherMap.hasOwnProperty(path)) { return watcherImpl.watchPath(path, ignored, _watcherMap);
return;
}
try {
var watcher = chokidar.watch(path, {
persistent: true,
ignoreInitial: true,
ignorePermissionErrors: true,
followSymlinks: true,
ignored: ignored,
usePolling: process.platform === "win32"
});
watcher.on("all", function (type, filename, nodeFsStats) {
var event;
switch (type) {
case "change":
event = "changed";
break;
case "add":
case "addDir":
event = "created";
break;
case "unlink":
case "unlinkDir":
event = "deleted";
break;
default:
event = null;
}
if (!event || !filename) {
return;
}
// make sure stats are normalized for domain transfer
var statsObj = nodeFsStats ? normalizeStats(nodeFsStats) : null;
// make sure it's normalized
filename = filename.replace(/\\/g, "/");
var parentDirPath = fspath.dirname(filename) + "/";
var entryName = fspath.basename(filename);
_domainManager.emitEvent("fileWatcher", "change", [event, parentDirPath, entryName, statsObj]);
});
_watcherMap[path] = watcher;
watcher.on("error", function (err) {
console.error("Error watching file " + path + ": " + (err && err.message));
unwatchPath(path);
});
} catch (err) {
console.warn("Failed to watch file " + path + ": " + (err && err.message));
}
} }
/** /**

View File

@ -738,7 +738,7 @@ define(function (require, exports, module) {
FileSystem.on("change", _fileSystemChange); FileSystem.on("change", _fileSystemChange);
FileSystem.on("rename", _fileSystemRename); FileSystem.on("rename", _fileSystemRename);
FileSystem.watch(FileSystem.getDirectoryForPath(rootPath), ProjectModel._shouldShowName, ProjectModel.exclusionGlob, function (err) { FileSystem.watch(FileSystem.getDirectoryForPath(rootPath), ProjectModel._shouldShowName, ProjectModel.defaultIgnoreGlobs, function (err) {
if (err === FileSystemError.TOO_MANY_ENTRIES) { if (err === FileSystemError.TOO_MANY_ENTRIES) {
if (!_projectWarnedForTooManyFiles) { if (!_projectWarnedForTooManyFiles) {
_showErrorDialog(ERR_TYPE_MAX_FILES); _showErrorDialog(ERR_TYPE_MAX_FILES);

View File

@ -63,7 +63,11 @@ define(function (require, exports, module) {
* Glob definition of files and folders that should be excluded directly * Glob definition of files and folders that should be excluded directly
* inside node domain watching with chokidar * inside node domain watching with chokidar
*/ */
var exclusionGlob = "**/(.pyc|.git|.gitmodules|.svn|.DS_Store|Thumbs.db|.hg|CVS|.hgtags|.idea|.c9revisions|.SyncArchive|.SyncID|.SyncIgnore|node_modules)"; var defaultIgnoreGlobs = [
"**/(.pyc|.git|.gitmodules|.svn|.DS_Store|Thumbs.db|.hg|CVS|.hgtags|.idea|.c9revisions|.SyncArchive|.SyncID|.SyncIgnore)",
"**/bower_components",
"**/node_modules"
];
/** /**
* @private * @private
@ -1355,12 +1359,11 @@ define(function (require, exports, module) {
exports._addWelcomeProjectPath = _addWelcomeProjectPath; exports._addWelcomeProjectPath = _addWelcomeProjectPath;
exports._isWelcomeProjectPath = _isWelcomeProjectPath; exports._isWelcomeProjectPath = _isWelcomeProjectPath;
exports._ensureTrailingSlash = _ensureTrailingSlash; exports._ensureTrailingSlash = _ensureTrailingSlash;
exports._exclusionListRegEx = _exclusionListRegEx;
exports._shouldShowName = _shouldShowName; exports._shouldShowName = _shouldShowName;
exports._invalidChars = _invalidChars; exports._invalidChars = _invalidChars;
exports.shouldShow = shouldShow; exports.shouldShow = shouldShow;
exports.exclusionGlob = exclusionGlob; exports.defaultIgnoreGlobs = defaultIgnoreGlobs;
exports.isValidFilename = isValidFilename; exports.isValidFilename = isValidFilename;
exports.EVENT_CHANGE = EVENT_CHANGE; exports.EVENT_CHANGE = EVENT_CHANGE;
exports.EVENT_SHOULD_SELECT = EVENT_SHOULD_SELECT; exports.EVENT_SHOULD_SELECT = EVENT_SHOULD_SELECT;