-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgit-diff-view.coffee
79 lines (64 loc) · 2.69 KB
/
git-diff-view.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
class GitDiffView
moveToNextDiff: ->
cursorLineNumber = @editor.getCursorBufferPosition().row + 1
nextDiffLineNumber = null
firstDiffLineNumber = null
for {newStart} in @diffs ? []
if newStart > cursorLineNumber
nextDiffLineNumber ?= newStart - 1
nextDiffLineNumber = Math.min(newStart - 1, nextDiffLineNumber)
firstDiffLineNumber ?= newStart - 1
firstDiffLineNumber = Math.min(newStart - 1, firstDiffLineNumber)
# Wrap around to the first diff in the file
nextDiffLineNumber = firstDiffLineNumber unless nextDiffLineNumber?
@moveToLineNumber(nextDiffLineNumber)
moveToPreviousDiff: ->
cursorLineNumber = @editor.getCursorBufferPosition().row + 1
previousDiffLineNumber = -1
lastDiffLineNumber = -1
for {newStart} in @diffs ? []
if newStart < cursorLineNumber
previousDiffLineNumber = Math.max(newStart - 1, previousDiffLineNumber)
lastDiffLineNumber = Math.max(newStart - 1, lastDiffLineNumber)
# Wrap around to the last diff in the file
previousDiffLineNumber = lastDiffLineNumber if previousDiffLineNumber is -1
@moveToLineNumber(previousDiffLineNumber)
moveToLineNumber: (lineNumber=-1) ->
if lineNumber >= 0
@editor.setCursorBufferPosition([lineNumber, 0])
@editor.moveToFirstCharacterOfLine()
subscribeToRepository: ->
if @repository = repositoryForPath(@editor.getPath())
@subscriptions.add @repository.onDidChangeStatuses =>
@scheduleUpdate()
@subscriptions.add @repository.onDidChangeStatus (changedPath) =>
@scheduleUpdate() if changedPath is @editor.getPath()
cancelUpdate: ->
clearImmediate(@immediateId)
scheduleUpdate: ->
@cancelUpdate()
@immediateId = setImmediate(@updateDiffs)
updateDiffs: =>
return if @editor.isDestroyed()
@removeDecorations()
if path = @editor?.getPath()
if @diffs = @repository?.getLineDiffs(path, @editor.getText())
@addDecorations(@diffs)
addDecorations: (diffs) ->
for {oldStart, newStart, oldLines, newLines} in diffs
startRow = newStart - 1
endRow = newStart + newLines - 1
if oldLines is 0 and newLines > 0
@markRange(startRow, endRow, 'git-line-added')
else if newLines is 0 and oldLines > 0
@markRange(startRow, startRow, 'git-line-removed')
else
@markRange(startRow, endRow, 'git-line-modified')
return
removeDecorations: ->
marker.destroy() for marker in @markers
@markers = []
markRange: (startRow, endRow, klass) ->
marker = @editor.markBufferRange([[startRow, 0], [endRow, 0]], invalidate: 'never')
@editor.decorateMarker(marker, type: 'line-number', class: klass)
@markers.push(marker)