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
|
// Copyright 2014 The gocui Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"fmt"
"log"
"strings"
"github.com/jroimartin/gocui"
"github.com/mkchoi212/fac/color"
"github.com/mkchoi212/fac/conflict"
)
var (
cur = 0
consecutiveError = 0
)
var g *gocui.Gui
func printLines(v *gocui.View, lines []string) {
for _, line := range lines {
fmt.Fprint(v, line)
}
}
func quit(g *gocui.Gui, v *gocui.View) error {
return gocui.ErrQuit
}
func parseInput(v *gocui.View) error {
evalCmd := func(in rune, g *gocui.Gui) {
switch in {
case 'j':
Scroll(g, &conflict.All[cur], Up)
case 'k':
Scroll(g, &conflict.All[cur], Down)
case 'w':
conflict.All[cur].TopPeek++
Select(&conflict.All[cur], g, false)
case 's':
conflict.All[cur].BottomPeek++
Select(&conflict.All[cur], g, false)
case 'a':
Resolve(&conflict.All[cur], g, v, Local)
case 'd':
Resolve(&conflict.All[cur], g, v, Incoming)
case 'n':
MoveToItem(Down, g, v)
case 'p':
MoveToItem(Up, g, v)
case 'v':
ViewOrientation = ^ViewOrientation
layout(g)
case 'h', '?':
Select(&conflict.All[cur], g, true)
case 'q':
globalQuit(g)
default:
PrintPrompt(g, color.Red(color.Regular, promptString))
consecutiveError++
if consecutiveError == 2 {
consecutiveError = 0
Select(&conflict.All[cur], g, true)
}
return
}
consecutiveError = 0
PrintPrompt(g, color.Green(color.Regular, promptString))
}
in := strings.TrimSuffix(v.Buffer(), "\n")
if len(in) > 1 {
for _, r := range [...]rune{'a', 'd', 'h', 'z'} {
if strings.ContainsRune(in, r) {
PrintPrompt(g, color.Red(color.Regular, promptString))
return nil
}
}
}
for _, c := range in {
evalCmd(c, g)
}
return nil
}
func main() {
var err error
if err = conflict.Find(); err != nil {
switch err.(type) {
case *conflict.ErrNoConflict:
fmt.Println(color.Green(color.Regular, err.Error()))
default:
fmt.Println(color.Red(color.Regular, err.Error()))
}
return
}
g, err = gocui.NewGui(gocui.OutputNormal)
if err != nil {
log.Panicln(err)
}
g.SetManagerFunc(layout)
g.Cursor = true
if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
log.Panic(err)
}
Select(&conflict.All[0], g, false)
if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
log.Panicln(err)
}
g.Close()
for fname := range conflict.FileLines {
if err := FinalizeChanges(fname); err != nil {
fmt.Println(color.Red(color.Underline, "%s\n", err))
}
}
printSummary()
}
|