From d8850c2c77f84ca46b21afd2152e0d99cee56804 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 10 Sep 2013 16:19:26 -0700 Subject: [PATCH] Use cachedContents when checking for an update. Without this change, we would never get the initial file's change without calling .read() first --- spec/file-spec.coffee | 198 ++++++++++++++++++++++-------------------- src/file.coffee | 2 +- 2 files changed, 106 insertions(+), 94 deletions(-) diff --git a/spec/file-spec.coffee b/spec/file-spec.coffee index 6afe60862..4dd30c982 100644 --- a/spec/file-spec.coffee +++ b/spec/file-spec.coffee @@ -10,112 +10,124 @@ describe 'File', -> fsUtils.remove(filePath) if fsUtils.exists(filePath) fsUtils.writeSync(filePath, "this is old!") file = new File(filePath) - file.read() afterEach -> file.off() fsUtils.remove(filePath) if fsUtils.exists(filePath) - describe "when the contents of the file change", -> - it "triggers 'contents-changed' event handlers", -> - changeHandler = null - changeHandler = jasmine.createSpy('changeHandler') - file.on 'contents-changed', changeHandler - fsUtils.writeSync(file.getPath(), "this is new!") - - waitsFor "change event", -> - changeHandler.callCount > 0 - - runs -> - changeHandler.reset() - fsUtils.writeSync(file.getPath(), "this is newer!") - - waitsFor "second change event", -> - changeHandler.callCount > 0 - - describe "when the file is removed", -> - it "triggers 'remove' event handlers", -> - removeHandler = null - removeHandler = jasmine.createSpy('removeHandler') - file.on 'removed', removeHandler - fsUtils.remove(file.getPath()) - - waitsFor "remove event", -> - removeHandler.callCount > 0 - - describe "when a file is moved (via the filesystem)", -> - newPath = null - - beforeEach -> - newPath = path.join(path.dirname(filePath), "atom-file-was-moved-test.txt") - - afterEach -> - if fsUtils.exists(newPath) - fsUtils.remove(newPath) - waitsFor "remove event", (done) -> file.on 'removed', done - - it "it updates its path", -> - jasmine.unspy(window, "setTimeout") - moveHandler = null - moveHandler = jasmine.createSpy('moveHandler') - file.on 'moved', moveHandler - - fsUtils.move(filePath, newPath) - - waitsFor "move event", -> - moveHandler.callCount > 0 - - runs -> - expect(file.getPath()).toBe newPath - - it "maintains 'contents-changed' events set on previous path", -> - jasmine.unspy(window, "setTimeout") - moveHandler = null - moveHandler = jasmine.createSpy('moveHandler') - file.on 'moved', moveHandler - changeHandler = null - changeHandler = jasmine.createSpy('changeHandler') - file.on 'contents-changed', changeHandler - - fsUtils.move(filePath, newPath) - - waitsFor "move event", -> - moveHandler.callCount > 0 - - runs -> - expect(changeHandler).not.toHaveBeenCalled() + describe "when the file has not been read", -> + describe "when the contents of the file change", -> + it "triggers 'contents-changed' event handlers", -> + file.on 'contents-changed', changeHandler = jasmine.createSpy('changeHandler') fsUtils.writeSync(file.getPath(), "this is new!") - waitsFor "change event", -> - changeHandler.callCount > 0 + waitsFor "change event", -> + changeHandler.callCount > 0 - describe "when a file is deleted and the recreated within a small amount of time (git sometimes does this)", -> - it "triggers a contents change event if the contents change", -> - jasmine.unspy(File.prototype, 'detectResurrectionAfterDelay') - jasmine.unspy(window, "setTimeout") + describe "when the file has already been read", -> + beforeEach -> + file.read() - changeHandler = jasmine.createSpy("file changed") - removeHandler = jasmine.createSpy("file removed") - file.on 'contents-changed', changeHandler - file.on 'removed', removeHandler + describe "when the contents of the file change", -> + it "triggers 'contents-changed' event handlers", -> + changeHandler = null + changeHandler = jasmine.createSpy('changeHandler') + file.on 'contents-changed', changeHandler + fsUtils.writeSync(file.getPath(), "this is new!") - expect(changeHandler).not.toHaveBeenCalled() + waitsFor "change event", -> + changeHandler.callCount > 0 - fsUtils.remove(filePath) + runs -> + changeHandler.reset() + fsUtils.writeSync(file.getPath(), "this is newer!") + + waitsFor "second change event", -> + changeHandler.callCount > 0 + + describe "when the file is removed", -> + it "triggers 'remove' event handlers", -> + removeHandler = null + removeHandler = jasmine.createSpy('removeHandler') + file.on 'removed', removeHandler + fsUtils.remove(file.getPath()) + + waitsFor "remove event", -> + removeHandler.callCount > 0 + + describe "when a file is moved (via the filesystem)", -> + newPath = null + + beforeEach -> + newPath = path.join(path.dirname(filePath), "atom-file-was-moved-test.txt") + + afterEach -> + if fsUtils.exists(newPath) + fsUtils.remove(newPath) + waitsFor "remove event", (done) -> file.on 'removed', done + + it "it updates its path", -> + jasmine.unspy(window, "setTimeout") + moveHandler = null + moveHandler = jasmine.createSpy('moveHandler') + file.on 'moved', moveHandler + + fsUtils.move(filePath, newPath) + + waitsFor "move event", -> + moveHandler.callCount > 0 + + runs -> + expect(file.getPath()).toBe newPath + + it "maintains 'contents-changed' events set on previous path", -> + jasmine.unspy(window, "setTimeout") + moveHandler = null + moveHandler = jasmine.createSpy('moveHandler') + file.on 'moved', moveHandler + changeHandler = null + changeHandler = jasmine.createSpy('changeHandler') + file.on 'contents-changed', changeHandler + + fsUtils.move(filePath, newPath) + + waitsFor "move event", -> + moveHandler.callCount > 0 + + runs -> + expect(changeHandler).not.toHaveBeenCalled() + fsUtils.writeSync(file.getPath(), "this is new!") + + waitsFor "change event", -> + changeHandler.callCount > 0 + + describe "when a file is deleted and the recreated within a small amount of time (git sometimes does this)", -> + it "triggers a contents change event if the contents change", -> + jasmine.unspy(File.prototype, 'detectResurrectionAfterDelay') + jasmine.unspy(window, "setTimeout") + + changeHandler = jasmine.createSpy("file changed") + removeHandler = jasmine.createSpy("file removed") + file.on 'contents-changed', changeHandler + file.on 'removed', removeHandler - expect(changeHandler).not.toHaveBeenCalled() - waits 20 - runs -> - fsUtils.writeSync(filePath, "HE HAS RISEN!") expect(changeHandler).not.toHaveBeenCalled() - waitsFor "resurrection change event", -> - changeHandler.callCount == 1 + fsUtils.remove(filePath) - runs -> - expect(removeHandler).not.toHaveBeenCalled() - fsUtils.writeSync(filePath, "Hallelujah!") - changeHandler.reset() + expect(changeHandler).not.toHaveBeenCalled() + waits 20 + runs -> + fsUtils.writeSync(filePath, "HE HAS RISEN!") + expect(changeHandler).not.toHaveBeenCalled() - waitsFor "post-resurrection change event", -> - changeHandler.callCount > 0 + waitsFor "resurrection change event", -> + changeHandler.callCount == 1 + + runs -> + expect(removeHandler).not.toHaveBeenCalled() + fsUtils.writeSync(filePath, "Hallelujah!") + changeHandler.reset() + + waitsFor "post-resurrection change event", -> + changeHandler.callCount > 0 diff --git a/src/file.coffee b/src/file.coffee index 1e2174b91..30d7b6b0b 100644 --- a/src/file.coffee +++ b/src/file.coffee @@ -80,7 +80,7 @@ class File @setPath(path) @trigger "moved" else if eventType is "change" - oldContents = @read() + oldContents = @cachedContents newContents = @read(true) return if oldContents == newContents @trigger 'contents-changed'