Should fix #8988 and #8942. Now that #8866 is the default behavior, it can take up to 5000ms for changes to files modified during the build process to be noticed. Before #8866, when we called e.g. files.writeFile(path), a native file watcher would notice the change immediately, almost always before the build process read the file again. This was definitely racy, but we were getting away with it consistently... until #8866. I was able to reproduce the problem in #8988 by running echo some-local-package-name >> .meteor/packages in an app with a local package of the given name. After debugging the endless rebuild cycle, I found that .meteor/versions was being rewritten by files.writeFile during the build process, but the file watching system was not noticing the change in time to prevent watch.isUpToDate from returning true. The change was finally detected when restarting the Watcher responsible for .meteor/versions, which of course triggered another rebuild, so the same problem kept happening again and again.
This folder contains modules that help communicating with the file-system.
files vs fs and files.path* vs path
Since the Meteor tool was originally written to work on Mac OS X and Linux but
now is also required to work on Windows, there has been a decision to abstract
the file-system calls to fs and path modules and make them go through the
files.js lib.
All path and files manipulations in the tools code assumes it is running in a
unixy environment, where the path separator is / and the default line-break
symbol is \n; calls like rename and unlink are atomic and the file-system
always works as you expect.
The files.js file tries its best to simulate this behavior on Windows,
converting slashes, file contents and running FS operations in a
"try/sleep/repeat" loop when an EBUSY error is returned. Operations on Windows
happen to be slower, especially moving folders and symlinking (which is done by
copying the directory instead).
It is advised to use files.readFile and others instead of
fs.readFileSync. The methods are Fiberized and are converted on Windows.
Also files.pathJoin instead of path.join and others to properly preserve the
unixy feel of paths: /C/Users/IEUser/AppData/Local instead of
C:\Users\IEUser\AppData\Local.
mini-files
Some code is shared between the tool libs (this folder) and the code that gets
copied to a built bundle (boot.js). The shared code is stored in
mini-files.js.
File watching
Since node.js doesn't ship a stable library to watch a folder on all file-systems, a wrapper is used. The wrapper checks if the native functionality works, if not (while on Windows, or a virtualized shared file-system like in VirtualBox), polling is used.
Watchset
A specific data-structure that is a set of files and directories paths observed by the file-watcher.