walmartlabs/lumbar — pull request #110 by redrathnure (2013-11-19 16:48:12+00:00)
Title: Fix lumbar:watch command for win32 environment.

## Description:

There is an incorrect behavior of the “watch” command on the Windows platform. When I run the “watch” command and try to change one of the source files (e.g. one of css) it detects file changes and tries to recompile result artifact, but the new changes is not put into result. It is very similar to the https://github.com/walmartlabs/lumbar/issues/96 but for Win32.

## Some technical details:

the root cause of this behavior is in incorrect/inconsistent preparation of keys for writing and clearing cache data. There are two operation applied for “fileName” variable in “exports.resetCache()” function (fileUtil.js lines 50-60): “path.normalize()” and “exports.resolvePath()”. But only “exports.resolvePath()” is applied in “cacheRead()” function (fileUtil.js lines 14-48). This is OK for linux fs, but leads for two unequaled keys in Windows (e.g. “css/base.css” to put hash into “fileCache” and “css\\base.css” to remove data from it).

## Environment:

The https://github.com/walmartlabs/thorax-seed project was used to test this behavior.
OS: Windows 7 x64
Node version: v0.10.22
Application@0.0.1 d:\dev\src\_js\thorax-seed
├─┬ bower@0.10.0
│ ├── abbrev@1.0.4
│ ├── archy@0.0.2
│ ├── async@0.2.9
│ ├── colors@0.6.2
│ ├─┬ fstream@0.1.24
│ │ ├── graceful-fs@2.0.1
│ │ └── inherits@2.0.1
│ ├─┬ glob@3.1.21
│ │ ├── graceful-fs@1.2.3
│ │ ├── inherits@1.0.0
│ │ └─┬ minimatch@0.2.12
│ │ ├── lru-cache@2.3.1
│ │ └── sigmund@1.0.0
│ ├── hogan.js@2.0.0
│ ├── lodash@1.0.1
│ ├── mkdirp@0.3.5
│ ├── nopt@2.0.0
│ ├─┬ promptly@0.1.0
│ │ └─┬ read@1.0.5
│ │ └── mute-stream@0.0.4
│ ├─┬ rc@0.3.1
│ │ ├── deep-extend@0.2.6
│ │ ├── ini@1.1.0
│ │ └─┬ optimist@0.3.7
│ │ └── wordwrap@0.0.2
│ ├─┬ read-package-json@0.1.13
│ │ ├── graceful-fs@1.2.3
│ │ ├── lru-cache@2.0.4
│ │ ├─┬ npmlog@0.0.6
│ │ │ └── ansi@0.2.1
│ │ ├── semver@1.1.4
│ │ └── slide@1.1.5
│ ├─┬ request@2.11.4
│ │ ├─┬ form-data@0.0.3
│ │ │ ├── async@0.1.9
│ │ │ └─┬ combined-stream@0.0.3
│ │ │ └── delayed-stream@0.0.5
│ │ └── mime@1.2.7
│ ├─┬ rimraf@2.0.3
│ │ └── graceful-fs@1.1.14
│ ├── semver@2.0.11
│ ├── stable@0.1.3
│ ├─┬ tar@0.1.18
│ │ ├── block-stream@0.0.7
│ │ └── inherits@2.0.1
│ ├── tmp@0.0.21
│ ├─┬ unzip@0.1.7
│ │ ├─┬ binary@0.3.0
│ │ │ ├── buffers@0.1.1
│ │ │ └─┬ chainsaw@0.1.0
│ │ │ └── traverse@0.3.9
│ │ ├─┬ match-stream@0.0.1
│ │ │ └── buffers@0.1.1
│ │ ├─┬ pullstream@0.4.0
│ │ │ ├── over@0.0.5
│ │ │ └── slice-stream@0.0.0
│ │ ├── readable-stream@1.0.17
│ │ └── setimmediate@1.0.1
│ ├─┬ update-notifier@0.1.7
│ │ ├─┬ chalk@0.2.1
│ │ │ ├── ansi-styles@0.2.0
│ │ │ └── has-color@0.1.1
│ │ ├─┬ configstore@0.1.5
│ │ │ ├─┬ js-yaml@2.1.3
│ │ │ │ ├─┬ argparse@0.1.15
│ │ │ │ │ ├── underscore@1.4.4
│ │ │ │ │ └── underscore.string@2.3.3
│ │ │ │ └── esprima@1.0.4
│ │ │ ├── lodash@1.3.1
│ │ │ └── osenv@0.0.3
│ │ ├─┬ request@2.27.0
│ │ │ ├── aws-sign@0.3.0
│ │ │ ├── cookie-jar@0.3.0
│ │ │ ├── forever-agent@0.5.0
│ │ │ ├─┬ form-data@0.1.2
│ │ │ │ └─┬ combined-stream@0.0.4
│ │ │ │ └── delayed-stream@0.0.5
│ │ │ ├─┬ hawk@1.0.0
│ │ │ │ ├── boom@0.4.2
│ │ │ │ ├── cryptiles@0.2.2
│ │ │ │ ├── hoek@0.9.1
│ │ │ │ └── sntp@0.2.4
│ │ │ ├─┬ http-signature@0.10.0
│ │ │ │ ├── asn1@0.1.11
│ │ │ │ ├── assert-plus@0.1.2
│ │ │ │ └── ctype@0.5.2
│ │ │ ├── json-stringify-safe@5.0.0
│ │ │ ├── mime@1.2.11
│ │ │ ├── node-uuid@1.4.1
│ │ │ ├── oauth-sign@0.3.0
│ │ │ ├── qs@0.6.5
│ │ │ └── tunnel-agent@0.3.0
│ │ └── semver@2.1.0
│ └── which@1.0.5
├─┬ grunt@0.4.1
│ ├── async@0.1.22
│ ├── coffee-script@1.3.3
│ ├── colors@0.6.2
│ ├── dateformat@1.0.2-1.2.3
│ ├── eventemitter2@0.4.13
│ ├─┬ findup-sync@0.1.2
│ │ └── lodash@1.0.1
│ ├─┬ glob@3.1.21
│ │ ├── graceful-fs@1.2.3
│ │ └── inherits@1.0.0
│ ├── hooker@0.2.3
│ ├── iconv-lite@0.2.11
│ ├─┬ js-yaml@2.0.5
│ │ ├─┬ argparse@0.1.15
│ │ │ ├── underscore@1.4.4
│ │ │ └── underscore.string@2.3.3
│ │ └── esprima@1.0.4
│ ├── lodash@0.9.2
│ ├─┬ minimatch@0.2.12
│ │ ├── lru-cache@2.3.1
│ │ └── sigmund@1.0.0
│ ├─┬ nopt@1.0.10
│ │ └── abbrev@1.0.4
│ ├─┬ rimraf@2.0.3
│ │ └── graceful-fs@1.1.14
│ ├── underscore.string@2.2.1
│ └── which@1.0.5
├─┬ grunt-cli@0.1.6
│ ├─┬ findup-sync@0.1.2
│ │ ├─┬ glob@3.1.21
│ │ │ ├── graceful-fs@1.2.3
│ │ │ ├── inherits@1.0.0
│ │ │ └─┬ minimatch@0.2.12
│ │ │ ├── lru-cache@2.3.1
│ │ │ └── sigmund@1.0.0
│ │ └── lodash@1.0.1
│ └─┬ nopt@1.0.10
│ └── abbrev@1.0.4
├─┬ grunt-contrib-connect@0.1.1
│ └─┬ connect@2.4.6
│ ├── bytes@0.1.0
│ ├── cookie@0.0.4
│ ├── crc@0.2.0
│ ├── debug@0.7.4
│ ├── formidable@1.0.11
│ ├── fresh@0.1.0
│ ├── pause@0.0.1
│ ├── qs@0.5.1
│ └─┬ send@0.0.4
│ ├── mime@1.2.6
│ └── range-parser@0.0.4
├─┬ grunt-contrib-jshint@0.1.1-rc6
│ └─┬ jshint@0.9.1
│ ├─┬ cli@0.4.3
│ │ └─┬ glob@3.2.7
│ │ ├── inherits@2.0.1
│ │ └─┬ minimatch@0.2.12
│ │ ├── lru-cache@2.3.1
│ │ └── sigmund@1.0.0
│ └─┬ minimatch@0.0.5
│ └── lru-cache@1.0.6
├─┬ handlebars@1.0.12
│ ├─┬ optimist@0.3.7
│ │ └── wordwrap@0.0.2
│ └─┬ uglify-js@2.3.6
│ ├── async@0.2.9
│ └─┬ source-map@0.1.31
│ └── amdefine@0.1.0
├─┬ lumbar@2.4.1
│ ├── async@0.2.9
│ ├─┬ bower@0.9.2
│ │ ├── abbrev@1.0.4
│ │ ├── archy@0.0.2
│ │ ├── colors@0.6.2
│ │ ├─┬ fstream@0.1.24
│ │ │ ├── graceful-fs@2.0.1
│ │ │ └── inherits@2.0.1
│ │ ├─┬ glob@3.1.21
│ │ │ ├── graceful-fs@1.2.3
│ │ │ ├── inherits@1.0.0
│ │ │ └─┬ minimatch@0.2.12
│ │ │ ├── lru-cache@2.3.1
│ │ │ └── sigmund@1.0.0
│ │ ├── hogan.js@2.0.0
│ │ ├── lodash@1.0.1
│ │ ├── mkdirp@0.3.5
│ │ ├── nopt@2.0.0
│ │ ├─┬ promptly@0.1.0
│ │ │ └─┬ read@1.0.5
│ │ │ └── mute-stream@0.0.4
│ │ ├─┬ rc@0.0.8
│ │ │ ├─┬ config-chain@0.3.4
│ │ │ │ ├── ini@1.0.5
│ │ │ │ └── proto-list@1.2.2
│ │ │ └─┬ optimist@0.3.7
│ │ │ └── wordwrap@0.0.2
│ │ ├─┬ read-package-json@0.1.13
│ │ │ ├── graceful-fs@1.2.3
│ │ │ ├── lru-cache@2.0.4
│ │ │ ├─┬ npmlog@0.0.6
│ │ │ │ └── ansi@0.2.1
│ │ │ └── slide@1.1.5
│ │ ├─┬ request@2.11.4
│ │ │ ├─┬ form-data@0.0.3
│ │ │ │ ├── async@0.1.9
│ │ │ │ └─┬ combined-stream@0.0.3
│ │ │ │ └── delayed-stream@0.0.5
│ │ │ └── mime@1.2.7
│ │ ├─┬ rimraf@2.0.3
│ │ │ └── graceful-fs@1.1.14
│ │ ├── semver@1.1.4
│ │ ├── stable@0.1.3
│ │ ├─┬ tar@0.1.18
│ │ │ ├── block-stream@0.0.7
│ │ │ └── inherits@2.0.1
│ │ ├── tmp@0.0.21
│ │ ├─┬ unzip@0.1.7
│ │ │ ├─┬ binary@0.3.0
│ │ │ │ ├── buffers@0.1.1
│ │ │ │ └─┬ chainsaw@0.1.0
│ │ │ │ └── traverse@0.3.9
│ │ │ ├─┬ match-stream@0.0.1
│ │ │ │ └── buffers@0.1.1
│ │ │ ├─┬ pullstream@0.4.0
│ │ │ │ ├── over@0.0.5
│ │ │ │ └── slice-stream@0.0.0
│ │ │ ├── readable-stream@1.0.17
│ │ │ └── setimmediate@1.0.1
│ │ └─┬ update-notifier@0.1.7
│ │ ├─┬ chalk@0.2.1
│ │ │ ├── ansi-styles@0.2.0
│ │ │ └── has-color@0.1.1
│ │ ├─┬ configstore@0.1.5
│ │ │ ├─┬ js-yaml@2.1.3
│ │ │ │ └─┬ argparse@0.1.15
│ │ │ │ ├── underscore@1.4.4
│ │ │ │ └── underscore.string@2.3.3
│ │ │ ├── lodash@1.3.1
│ │ │ └── osenv@0.0.3
│ │ ├─┬ request@2.27.0
│ │ │ ├── aws-sign@0.3.0
│ │ │ ├── cookie-jar@0.3.0
│ │ │ ├── forever-agent@0.5.0
│ │ │ ├─┬ form-data@0.1.2
│ │ │ │ └─┬ combined-stream@0.0.4
│ │ │ │ └── delayed-stream@0.0.5
│ │ │ ├─┬ hawk@1.0.0
│ │ │ │ ├── boom@0.4.2
│ │ │ │ ├── cryptiles@0.2.2
│ │ │ │ ├── hoek@0.9.1
│ │ │ │ └── sntp@0.2.4
│ │ │ ├─┬ http-signature@0.10.0
│ │ │ │ ├── asn1@0.1.11
│ │ │ │ ├── assert-plus@0.1.2
│ │ │ │ └── ctype@0.5.2
│ │ │ ├── json-stringify-safe@5.0.0
│ │ │ ├── mime@1.2.11
│ │ │ ├── node-uuid@1.4.1
│ │ │ ├── oauth-sign@0.3.0
│ │ │ ├── qs@0.6.5
│ │ │ └── tunnel-agent@0.3.0
│ │ └── semver@2.1.0
│ ├─┬ cheerio@0.12.4
│ │ ├─┬ cheerio-select@0.0.3
│ │ │ └─┬ CSSselect@0.3.11
│ │ │ ├── CSSwhat@0.4.1
│ │ │ └─┬ domutils@1.2.1
│ │ │ └── domelementtype@1.1.1
│ │ ├── entities@0.3.0
│ │ ├─┬ htmlparser2@3.1.4
│ │ │ ├── domelementtype@1.1.1
│ │ │ ├── domhandler@2.0.3
│ │ │ ├── domutils@1.1.6
│ │ │ └── readable-stream@1.0.17
│ │ └── underscore@1.4.4
│ ├─┬ child-pool@1.0.0
│ │ └── underscore@1.4.4
│ ├── coffee-script@1.6.3
│ ├── esprima@1.0.4
│ ├── estraverse@1.1.2-1
│ ├── growl@1.7.0
│ ├─┬ nib@0.9.2
│ │ └─┬ stylus@0.31.0
│ │ ├── cssom@0.2.5
│ │ ├── debug@0.7.4
│ │ └── mkdirp@0.3.5
│ ├─┬ source-map@0.1.31
│ │ └── amdefine@0.1.0
│ ├─┬ stylus@0.36.1
│ │ ├── cssom@0.2.5
│ │ ├── debug@0.7.4
│ │ ├── mkdirp@0.3.5
│ │ └── sax@0.5.5
│ ├── stylus-images@1.0.3
│ ├─┬ uglify-js@2.3.6
│ │ └─┬ optimist@0.3.7
│ │ └── wordwrap@0.0.2
│ └── underscore@1.5.2
├── open@0.0.3
└─┬ thorax-inspector@0.2.4
├─┬ express@3.4.4
│ ├── buffer-crc32@0.2.1
│ ├─┬ commander@1.3.2
│ │ └── keypress@0.1.0
│ ├─┬ connect@2.11.0
│ │ ├── bytes@0.2.1
│ │ ├── methods@0.0.1
│ │ ├─┬ multiparty@2.2.0
│ │ │ ├─┬ readable-stream@1.1.9
│ │ │ │ ├── core-util-is@1.0.0
│ │ │ │ └── debuglog@0.0.2
│ │ │ └── stream-counter@0.2.0
│ │ ├── negotiator@0.3.0
│ │ ├── pause@0.0.1
│ │ ├── qs@0.6.5
│ │ ├── raw-body@0.0.3
│ │ └── uid2@0.0.3
│ ├── cookie@0.1.0
│ ├── cookie-signature@1.0.1
│ ├── debug@0.7.4
│ ├── fresh@0.2.0
│ ├── methods@0.1.0
│ ├── mkdirp@0.3.5
│ ├── range-parser@0.0.4
│ └─┬ send@0.1.4
│ └── mime@1.2.11
├─┬ livereload@0.3.0
│ └─┬ websocket.io@0.2.1
│ ├── debug@0.7.4
│ └─┬ ws@0.4.20
│ ├── commander@0.6.1
│ ├── options@0.0.5
│ └── tinycolor@0.0.1
└── underscore@1.4.2