Add line diff decorations to editor gutter

Added, modified, and deleted lines will now highlighted
in the gutter for files already checked in to the repository.
This commit is contained in:
Kevin Sawicki
2013-04-10 12:16:19 -07:00
parent b74f2a3e9e
commit f868c0cd4f
7 changed files with 154 additions and 2 deletions

View File

@@ -0,0 +1,62 @@
_ = require 'underscore'
module.exports =
class GitDiffView
diffs: null
editor: null
constructor: (@editor) ->
@gutter = @editor.gutter
@diffs = {}
@editor.on 'editor:path-changed', => @subscribeToBuffer()
@editor.on 'editor:display-updated', => @renderDiffs()
git.on 'statuses-changed', =>
@diffs = {}
@scheduleDiffs()
git.on 'status-changed', (path) =>
delete @diffs[path]
@scheduleDiffs() if path is @editor.getPath()
@subscribeToBuffer()
subscribeToBuffer: ->
if @buffer?
@removeDiffs()
delete @diffs[@buffer.getPath()] if @buffer.destroyed
@buffer.off '.git-diff'
@buffer = null
if @buffer = @editor.getBuffer()
@scheduleDiffs() unless @diffs[@buffer.getPath()]?
@buffer.on 'contents-modified.git-diff', =>
@generateDiffs()
@renderDiffs()
scheduleDiffs: ->
_.nextTick =>
@generateDiffs()
@renderDiffs()
generateDiffs: ->
if path = @buffer.getPath()
@diffs[path] = git?.getLineDiffs(path, @buffer.getText())
removeDiffs: ->
@gutter.find('.line-number').removeClass('git-line-added git-line-modified git-line-removed')
renderDiffs: ->
return unless @gutter.isVisible()
@removeDiffs()
hunks = @diffs[@editor.getPath()] ? []
for hunk in hunks
if hunk.oldLines is 0 and hunk.newLines > 0
for row in [hunk.newStart...hunk.newStart + hunk.newLines]
@gutter.find(".line-number[lineNumber=#{row - 1}]").addClass('git-line-added')
else if hunk.newLines is 0 and hunk.oldLines > 0
@gutter.find(".line-number[lineNumber=#{hunk.newStart - 1}]").addClass('git-line-removed')
else
for row in [hunk.newStart...hunk.newStart + hunk.newLines]
@gutter.find(".line-number[lineNumber=#{row - 1}]").addClass('git-line-modified')

View File

@@ -0,0 +1,12 @@
GitDiffView = require './git-diff-view'
module.exports =
configDefaults:
enabled: false
activate: ->
return unless git?
return unless config.get('git-diff.enabled')
rootView.eachEditor (editor) =>
new GitDiffView(editor) if git? and editor.getPane()?

View File

@@ -0,0 +1 @@
'main': 'lib/git-diff'

View File

@@ -0,0 +1,63 @@
RootView = require 'root-view'
_ = require 'underscore'
describe "GitDiff package", ->
editor = null
beforeEach ->
config.set('git-diff.enabled', true)
window.rootView = new RootView
rootView.attachToDom()
rootView.open('sample.js')
atom.activatePackage('git-diff')
editor = rootView.getActiveView()
describe "when the editor has modified lines", ->
it "highlights the modified lines", ->
expect(editor.find('.git-line-modified').length).toBe 0
editor.insertText('a')
advanceClock(editor.getBuffer().stoppedChangingDelay)
expect(editor.find('.git-line-modified').length).toBe 1
expect(editor.find('.git-line-modified').attr('lineNumber')).toBe '0'
describe "when the editor has added lines", ->
it "highlights the added lines", ->
expect(editor.find('.git-line-added').length).toBe 0
editor.moveCursorToEndOfLine()
editor.insertNewline()
editor.insertText('a')
advanceClock(editor.getBuffer().stoppedChangingDelay)
expect(editor.find('.git-line-added').length).toBe 1
expect(editor.find('.git-line-added').attr('lineNumber')).toBe '1'
describe "when the editor has removed lines", ->
it "highlights the line preceeding the deleted lines", ->
expect(editor.find('.git-line-added').length).toBe 0
editor.setCursorBufferPosition([5])
editor.deleteLine()
advanceClock(editor.getBuffer().stoppedChangingDelay)
expect(editor.find('.git-line-removed').length).toBe 1
expect(editor.find('.git-line-removed').attr('lineNumber')).toBe '4'
describe "when a modified line is restored to the HEAD version contents", ->
it "removes the diff highlight", ->
expect(editor.find('.git-line-modified').length).toBe 0
editor.insertText('a')
advanceClock(editor.getBuffer().stoppedChangingDelay)
expect(editor.find('.git-line-modified').length).toBe 1
editor.backspace()
advanceClock(editor.getBuffer().stoppedChangingDelay)
expect(editor.find('.git-line-modified').length).toBe 0
describe "when a modified file is opened", ->
it "highlights the changed lines", ->
path = project.resolve('sample.txt')
buffer = project.buildBuffer(path)
buffer.setText("Some different text.")
rootView.open('sample.txt')
nextTick = false
_.nextTick -> nextTick = true
waitsFor -> nextTick
runs ->
expect(editor.find('.git-line-modified').length).toBe 1
expect(editor.find('.git-line-modified').attr('lineNumber')).toBe '0'

View File

@@ -0,0 +1,11 @@
.git-line-modified {
color: #f78a46;
}
.git-line-added {
color: #5293d8;
}
.git-line-removed {
color: #c41e3a;
}