summaryrefslogtreecommitdiff
path: root/pkg/gui/diffview.go
blob: f99d7f2ba1b2cec11d82b3f87b80eaefcdb60c84 (about) (plain)
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
130
131
132
133
134
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
	gui.updateKeyBindingsView(g, diffViewFeature.Name)
	if _, err = g.SetCurrentView(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
	}
	if _, err := g.SetCurrentView(diffReturnView); err != nil {
		return err
	}
	gui.updateKeyBindingsView(g, diffReturnView)
	return nil
}