From 42299c6a71ea764c2f6c2599fd9f6fc780817656 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Thu, 26 Jul 2012 10:37:32 -0700 Subject: [PATCH 1/2] When the active edit session is modified, and its file is then modified by the file system, it displays an alert. --- spec/app/editor-spec.coffee | 41 +++++++++++++++++++++++++++++++++++++ src/app/buffer.coffee | 7 +++++++ src/app/edit-session.coffee | 5 ++++- src/app/editor.coffee | 18 +++++++++++++++- 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 6600ca150..79d247784 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -110,6 +110,27 @@ describe "Editor", -> expect(editor.isFocused).toBeFalsy() expect(editor).not.toHaveClass('focused') + describe "when the activeEditSession's file is modified on disk", -> + it "triggers an alert", -> + path = "/tmp/atom-changed-file.txt" + fs.write(path, "") + editSession = project.buildEditSessionForPath(path) + editor.edit(editSession) + editor.insertText("now the buffer is modified") + + fileChangeHandler = jasmine.createSpy('fileChange') + editSession.buffer.file.on 'contents-change', fileChangeHandler + + spyOn($native, "alert") + + fs.write(path, "a file change") + + waitsFor "file to trigger contents-change event", -> + fileChangeHandler.callCount > 0 + + runs -> + expect($native.alert).toHaveBeenCalled() + describe ".remove()", -> it "removes subscriptions from all edit session buffers", -> previousEditSession = editor.activeEditSession @@ -227,6 +248,26 @@ describe "Editor", -> editor.activeEditSession.selectToEndOfLine() expect(editor.getSelectionView().find('.selection')).toExist() + it "triggers alert if edit session's file changed on disk", -> + path = "/tmp/atom-changed-file.txt" + fs.write(path, "") + editSession = project.buildEditSessionForPath(path) + editSession.insertText("a buffer change") + + fileChangeHandler = jasmine.createSpy('fileChange') + editSession.buffer.file.on 'contents-change', fileChangeHandler + + spyOn($native, "alert") + + fs.write(path, "a file change") + + waitsFor "file to trigger contents-change event", -> + fileChangeHandler.callCount > 0 + + runs -> + editor.edit(editSession) + expect($native.alert).toHaveBeenCalled() + describe ".loadNextEditSession()", -> it "loads the next editor state and wraps to beginning when end is reached", -> expect(editor.activeEditSession).toBe session2 diff --git a/src/app/buffer.coffee b/src/app/buffer.coffee index 31f97f681..3ee768bd6 100644 --- a/src/app/buffer.coffee +++ b/src/app/buffer.coffee @@ -81,6 +81,13 @@ class Buffer @file?.off() @file = new File(path) @subscribeToFile() + @file.on "contents-change", => + if @isModified() + @modifiedOnDisk = true + @trigger "contents-change-on-disk" + else + @setText(fs.read(@file.getPath())) + @modified = false @trigger "path-change", this getExtension: -> diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 876ea307a..90996f294 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -44,7 +44,10 @@ class EditSession @buffer.retain() @buffer.on "path-change.edit-session-#{@id}", => - @trigger 'buffer-path-change' + @trigger "buffer-path-change" + + @buffer.on "contents-change-on-disk.edit-session-#{@id}", => + @trigger "buffer-contents-change-on-disk" @buffer.on "update-anchors-after-change.edit-session-#{@id}", => @mergeCursors() diff --git a/src/app/editor.coffee b/src/app/editor.coffee index ec242ecd5..397de5591 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -386,10 +386,26 @@ class Editor extends View @activeEditSession = @editSessions[index] - @activeEditSession.on "buffer-path-change", => @trigger 'editor-path-change' + if @activeEditSession.buffer.isModifiedOnDisk() and @activeEditSession.buffer.isModified() + @alertEditSessionChangedOnDisk(@activeEditSession) + + @activeEditSession.on "buffer-contents-change-on-disk", => + @alertEditSessionChangedOnDisk(@activeEditSession) + + @activeEditSession.on "buffer-path-change", => + @trigger 'editor-path-change' + @trigger 'editor-path-change' @renderWhenAttached() + alertEditSessionChangedOnDisk: (editSession) -> + message = editSession.getPath() + detailedMessage = "Has changed on disk. Do you want to reload it?" + Native.alert message, detailedMessage, [ + ["Reload", => editSession.buffer.reload()] + ["Cancel", => ], + ] + activateEditSessionForPath: (path) -> for editSession, index in @editSessions if editSession.buffer.getPath() == path From 0384f025dd6915d2d9771e37983dc839e49b28f7 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Fri, 20 Jul 2012 16:40:04 -0700 Subject: [PATCH 2/2] Add Buffer.isInConflict() --- src/app/buffer.coffee | 3 +++ src/app/editor.coffee | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/app/buffer.coffee b/src/app/buffer.coffee index 3ee768bd6..243b831a9 100644 --- a/src/app/buffer.coffee +++ b/src/app/buffer.coffee @@ -224,6 +224,9 @@ class Buffer @setPath(path) @trigger 'after-save' + isInConflict: -> + @isModified() and @isModifiedOnDisk() + isModifiedOnDisk: -> @modifiedOnDisk diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 397de5591..1e6bad3a2 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -386,11 +386,11 @@ class Editor extends View @activeEditSession = @editSessions[index] - if @activeEditSession.buffer.isModifiedOnDisk() and @activeEditSession.buffer.isModified() - @alertEditSessionChangedOnDisk(@activeEditSession) + if @activeEditSession.buffer.isInConflict() + @showBufferConflictAlert(@activeEditSession) @activeEditSession.on "buffer-contents-change-on-disk", => - @alertEditSessionChangedOnDisk(@activeEditSession) + @showBufferConflictAlert(@activeEditSession) @activeEditSession.on "buffer-path-change", => @trigger 'editor-path-change' @@ -398,7 +398,7 @@ class Editor extends View @trigger 'editor-path-change' @renderWhenAttached() - alertEditSessionChangedOnDisk: (editSession) -> + showBufferConflictAlert: (editSession) -> message = editSession.getPath() detailedMessage = "Has changed on disk. Do you want to reload it?" Native.alert message, detailedMessage, [