From a42505b6ae2a0378d7a49d11ea2a113846390d4e Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 15 Dec 2014 17:08:46 -0800 Subject: [PATCH] Handle `is a directory` error Closes #4616 --- spec/workspace-view-spec.coffee | 24 ++++++++++++++++++++++++ src/workspace.coffee | 13 +++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/spec/workspace-view-spec.coffee b/spec/workspace-view-spec.coffee index 56c8dc376..9fbe4d5d3 100644 --- a/spec/workspace-view-spec.coffee +++ b/spec/workspace-view-spec.coffee @@ -3,6 +3,7 @@ Q = require 'q' path = require 'path' temp = require 'temp' TextEditorView = require '../src/text-editor-view' +Pane = require '../src/pane' PaneView = require '../src/pane-view' Workspace = require '../src/workspace' @@ -294,3 +295,26 @@ describe "WorkspaceView", -> modalContainer = workspaceElement.querySelector('atom-panel-container.modal') expect(modalContainer.parentNode).toBe workspaceElement + + describe "saving the active item", -> + describe "saveActivePaneItem", -> + describe "when there is an error", -> + beforeEach -> + + it "emits a warning notification when the file cannot be saved", -> + spyOn(Pane::, 'saveActiveItem').andCallFake -> + throw new Error("'/some/file' is a directory") + + atom.notifications.onDidAddNotification addedSpy = jasmine.createSpy() + + atom.workspace.saveActivePaneItem() + + expect(addedSpy).toHaveBeenCalled() + expect(addedSpy.mostRecentCall.args[0].getType()).toBe 'warning' + + it "emits a warning notification when the file cannot be saved", -> + spyOn(Pane::, 'saveActiveItem').andCallFake -> + throw new Error("no one knows") + + save = -> atom.workspace.saveActivePaneItem() + expect(save).toThrow() diff --git a/src/workspace.coffee b/src/workspace.coffee index 7b70fa110..7776785bf 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -555,7 +555,7 @@ class Workspace extends Model # {::saveActivePaneItemAs} # will be called instead. This method does nothing # if the active item does not implement a `.save` method. saveActivePaneItem: -> - @getActivePane().saveActiveItem() + @saveActivePaneItemAndReportErrors('saveActiveItem') # Prompt the user for a path and save the active pane item to it. # @@ -563,7 +563,16 @@ class Workspace extends Model # `.saveAs` on the item with the selected path. This method does nothing if # the active item does not implement a `.saveAs` method. saveActivePaneItemAs: -> - @getActivePane().saveActiveItemAs() + @saveActivePaneItemAndReportErrors('saveActiveItemAs') + + saveActivePaneItemAndReportErrors: (method) -> + try + @getActivePane()[method]() + catch error + if error.message.endsWith('is a directory') + atom.notifications.addWarning("Unable to save file: #{error.message}") + else + throw error # Destroy (close) the active pane item. #