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", diff --git a/spec/project-spec.coffee b/spec/project-spec.coffee index 32022ca98..fed7733a3 100644 --- a/spec/project-spec.coffee +++ b/spec/project-spec.coffee @@ -37,6 +37,32 @@ describe "Project", -> deserializedProject.getBuffers()[0].destroy() expect(deserializedProject.getBuffers().length).toBe 0 + + it "does not deserialize buffers when their path is a directory that exists", -> + 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 + + 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 e36d954c7..fd04d7db7 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -66,9 +66,16 @@ 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 + params.buffers = _.compact params.buffers.map (bufferState) -> + # 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 ### Section: Event Subscription @@ -219,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'