From 77a5f4775a6a671076ae074b044c63d484f88656 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 27 Feb 2013 19:36:21 -0800 Subject: [PATCH] Show Git status indicators on directories Closes #301 --- src/app/git.coffee | 7 ++++++ .../tree-view/lib/directory-view.coffee | 23 +++++++++++++++++-- .../tree-view/spec/tree-view-spec.coffee | 23 ++++++++++++++++--- themes/atom-dark-ui/tree-view.css | 2 +- themes/atom-light-ui/tree-view.css | 5 ++-- 5 files changed, 51 insertions(+), 9 deletions(-) diff --git a/src/app/git.coffee b/src/app/git.coffee index b85829c01..d450147a5 100644 --- a/src/app/git.coffee +++ b/src/app/git.coffee @@ -126,5 +126,12 @@ class Git @statusTask = new RepositoryStatusTask(this) @statusTask.start() + getDirectoryStatus: (directoryPath) -> + directoryPath = "#{directoryPath}/" + directoryStatus = 0 + for path, status of @statuses + directoryStatus |= status if path.indexOf(directoryPath) is 0 + directoryStatus + _.extend Git.prototype, Subscriber _.extend Git.prototype, EventEmitter diff --git a/src/packages/tree-view/lib/directory-view.coffee b/src/packages/tree-view/lib/directory-view.coffee index bb1401399..c6f561c1d 100644 --- a/src/packages/tree-view/lib/directory-view.coffee +++ b/src/packages/tree-view/lib/directory-view.coffee @@ -26,12 +26,31 @@ class DirectoryView extends View if git? path = @directory.getPath() if parent - @directoryName.addClass('ignored') if git.isPathIgnored(path) - iconClass = 'submodule-icon' if git.isSubmodule(path) + if git.isSubmodule(path) + iconClass = 'submodule-icon' + else + @subscribe git, 'status-changed', (path, status) => + @updateStatus() if path.substring("#{@getPath()}/") is 0 + @subscribe git, 'statuses-changed', => + @updateStatus() + @updateStatus() else iconClass = 'repository-icon' if path is git.getWorkingDirectory() + @directoryName.addClass(iconClass) + updateStatus: -> + @removeClass('ignored modified new') + path = @directory.getPath() + if git.isPathIgnored(path) + @addClass('ignored') + else + status = git.getDirectoryStatus(path) + if git.isStatusModified(status) + @addClass('modified') + else if git.isStatusNew(status) + @addClass('new') + getPath: -> @directory.path diff --git a/src/packages/tree-view/spec/tree-view-spec.coffee b/src/packages/tree-view/spec/tree-view-spec.coffee index 70dd15e98..c364bf527 100644 --- a/src/packages/tree-view/spec/tree-view-spec.coffee +++ b/src/packages/tree-view/spec/tree-view-spec.coffee @@ -927,31 +927,48 @@ describe "TreeView", -> expect(treeView.find('.file:contains(tree-view.js)').length).toBe 1 describe "Git status decorations", -> - [ignoreFile, modifiedFile, originalFileContent] = [] + [ignoreFile, newFile, modifiedFile, originalFileContent] = [] beforeEach -> 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') + + newFile = fs.join(require.resolve('fixtures/tree-view/dir2'), 'new2') + fs.write(newFile, '') + git.getPathStatus(newFile) + + modifiedFile = fs.join(require.resolve('fixtures/tree-view/dir1'), 'file1') originalFileContent = fs.read(modifiedFile) fs.write modifiedFile, 'ch ch changes' git.getPathStatus(modifiedFile) + treeView.updateRoot() + treeView.root.entries.find('.directory:contains(dir1)').view().expand() + treeView.root.entries.find('.directory:contains(dir2)').view().expand() afterEach -> fs.remove(ignoreFile) if fs.exists(ignoreFile) + fs.remove(newFile) if fs.exists(newFile) fs.write modifiedFile, originalFileContent describe "when a file is modified", -> it "adds a custom style", -> - expect(treeView.find('.file:contains(tree-view.txt)')).toHaveClass 'modified' + expect(treeView.find('.file:contains(file1)')).toHaveClass 'modified' + + describe "when a directory if modified", -> + it "adds a custom style", -> + expect(treeView.find('.directory:contains(dir1)')).toHaveClass 'modified' describe "when a file is new", -> it "adds a custom style", -> expect(treeView.find('.file:contains(.gitignore)')).toHaveClass 'new' + describe "when a directory is new", -> + it "adds a custom style", -> + expect(treeView.find('.directory:contains(dir2)')).toHaveClass 'new' + describe "when a file is ignored", -> it "adds a custom style", -> expect(treeView.find('.file:contains(tree-view.js)')).toHaveClass 'ignored' diff --git a/themes/atom-dark-ui/tree-view.css b/themes/atom-dark-ui/tree-view.css index 26851216e..f1d8a9796 100644 --- a/themes/atom-dark-ui/tree-view.css +++ b/themes/atom-dark-ui/tree-view.css @@ -29,7 +29,7 @@ text-shadow: 0 -1px 0 #7E4521; } -.tree-view .directory .header { +.tree-view .directory { color: #bebebe; } diff --git a/themes/atom-light-ui/tree-view.css b/themes/atom-light-ui/tree-view.css index ff18a5990..5ab39df36 100644 --- a/themes/atom-light-ui/tree-view.css +++ b/themes/atom-light-ui/tree-view.css @@ -34,7 +34,7 @@ text-shadow: 0 1px 0 #000; } -.tree-view .directory .header { +.tree-view .directory { color: #262626; } @@ -46,7 +46,6 @@ color: #7e8692; } - .tree-view .entry:hover, .tree-view .directory .header:hover .name, .tree-view .directory .header:hover .disclosure-arrow { @@ -83,4 +82,4 @@ .tree-view-dialog .prompt { color: #333; -} \ No newline at end of file +}