diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 52a8a396a..d38fe73b2 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -137,16 +137,18 @@ describe "Editor", -> describe ".remove()", -> it "removes subscriptions from all edit session buffers", -> - previousEditSession = editor.activeEditSession - otherEditSession = project.buildEditSessionForPath(project.resolve('sample.txt')) - expect(previousEditSession.buffer.subscriptionCount()).toBeGreaterThan 1 + editSession1 = editor.activeEditSession + subscriberCount1 = editSession1.buffer.subscriptionCount() + editSession2 = project.buildEditSessionForPath(project.resolve('sample.txt')) + expect(subscriberCount1).toBeGreaterThan 1 - editor.edit(otherEditSession) - expect(otherEditSession.buffer.subscriptionCount()).toBeGreaterThan 1 + editor.edit(editSession2) + subscriberCount2 = editSession2.buffer.subscriptionCount() + expect(subscriberCount2).toBeGreaterThan 1 editor.remove() - expect(previousEditSession.buffer.subscriptionCount()).toBe 0 - expect(otherEditSession.buffer.subscriptionCount()).toBe 0 + expect(editSession1.buffer.subscriptionCount()).toBeLessThan subscriberCount1 + expect(editSession2.buffer.subscriptionCount()).toBeLessThan subscriberCount2 describe "when 'close' is triggered", -> it "adds a closed session path to the array", -> diff --git a/src/app/git.coffee b/src/app/git.coffee index f73517a33..b85829c01 100644 --- a/src/app/git.coffee +++ b/src/app/git.coffee @@ -38,6 +38,13 @@ class Git @refreshIndex() @refreshStatus() + project?.eachBuffer this, (buffer) => + bufferStatusHandler = => + path = buffer.getPath() + @getPathStatus(path) if path + @subscribe buffer, 'saved', bufferStatusHandler + @subscribe buffer, 'reloaded', bufferStatusHandler + getRepo: -> unless @repo? throw new Error("Repository has been destroyed") diff --git a/src/app/project.coffee b/src/app/project.coffee index 7aeb0757d..d31c12238 100644 --- a/src/app/project.coffee +++ b/src/app/project.coffee @@ -128,9 +128,15 @@ class Project buffers.push editSession.buffer buffers - eachBuffer: (callback) -> + eachBuffer: (args...) -> + subscriber = args.shift() if args.length > 1 + callback = args.shift() + callback(buffer) for buffer in @getBuffers() - @on 'buffer-created', (buffer) -> callback(buffer) + if subscriber + subscriber.subscribe this, 'buffer-created', (buffer) -> callback(buffer) + else + @on 'buffer-created', (buffer) -> callback(buffer) bufferForPath: (filePath) -> if filePath? diff --git a/src/app/window.coffee b/src/app/window.coffee index cd10df014..a4c514b15 100644 --- a/src/app/window.coffee +++ b/src/app/window.coffee @@ -69,9 +69,11 @@ window.shutdown = -> rootView: rootView.serialize() rootView.deactivate() project.destroy() + git?.destroy() $(window).off('focus blur before') window.rootView = null window.project = null + window.git = null window.installAtomCommand = (commandPath) -> return if fs.exists(commandPath) diff --git a/src/packages/status-bar/lib/status-bar-view.coffee b/src/packages/status-bar/lib/status-bar-view.coffee index 717cabeaa..c095e7f39 100644 --- a/src/packages/status-bar/lib/status-bar-view.coffee +++ b/src/packages/status-bar/lib/status-bar-view.coffee @@ -32,9 +32,13 @@ class StatusBarView extends View @updateCursorPositionText() @subscribe @editor, 'cursor:moved', => @updateCursorPositionText() - @subscribe $(window), 'focus', => @updateStatusBar() @subscribe @grammarName, 'click', => @editor.trigger 'editor:select-grammar' @subscribe @editor, 'editor:grammar-changed', => @updateGrammarText() + if git? + @subscribe git, 'status-changed', (path, status) => + @updateStatusBar() if path is @buffer?.getPath() + @subscribe git, 'statuses-changed', => + @updateStatusBar() @subscribeToBuffer() @@ -42,7 +46,6 @@ class StatusBarView extends View @buffer?.off '.status-bar' @buffer = @editor.getBuffer() @buffer.on 'contents-modified.status-bar', (e) => @updateBufferHasModifiedText(e.differsFromDisk) - @buffer.on 'saved.status-bar', => @updateStatusBar() @buffer.on 'git-status-changed.status-bar', => @updateStatusBar() @updateStatusBar() @@ -80,7 +83,7 @@ class StatusBarView extends View @gitStatusIcon.addClass('git-status octicons') return unless git? - status = git.getPathStatus(path) + status = git.statuses[path] if git.isStatusModified(status) @gitStatusIcon.addClass('modified-status-icon') stats = git.getDiffStats(path) diff --git a/src/packages/status-bar/spec/status-bar-spec.coffee b/src/packages/status-bar/spec/status-bar-spec.coffee index 177a2b6a2..85e2d7361 100644 --- a/src/packages/status-bar/spec/status-bar-spec.coffee +++ b/src/packages/status-bar/spec/status-bar-spec.coffee @@ -130,6 +130,8 @@ describe "StatusBar", -> path = require.resolve('fixtures/git/working-dir/file.txt') newPath = fs.join(require.resolve('fixtures/git/working-dir'), 'new.txt') fs.write(newPath, "I'm new here") + git.getPathStatus(path) + git.getPathStatus(newPath) originalPathText = fs.read(path) rootView.attachToDom() @@ -139,6 +141,7 @@ describe "StatusBar", -> it "displays the modified icon for a changed file", -> fs.write(path, "i've changed for the worse") + git.getPathStatus(path) rootView.open(path) expect(statusBar.gitStatusIcon).toHaveClass('modified-status-icon') @@ -152,22 +155,17 @@ describe "StatusBar", -> it "updates when a git-status-changed event occurs", -> fs.write(path, "i've changed for the worse") + git.getPathStatus(path) rootView.open(path) expect(statusBar.gitStatusIcon).toHaveClass('modified-status-icon') fs.write(path, originalPathText) + git.getPathStatus(path) rootView.getActiveEditor().getBuffer().trigger 'git-status-changed' expect(statusBar.gitStatusIcon).not.toHaveClass('modified-status-icon') - it "updates when the window receives focus", -> - fs.write(path, "i've changed for the worse") - rootView.open(path) - expect(statusBar.gitStatusIcon).toHaveClass('modified-status-icon') - fs.write(path, originalPathText) - $(window).trigger 'focus' - expect(statusBar.gitStatusIcon).not.toHaveClass('modified-status-icon') - it "displays the diff stat for modified files", -> fs.write(path, "i've changed for the worse") + git.getPathStatus(path) rootView.open(path) expect(statusBar.gitStatusIcon).toHaveText('+1,-1') diff --git a/src/packages/tree-view/lib/file-view.coffee b/src/packages/tree-view/lib/file-view.coffee index 606398c79..51b94d362 100644 --- a/src/packages/tree-view/lib/file-view.coffee +++ b/src/packages/tree-view/lib/file-view.coffee @@ -14,8 +14,6 @@ class FileView extends View file: null initialize: ({@file, @project} = {}) -> - @subscribe $(window), 'focus', => @updateStatus() - extension = fs.extension(@getPath()) if fs.isReadmePath(@getPath()) @fileName.addClass('readme-icon') @@ -30,6 +28,12 @@ class FileView extends View else @fileName.addClass('text-icon') + if git? + git.on 'status-changed', (path, status) => + @updateStatus() if path is @getPath() + git.on 'statuses-changed', => + @updateStatus() + @updateStatus() updateStatus: -> @@ -40,7 +44,7 @@ class FileView extends View if git.isPathIgnored(path) @addClass('ignored') else - status = git.getPathStatus(path) + status = git.statuses[path] if git.isStatusModified(status) @addClass('modified') else if git.isStatusNew(status) diff --git a/src/packages/tree-view/spec/tree-view-spec.coffee b/src/packages/tree-view/spec/tree-view-spec.coffee index 73c91d24b..70dd15e98 100644 --- a/src/packages/tree-view/spec/tree-view-spec.coffee +++ b/src/packages/tree-view/spec/tree-view-spec.coffee @@ -933,9 +933,11 @@ describe "TreeView", -> config.set "core.hideGitIgnoredFiles", false ignoreFile = fs.join(require.resolve('fixtures/tree-view'), '.gitignore') fs.write(ignoreFile, 'tree-view.js') + git.getPathStatus(ignoreFile) modifiedFile = fs.join(require.resolve('fixtures/tree-view'), 'tree-view.txt') originalFileContent = fs.read(modifiedFile) fs.write modifiedFile, 'ch ch changes' + git.getPathStatus(modifiedFile) treeView.updateRoot() afterEach -> @@ -946,13 +948,6 @@ describe "TreeView", -> it "adds a custom style", -> expect(treeView.find('.file:contains(tree-view.txt)')).toHaveClass 'modified' - describe "when the window gains focus after the contents are restored to a clean state", -> - it "removes the custom style", -> - expect(treeView.find('.file:contains(tree-view.txt)')).toHaveClass 'modified' - fs.write modifiedFile, originalFileContent - $(window).trigger 'focus' - expect(treeView.find('.file:contains(tree-view.txt)')).not.toHaveClass 'modified' - describe "when a file is new", -> it "adds a custom style", -> expect(treeView.find('.file:contains(.gitignore)')).toHaveClass 'new'