From 67fc2b9af5b9bf2e639fdeb7490688061ac9d5a1 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 15 Jan 2015 11:42:52 -0800 Subject: [PATCH 1/7] :arrow_up: pathwatcher@2.6.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3d4181e55..330003363 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "nslog": "^1.0.1", "oniguruma": "^3.0.6", "optimist": "0.4.0", - "pathwatcher": "^2.6.0", + "pathwatcher": "^2.6.1", "property-accessors": "^1", "q": "^1.0.1", "random-words": "0.0.1", From 6ad8aa7e5c336c19e456f13248e923468597fba6 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 15 Jan 2015 11:51:11 -0800 Subject: [PATCH 2/7] Ignore buffer errors when the path is a directory This would previously cause Atom to fail to launch if a buffer's serialized path was now a directory on launch. --- spec/project-spec.coffee | 13 +++++++++++++ src/project.coffee | 7 ++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/spec/project-spec.coffee b/spec/project-spec.coffee index 32022ca98..9c4f8571e 100644 --- a/spec/project-spec.coffee +++ b/spec/project-spec.coffee @@ -37,6 +37,19 @@ describe "Project", -> deserializedProject.getBuffers()[0].destroy() expect(deserializedProject.getBuffers().length).toBe 0 + + it "does not deserialize buffers when the path is a directory", -> + pathToOpen = path.join(temp.mkdirSync(), 'file.txt') + + waitsForPromise -> + atom.project.open(pathToOpen) + + runs -> + expect(atom.project.getBuffers().length).toBe 1 + fs.mkdirSync(pathToOpen) + deserializedProject = atom.project.testSerialization() + expect(deserializedProject.getBuffers().length).toBe 0 + describe "when an editor is saved and the project has no path", -> it "sets the project's path to the saved file's parent directory", -> tempFile = temp.openSync().path diff --git a/src/project.coffee b/src/project.coffee index e36d954c7..6f71873af 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -66,7 +66,12 @@ class Project extends Model buffers: _.compact(@buffers.map (buffer) -> buffer.serialize() if buffer.isRetained()) deserializeParams: (params) -> - params.buffers = params.buffers.map (bufferState) -> atom.deserializers.deserialize(bufferState) + params.buffers = _.compact params.buffers.map (bufferState) -> + try + atom.deserializers.deserialize(bufferState) + catch error + # Ignore buffers for files that are now folders + throw error unless error.code is 'EISDIR' params From 16cc9f76c4e9ef0654febff795e872fe4a5488ac Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 15 Jan 2015 11:53:39 -0800 Subject: [PATCH 3/7] :memo: Tweak spec description --- spec/project-spec.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/project-spec.coffee b/spec/project-spec.coffee index 9c4f8571e..fd1daeb38 100644 --- a/spec/project-spec.coffee +++ b/spec/project-spec.coffee @@ -38,7 +38,7 @@ describe "Project", -> expect(deserializedProject.getBuffers().length).toBe 0 - it "does not deserialize buffers when the path is a directory", -> + it "does not deserialize buffers when their path is a directory that exists", -> pathToOpen = path.join(temp.mkdirSync(), 'file.txt') waitsForPromise -> From c0c5f460971c1c2aeac583aa8026b58bc5cbb3b1 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 15 Jan 2015 11:54:13 -0800 Subject: [PATCH 4/7] :memo: Tweak catch comment --- src/project.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/project.coffee b/src/project.coffee index 6f71873af..52b54a00b 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -70,7 +70,7 @@ class Project extends Model try atom.deserializers.deserialize(bufferState) catch error - # Ignore buffers for files that are now folders + # Ignore buffers whose previous paths are now folders throw error unless error.code is 'EISDIR' params From 0cf180804c67468f2c1a86ec8167594bbd6e6638 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 15 Jan 2015 11:54:30 -0800 Subject: [PATCH 5/7] :lipstick: --- src/project.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/src/project.coffee b/src/project.coffee index 52b54a00b..b5f514fe0 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -74,7 +74,6 @@ class Project extends Model throw error unless error.code is 'EISDIR' params - ### Section: Event Subscription ### From d736ebff386df0506c851e80d4a5f218f9d5b43a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 15 Jan 2015 13:08:16 -0800 Subject: [PATCH 6/7] Don't deserialize buffers with inaccessible paths --- spec/project-spec.coffee | 13 +++++++++++++ src/project.coffee | 13 ++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/spec/project-spec.coffee b/spec/project-spec.coffee index fd1daeb38..fed7733a3 100644 --- a/spec/project-spec.coffee +++ b/spec/project-spec.coffee @@ -50,6 +50,19 @@ describe "Project", -> deserializedProject = atom.project.testSerialization() expect(deserializedProject.getBuffers().length).toBe 0 + it "does not deserialize buffers when their path is inaccessible", -> + pathToOpen = path.join(temp.mkdirSync(), 'file.txt') + fs.writeFileSync(pathToOpen, '') + + waitsForPromise -> + atom.project.open(pathToOpen) + + runs -> + expect(atom.project.getBuffers().length).toBe 1 + fs.chmodSync(pathToOpen, '000') + deserializedProject = atom.project.testSerialization() + expect(deserializedProject.getBuffers().length).toBe 0 + describe "when an editor is saved and the project has no path", -> it "sets the project's path to the saved file's parent directory", -> tempFile = temp.openSync().path diff --git a/src/project.coffee b/src/project.coffee index b5f514fe0..ba09887df 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -67,11 +67,14 @@ class Project extends Model deserializeParams: (params) -> params.buffers = _.compact params.buffers.map (bufferState) -> - try - atom.deserializers.deserialize(bufferState) - catch error - # Ignore buffers whose previous paths are now folders - throw error unless error.code is 'EISDIR' + # Check that buffer's file path is accessible + if bufferState.filePath + try + fs.closeSync(fs.openSync(bufferState.filePath, 'r+')) + catch error + return unless error.code is 'ENOENT' + + atom.deserializers.deserialize(bufferState) params ### From b6b90c027082e07f6523950ffe1b14b5fba99461 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 15 Jan 2015 13:11:18 -0800 Subject: [PATCH 7/7] :lipstick: --- src/project.coffee | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/project.coffee b/src/project.coffee index ba09887df..fd04d7db7 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -226,8 +226,7 @@ class Project extends Model if filePath? try - fileDescriptor = fs.openSync(filePath, 'r+') - fs.closeSync(fileDescriptor) + fs.closeSync(fs.openSync(filePath, 'r+')) catch error # allow ENOENT errors to create an editor for paths that dont exist throw error unless error.code is 'ENOENT'