summaryrefslogtreecommitdiff
path: root/pkg/gui/sideviews.go
diff options
context:
space:
mode:
authorIbrahim Serdar Acikgoz <serdaracikgoz86@gmail.com>2018-12-15 00:16:34 +0300
committerIbrahim Serdar Acikgoz <serdaracikgoz86@gmail.com>2018-12-15 00:16:34 +0300
commiteb4260349098014f450b992e9c2659338a504a20 (patch)
treeba3aba50389743db8c5b216ad08303d0a7493956 /pkg/gui/sideviews.go
parentadded new screen cast and minor bugfixes (diff)
downloadgitbatch-eb4260349098014f450b992e9c2659338a504a20.tar.gz
minor code reduction
Diffstat (limited to 'pkg/gui/sideviews.go')
-rw-r--r--pkg/gui/sideviews.go236
1 files changed, 236 insertions, 0 deletions
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
+}