mirror of
https://github.com/atom/atom.git
synced 2026-02-05 04:05:05 -05:00
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:
62
src/packages/git-diff/lib/git-diff-view.coffee
Normal file
62
src/packages/git-diff/lib/git-diff-view.coffee
Normal 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')
|
||||
12
src/packages/git-diff/lib/git-diff.coffee
Normal file
12
src/packages/git-diff/lib/git-diff.coffee
Normal 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()?
|
||||
1
src/packages/git-diff/package.cson
Normal file
1
src/packages/git-diff/package.cson
Normal file
@@ -0,0 +1 @@
|
||||
'main': 'lib/git-diff'
|
||||
63
src/packages/git-diff/spec/git-diff-spec.coffee
Normal file
63
src/packages/git-diff/spec/git-diff-spec.coffee
Normal 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'
|
||||
11
src/packages/git-diff/stylesheets/git-diff.less
Normal file
11
src/packages/git-diff/stylesheets/git-diff.less
Normal file
@@ -0,0 +1,11 @@
|
||||
.git-line-modified {
|
||||
color: #f78a46;
|
||||
}
|
||||
|
||||
.git-line-added {
|
||||
color: #5293d8;
|
||||
}
|
||||
|
||||
.git-line-removed {
|
||||
color: #c41e3a;
|
||||
}
|
||||
Reference in New Issue
Block a user