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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
package gui
import (
"fmt"
"github.com/isacikgoz/gitbatch/pkg/git"
"github.com/jroimartin/gocui"
)
var diffReturnView string
// renders the diff view
func (gui *Gui) prepareDiffView(g *gocui.Gui, v *gocui.View, display []string) (out *gocui.View, err error) {
maxX, maxY := g.Size()
diffReturnView = v.Name()
out, err = g.SetView(diffViewFeature.Name, 5, 3, maxX-5, maxY-3)
if err != nil {
if err != gocui.ErrUnknownView {
return out, err
}
}
out.Title = diffViewFeature.Title
out.Overwrite = true
out.Wrap = true
if err = gui.focusToView(diffViewFeature.Name); err != nil {
return out, err
}
for _, line := range display {
fmt.Fprintln(out, line)
}
return out, err
}
// open diff view for the selcted commit
// called from commitview, so initial view is commitview
func (gui *Gui) openCommitDiffView(g *gocui.Gui, v *gocui.View) (err error) {
entity := gui.getSelectedRepository()
commit := entity.Commit
commitDetail := []string{("Hash: " + cyan.Sprint(commit.Hash) + "\n" + "Author: " + commit.Author +
"\n" + commit.Time + "\n" + "\n" + "\t\t" + commit.Message + "\n")}
diff, err := entity.Diff(entity.Commit.Hash)
if err != nil {
return err
}
colorized := colorizeDiff(diff)
commitDetail = append(commitDetail, colorized...)
out, err := gui.prepareDiffView(g, v, commitDetail)
if err != nil {
if err != gocui.ErrUnknownView {
return err
}
}
out.Title = " Commit Detail "
return nil
}
// called from status, so initial view may be stagedview or unstaged view
func (gui *Gui) openFileDiffView(g *gocui.Gui, v *gocui.View) (err error) {
entity := gui.getSelectedRepository()
_, cy := v.Cursor()
_, oy := v.Origin()
var files []*git.File
switch v.Name() {
case unstageViewFeature.Name:
_, files, err = generateFileLists(entity)
case stageViewFeature.Name:
files, _, err = generateFileLists(entity)
}
if err != nil {
return err
}
if len(files) <= 0 {
return nil
}
output, err := files[cy+oy].Diff()
if err != nil || len(output) <= 0 {
return nil
}
if err != nil {
if err = gui.openErrorView(g, output,
"You should manually resolve this issue",
diffReturnView); err != nil {
return err
}
}
colorized := colorizeDiff(output)
_, err = gui.prepareDiffView(g, v, colorized)
if err != nil {
if err != gocui.ErrUnknownView {
return err
}
}
return nil
}
// called from stashview, so initial view is stashview
func (gui *Gui) showStash(g *gocui.Gui, v *gocui.View) (err error) {
entity := gui.getSelectedRepository()
_, oy := v.Origin()
_, cy := v.Cursor()
if len(entity.Stasheds) <= 0 {
return nil
}
stashedItem := entity.Stasheds[oy+cy]
output, err := stashedItem.Show()
if err != nil {
if err = gui.openErrorView(g, output,
"You should manually resolve this issue",
stashViewFeature.Name); err != nil {
return err
}
}
colorized := colorizeDiff(output)
_, err = gui.prepareDiffView(g, v, colorized)
if err != nil {
if err != gocui.ErrUnknownView {
return err
}
}
return nil
}
// close the opened diff view
func (gui *Gui) closeCommitDiffView(g *gocui.Gui, v *gocui.View) error {
if err := g.DeleteView(v.Name()); err != nil {
return nil
}
return gui.closeViewCleanup(diffReturnView)
}
|