summaryrefslogtreecommitdiff
path: root/pkg/gui
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/gui')
-rw-r--r--pkg/gui/branchview.go74
-rw-r--r--pkg/gui/commitsview.go67
-rw-r--r--pkg/gui/keybindings.go174
-rw-r--r--pkg/gui/remotebranchview.go78
-rw-r--r--pkg/gui/remotesview.go73
-rw-r--r--pkg/gui/sideviews.go236
6 files changed, 274 insertions, 428 deletions
diff --git a/pkg/gui/branchview.go b/pkg/gui/branchview.go
deleted file mode 100644
index f69a212..0000000
--- a/pkg/gui/branchview.go
+++ /dev/null
@@ -1,74 +0,0 @@
-package gui
-
-import (
- "fmt"
-
- "github.com/isacikgoz/gitbatch/pkg/git"
- "github.com/jroimartin/gocui"
-)
-
-// updates the branchview for given entity
-func (gui *Gui) updateBranch(g *gocui.Gui, entity *git.RepoEntity) error {
- var err error
- out, err := g.View(branchViewFeature.Name)
- if err != nil {
- return err
- }
- out.Clear()
-
- currentindex := 0
- totalbranches := len(entity.Branches)
- for i, b := range entity.Branches {
- if b.Name == entity.Branch.Name {
- currentindex = i
- fmt.Fprintln(out, selectionIndicator+b.Name)
- continue
- }
- fmt.Fprintln(out, tab+b.Name)
- }
- err = gui.smartAnchorRelativeToLine(out, currentindex, totalbranches)
- return err
-}
-
-// iteration handler for the branchview
-func (gui *Gui) nextBranch(g *gocui.Gui, v *gocui.View) error {
- var err error
- entity := gui.getSelectedRepository()
- if err = entity.Checkout(entity.NextBranch()); err != nil {
- err = gui.openErrorView(g, err.Error(),
- "You should manually resolve this issue",
- branchViewFeature.Name)
- return err
- }
- err = gui.checkoutFollowUp(g, entity)
- return err
-}
-
-// iteration handler for the branchview
-func (gui *Gui) previousBranch(g *gocui.Gui, v *gocui.View) error {
- var err error
- entity := gui.getSelectedRepository()
- if err = entity.Checkout(entity.PreviousBranch()); err != nil {
- err = gui.openErrorView(g, err.Error(),
- "You should manually resolve this issue",
- branchViewFeature.Name)
- return err
- }
- err = gui.checkoutFollowUp(g, entity)
- return err
-}
-
-// after checkout a branch some refreshments needed
-func (gui *Gui) checkoutFollowUp(g *gocui.Gui, entity *git.RepoEntity) (err error) {
- if err = gui.updateBranch(g, entity); err != nil {
- return err
- }
- if err = gui.updateCommits(g, entity); err != nil {
- return err
- }
- if err = gui.updateRemoteBranches(g, entity); err != nil {
- return err
- }
- err = gui.refreshMain(g)
- return err
-}
diff --git a/pkg/gui/commitsview.go b/pkg/gui/commitsview.go
deleted file mode 100644
index 6d1325c..0000000
--- a/pkg/gui/commitsview.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package gui
-
-import (
- "fmt"
-
- "github.com/isacikgoz/gitbatch/pkg/git"
- "github.com/jroimartin/gocui"
-)
-
-// updates the commitsview for given entity
-func (gui *Gui) updateCommits(g *gocui.Gui, entity *git.RepoEntity) error {
- var err error
- out, err := g.View(commitViewFeature.Name)
- if err != nil {
- return err
- }
- out.Clear()
-
- currentindex := 0
- totalcommits := len(entity.Commits)
- for i, c := range entity.Commits {
- var body string
- if c.CommitType == git.EvenCommit {
- body = cyan.Sprint(c.Hash[:hashLength]) + " " + c.Message
- } else if c.CommitType == git.LocalCommit {
- body = blue.Sprint(c.Hash[:hashLength]) + " " + c.Message
- } else {
- body = yellow.Sprint(c.Hash[:hashLength]) + " " + c.Message
- }
- if c.Hash == entity.Commit.Hash {
- currentindex = i
- fmt.Fprintln(out, selectionIndicator+body)
- continue
- }
- fmt.Fprintln(out, tab+body)
- }
- if err = gui.smartAnchorRelativeToLine(out, currentindex, totalcommits); err != nil {
- return err
- }
- return err
-}
-
-// iteration handler for the commitsview
-func (gui *Gui) nextCommit(g *gocui.Gui, v *gocui.View) error {
- var err error
- entity := gui.getSelectedRepository()
- if err = entity.NextCommit(); err != nil {
- return err
- }
- if err = gui.updateCommits(g, entity); err != nil {
- return err
- }
- return err
-}
-
-// reverse iteration handler for the commitsview
-func (gui *Gui) prevCommit(g *gocui.Gui, v *gocui.View) error {
- var err error
- entity := gui.getSelectedRepository()
- if err = entity.PreviousCommit(); err != nil {
- return err
- }
- if err = gui.updateCommits(g, entity); err != nil {
- return err
- }
- return err
-}
diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go
index 936c7c6..6f21fab 100644
--- a/pkg/gui/keybindings.go
+++ b/pkg/gui/keybindings.go
@@ -67,6 +67,44 @@ func (gui *Gui) generateKeybindings() error {
}
gui.KeyBindings = append(gui.KeyBindings, mainKeybindings...)
}
+ for _, view := range sideViews {
+ sideViewKeybindings := []*KeyBinding{
+ {
+ View: view.Name,
+ Key: gocui.KeyArrowDown,
+ Modifier: gocui.ModNone,
+ Handler: gui.sideViewsNextItem,
+ Display: "↓",
+ Description: "Iterate over branches",
+ Vital: false,
+ }, {
+ View: view.Name,
+ Key: gocui.KeyArrowUp,
+ Modifier: gocui.ModNone,
+ Handler: gui.sideViewsPreviousItem,
+ Display: "↑",
+ Description: "Iterate over branches",
+ Vital: false,
+ }, {
+ View: view.Name,
+ Key: 'j',
+ Modifier: gocui.ModNone,
+ Handler: gui.sideViewsNextItem,
+ Display: "j",
+ Description: "Down",
+ Vital: false,
+ }, {
+ View: view.Name,
+ Key: 'k',
+ Modifier: gocui.ModNone,
+ Handler: gui.sideViewsPreviousItem,
+ Display: "k",
+ Description: "Up",
+ Vital: false,
+ },
+ }
+ gui.KeyBindings = append(gui.KeyBindings, sideViewKeybindings...)
+ }
// Statusviews common keybindings
for _, view := range statusViews {
statusKeybindings := []*KeyBinding{
@@ -374,108 +412,6 @@ func (gui *Gui) generateKeybindings() error {
Display: "ctrl + c",
Description: "Force application to quit",
Vital: false,
- },
- // Branch View Controls
- {
- View: branchViewFeature.Name,
- Key: gocui.KeyArrowDown,
- Modifier: gocui.ModNone,
- Handler: gui.nextBranch,
- Display: "↓",
- Description: "Iterate over branches",
- Vital: false,
- }, {
- View: branchViewFeature.Name,
- Key: gocui.KeyArrowUp,
- Modifier: gocui.ModNone,
- Handler: gui.previousBranch,
- Display: "↑",
- Description: "Iterate over branches",
- Vital: false,
- }, {
- View: branchViewFeature.Name,
- Key: 'j',
- Modifier: gocui.ModNone,
- Handler: gui.nextBranch,
- Display: "j",
- Description: "Down",
- Vital: false,
- }, {
- View: branchViewFeature.Name,
- Key: 'k',
- Modifier: gocui.ModNone,
- Handler: gui.previousBranch,
- Display: "k",
- Description: "Up",
- Vital: false,
- },
- // Remote View Controls
- {
- View: remoteViewFeature.Name,
- Key: gocui.KeyArrowDown,
- Modifier: gocui.ModNone,
- Handler: gui.nextRemote,
- Display: "↓",
- Description: "Iterate over remotes",
- Vital: false,
- }, {
- View: remoteViewFeature.Name,
- Key: gocui.KeyArrowUp,
- Modifier: gocui.ModNone,
- Handler: gui.previousRemote,
- Display: "↑",
- Description: "Iterate over remotes",
- Vital: false,
- }, {
- View: remoteViewFeature.Name,
- Key: 'j',
- Modifier: gocui.ModNone,
- Handler: gui.nextRemote,
- Display: "j",
- Description: "Down",
- Vital: false,
- }, {
- View: remoteViewFeature.Name,
- Key: 'k',
- Modifier: gocui.ModNone,
- Handler: gui.previousRemote,
- Display: "k",
- Description: "Up",
- Vital: false,
- },
- // Remote Branch View Controls
- {
- View: remoteBranchViewFeature.Name,
- Key: gocui.KeyArrowDown,
- Modifier: gocui.ModNone,
- Handler: gui.nextRemoteBranch,
- Display: "↓",
- Description: "Iterate over remote branches",
- Vital: false,
- }, {
- View: remoteBranchViewFeature.Name,
- Key: gocui.KeyArrowUp,
- Modifier: gocui.ModNone,
- Handler: gui.previousRemoteBranch,
- Display: "↑",
- Description: "Iterate over remote branches",
- Vital: false,
- }, {
- View: remoteBranchViewFeature.Name,
- Key: 'j',
- Modifier: gocui.ModNone,
- Handler: gui.nextRemoteBranch,
- Display: "j",
- Description: "Down",
- Vital: false,
- }, {
- View: remoteBranchViewFeature.Name,
- Key: 'k',
- Modifier: gocui.ModNone,
- Handler: gui.previousRemoteBranch,
- Display: "k",
- Description: "Up",
- Vital: false,
}, {
View: remoteBranchViewFeature.Name,
Key: 's',
@@ -484,40 +420,6 @@ func (gui *Gui) generateKeybindings() error {
Display: "s",
Description: "Synch with Remote",
Vital: true,
- },
- // Commit View Controls
- {
- View: commitViewFeature.Name,
- Key: gocui.KeyArrowDown,
- Modifier: gocui.ModNone,
- Handler: gui.nextCommit,
- Display: "↓",
- Description: "Iterate over commits",
- Vital: false,
- }, {
- View: commitViewFeature.Name,
- Key: gocui.KeyArrowUp,
- Modifier: gocui.ModNone,
- Handler: gui.prevCommit,
- Display: "↑",
- Description: "Iterate over commits",
- Vital: false,
- }, {
- View: commitViewFeature.Name,
- Key: 'j',
- Modifier: gocui.ModNone,
- Handler: gui.nextCommit,
- Display: "j",
- Description: "Down",
- Vital: false,
- }, {
- View: commitViewFeature.Name,
- Key: 'k',
- Modifier: gocui.ModNone,
- Handler: gui.prevCommit,
- Display: "k",
- Description: "Up",
- Vital: false,
}, {
View: commitViewFeature.Name,
Key: 'd',
diff --git a/pkg/gui/remotebranchview.go b/pkg/gui/remotebranchview.go
deleted file mode 100644
index 4974808..0000000
--- a/pkg/gui/remotebranchview.go
+++ /dev/null
@@ -1,78 +0,0 @@
-package gui
-
-import (
- "fmt"
-
- "github.com/isacikgoz/gitbatch/pkg/git"
- "github.com/jroimartin/gocui"
-)
-
-// updates the remotebranchview for given entity
-func (gui *Gui) updateRemoteBranches(g *gocui.Gui, entity *git.RepoEntity) error {
- var err error
- out, err := g.View(remoteBranchViewFeature.Name)
- if err != nil {
- return err
- }
- out.Clear()
- currentindex := 0
- trb := len(entity.Remote.Branches)
- if trb > 0 {
- for i, r := range entity.Remote.Branches {
- rName := r.Name
- if r.Deleted {
- rName = rName + ws + dirty
- }
- if r.Name == entity.Remote.Branch.Name {
- currentindex = i
- fmt.Fprintln(out, selectionIndicator+rName)
- continue
- }
- fmt.Fprintln(out, tab+rName)
- }
- if err = gui.smartAnchorRelativeToLine(out, currentindex, trb); err != nil {
- return err
- }
- }
- return nil
-}
-
-// iteration handler for the remotebranchview
-func (gui *Gui) syncRemoteBranch(g *gocui.Gui, v *gocui.View) error {
- var err error
- entity := gui.getSelectedRepository()
- if err = git.Fetch(entity, git.FetchOptions{
- RemoteName: entity.Remote.Name,
- Prune: true,
- }); err != nil {
- return err
- }
- // have no idea why this works..
- // some time need to fix, movement aint bad huh?
- gui.nextRemote(g, v)
- gui.previousRemote(g, v)
- err = gui.updateRemoteBranches(g, entity)
- return err
-}
-
-// iteration handler for the remotebranchview
-func (gui *Gui) nextRemoteBranch(g *gocui.Gui, v *gocui.View) error {
- var err error
- entity := gui.getSelectedRepository()
- if err = entity.Remote.NextRemoteBranch(); err != nil {
- return err
- }
- err = gui.updateRemoteBranches(g, entity)
- return err
-}
-
-// iteration handler for the remotebranchview
-func (gui *Gui) previousRemoteBranch(g *gocui.Gui, v *gocui.View) error {
- var err error
- entity := gui.getSelectedRepository()
- if err = entity.Remote.PreviousRemoteBranch(); err != nil {
- return err
- }
- err = gui.updateRemoteBranches(g, entity)
- return err
-}
diff --git a/pkg/gui/remotesview.go b/pkg/gui/remotesview.go
deleted file mode 100644
index 51323dc..0000000
--- a/pkg/gui/remotesview.go
+++ /dev/null
@@ -1,73 +0,0 @@
-package gui
-
-import (
- "fmt"
-
- "github.com/isacikgoz/gitbatch/pkg/git"
- "github.com/jroimartin/gocui"
-)
-
-// updates the remotesview for given entity
-func (gui *Gui) updateRemotes(g *gocui.Gui, entity *git.RepoEntity) error {
- var err error
- out, err := g.View(remoteViewFeature.Name)
- if err != nil {
- return err
- }
- out.Clear()
-
- currentindex := 0
- totalRemotes := len(entity.Remotes)
- if totalRemotes > 0 {
- for i, r := range entity.Remotes {
- // TODO: maybe the text styling can be moved to textstyle.go file
- _, shortURL := trimRemoteURL(r.URL[0])
- suffix := shortURL
- if r.Name == entity.Remote.Name {
- currentindex = i
- fmt.Fprintln(out, selectionIndicator+r.Name+": "+suffix)
- continue
- }
- fmt.Fprintln(out, tab+r.Name+": "+suffix)
- }
- if err = gui.smartAnchorRelativeToLine(out, currentindex, totalRemotes); err != nil {
- return err
- }
- }
- return nil
-}
-
-// iteration handler for the remotesview
-func (gui *Gui) nextRemote(g *gocui.Gui, v *gocui.View) error {
- var err error
- entity := gui.getSelectedRepository()
- if err = entity.NextRemote(); err != nil {
- return err
- }
- if err = gui.remoteChangeFollowUp(g, entity); err != nil {
- return err
- }
- return err
-}
-
-// iteration handler for the remotesview
-func (gui *Gui) previousRemote(g *gocui.Gui, v *gocui.View) error {
- var err error
- entity := gui.getSelectedRepository()
- if err = entity.PreviousRemote(); err != nil {
- return err
- }
- if err = gui.remoteChangeFollowUp(g, entity); err != nil {
- return err
- }
- return err
-}
-
-// after checkout a remote some refreshments needed
-func (gui *Gui) remoteChangeFollowUp(g *gocui.Gui, entity *git.RepoEntity) (err error) {
- if err = gui.updateRemotes(g, entity); err != nil {
- return err
- }
- err = gui.updateRemoteBranches(g, entity)
- return err
-}
diff --git a/pkg/gui/sideviews.go b/pkg/gui/sideviews.go
new file mode 100644
index 0000000..57518f3
--- /dev/null
+++ b/pkg/gui/sideviews.go
@@ -0,0 +1,236 @@
+package gui
+
+import (
+ "fmt"
+
+ "github.com/isacikgoz/gitbatch/pkg/git"
+ "github.com/jroimartin/gocui"
+)
+
+var (
+ sideViews = []viewFeature{remoteViewFeature, remoteBranchViewFeature, branchViewFeature, commitViewFeature}
+)
+
+// updates the remotesview for given entity
+func (gui *Gui) updateRemotes(g *gocui.Gui, entity *git.RepoEntity) error {
+ var err error
+ out, err := g.View(remoteViewFeature.Name)
+ if err != nil {
+ return err
+ }
+ out.Clear()
+
+ currentindex := 0
+ totalRemotes := len(entity.Remotes)
+ if totalRemotes > 0 {
+ for i, r := range entity.Remotes {
+ // TODO: maybe the text styling can be moved to textstyle.go file
+ _, shortURL := trimRemoteURL(r.URL[0])
+ suffix := shortURL
+ if r.Name == entity.Remote.Name {
+ currentindex = i
+ fmt.Fprintln(out, selectionIndicator+r.Name+": "+suffix)
+ continue
+ }
+ fmt.Fprintln(out, tab+r.Name+": "+suffix)
+ }
+ if err = gui.smartAnchorRelativeToLine(out, currentindex, totalRemotes); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// updates the remotebranchview for given entity
+func (gui *Gui) updateRemoteBranches(g *gocui.Gui, entity *git.RepoEntity) error {
+ var err error
+ out, err := g.View(remoteBranchViewFeature.Name)
+ if err != nil {
+ return err
+ }
+ out.Clear()
+ currentindex := 0
+ trb := len(entity.Remote.Branches)
+ if trb > 0 {
+ for i, r := range entity.Remote.Branches {
+ rName := r.Name
+ if r.Deleted {
+ rName = rName + ws + dirty
+ }
+ if r.Name == entity.Remote.Branch.Name {
+ currentindex = i
+ fmt.Fprintln(out, selectionIndicator+rName)
+ continue
+ }
+ fmt.Fprintln(out, tab+rName)
+ }
+ if err = gui.smartAnchorRelativeToLine(out, currentindex, trb); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// updates the branchview for given entity
+func (gui *Gui) updateBranch(g *gocui.Gui, entity *git.RepoEntity) error {
+ var err error
+ out, err := g.View(branchViewFeature.Name)
+ if err != nil {
+ return err
+ }
+ out.Clear()
+
+ currentindex := 0
+ totalbranches := len(entity.Branches)
+ for i, b := range entity.Branches {
+ if b.Name == entity.Branch.Name {
+ currentindex = i
+ fmt.Fprintln(out, selectionIndicator+b.Name)
+ continue
+ }
+ fmt.Fprintln(out, tab+b.Name)
+ }
+ err = gui.smartAnchorRelativeToLine(out, currentindex, totalbranches)
+ return err
+}
+
+// updates the commitsview for given entity
+func (gui *Gui) updateCommits(g *gocui.Gui, entity *git.RepoEntity) error {
+ var err error
+ out, err := g.View(commitViewFeature.Name)
+ if err != nil {
+ return err
+ }
+ out.Clear()
+
+ currentindex := 0
+ totalcommits := len(entity.Commits)
+ for i, c := range entity.Commits {
+ var body string
+ if c.CommitType == git.EvenCommit {
+ body = cyan.Sprint(c.Hash[:hashLength]) + " " + c.Message
+ } else if c.CommitType == git.LocalCommit {
+ body = blue.Sprint(c.Hash[:hashLength]) + " " + c.Message
+ } else {
+ body = yellow.Sprint(c.Hash[:hashLength]) + " " + c.Message
+ }
+ if c.Hash == entity.Commit.Hash {
+ currentindex = i
+ fmt.Fprintln(out, selectionIndicator+body)
+ continue
+ }
+ fmt.Fprintln(out, tab+body)
+ }
+ if err = gui.smartAnchorRelativeToLine(out, currentindex, totalcommits); err != nil {
+ return err
+ }
+ return err
+}
+
+func (gui *Gui) sideViewsNextItem(g *gocui.Gui, v *gocui.View) error {
+ var err error
+ entity := gui.getSelectedRepository()
+ switch viewName := v.Name(); viewName {
+ case remoteBranchViewFeature.Name:
+ if err = entity.Remote.NextRemoteBranch(); err != nil {
+ return err
+ }
+ err = gui.updateRemoteBranches(g, entity)
+ case remoteViewFeature.Name:
+ if err = entity.NextRemote(); err != nil {
+ return err
+ }
+ err = gui.remoteChangeFollowUp(g, entity)
+ case branchViewFeature.Name:
+ if err = entity.Checkout(entity.NextBranch()); err != nil {
+ err = gui.openErrorView(g, err.Error(),
+ "You should manually resolve this issue",
+ branchViewFeature.Name)
+ return err
+ }
+ err = gui.checkoutFollowUp(g, entity)
+ case commitViewFeature.Name:
+ if err = entity.NextCommit(); err != nil {
+ return err
+ }
+ err = gui.updateCommits(g, entity)
+ }
+ return err
+}
+
+func (gui *Gui) sideViewsPreviousItem(g *gocui.Gui, v *gocui.View) error {
+ var err error
+ entity := gui.getSelectedRepository()
+ switch viewName := v.Name(); viewName {
+ case remoteBranchViewFeature.Name:
+ if err = entity.Remote.PreviousRemoteBranch(); err != nil {
+ return err
+ }
+ err = gui.updateRemoteBranches(g, entity)
+ case remoteViewFeature.Name:
+ if err = entity.PreviousRemote(); err != nil {
+ return err
+ }
+ err = gui.remoteChangeFollowUp(g, entity)
+ case branchViewFeature.Name:
+ if err = entity.Checkout(entity.PreviousBranch()); err != nil {
+ err = gui.openErrorView(g, err.Error(),
+ "You should manually resolve this issue",
+ branchViewFeature.Name)
+ return err
+ }
+ err = gui.checkoutFollowUp(g, entity)
+ case commitViewFeature.Name:
+ if err = entity.PreviousCommit(); err != nil {
+ return err
+ }
+ err = gui.updateCommits(g, entity)
+ }
+ return err
+}
+
+// basically does fetch --prune
+func (gui *Gui) syncRemoteBranch(g *gocui.Gui, v *gocui.View) error {
+ var err error
+ entity := gui.getSelectedRepository()
+ if err = git.Fetch(entity, git.FetchOptions{
+ RemoteName: entity.Remote.Name,
+ Prune: true,
+ }); err != nil {
+ return err
+ }
+ vr, err := g.View(remoteViewFeature.Name)
+ if err != nil {
+ return err
+ }
+ // have no idea why this works..
+ // some time need to fix, movement aint bad huh?
+ gui.sideViewsNextItem(g, vr)
+ gui.sideViewsPreviousItem(g, vr)
+ err = gui.updateRemoteBranches(g, entity)
+ return err
+}
+
+// after checkout a remote some refreshments needed
+func (gui *Gui) remoteChangeFollowUp(g *gocui.Gui, entity *git.RepoEntity) (err error) {
+ if err = gui.updateRemotes(g, entity); err != nil {
+ return err
+ }
+ err = gui.updateRemoteBranches(g, entity)
+ return err
+}
+
+// after checkout a branch some refreshments needed
+func (gui *Gui) checkoutFollowUp(g *gocui.Gui, entity *git.RepoEntity) (err error) {
+ if err = gui.updateBranch(g, entity); err != nil {
+ return err
+ }
+ if err = gui.updateCommits(g, entity); err != nil {
+ return err
+ }
+ if err = gui.updateRemoteBranches(g, entity); err != nil {
+ return err
+ }
+ err = gui.refreshMain(g)
+ return err
+}