diff options
| -rw-r--r-- | pkg/app/app.go | 4 | ||||
| -rw-r--r-- | pkg/app/files.go | 2 | ||||
| -rw-r--r-- | pkg/gui/branchview.go | 74 | ||||
| -rw-r--r-- | pkg/gui/commitsview.go | 67 | ||||
| -rw-r--r-- | pkg/gui/keybindings.go | 174 | ||||
| -rw-r--r-- | pkg/gui/remotebranchview.go | 78 | ||||
| -rw-r--r-- | pkg/gui/remotesview.go | 73 | ||||
| -rw-r--r-- | pkg/gui/sideviews.go | 236 |
8 files changed, 277 insertions, 431 deletions
diff --git a/pkg/app/app.go b/pkg/app/app.go index 740e3ff..21b87a6 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -36,9 +36,9 @@ func Setup(setupConfig SetupConfig) (*App, error) { var directories []string if len(app.Config.Directories) <= 0 || setupConfig.IgnoreConfig { - directories = generateDirectories(setupConfig.Directories, setupConfig.Depth) + directories = GenerateDirectories(setupConfig.Directories, setupConfig.Depth) } else { - directories = generateDirectories(app.Config.Directories, setupConfig.Depth) + directories = GenerateDirectories(app.Config.Directories, setupConfig.Depth) } // create a gui.Gui struct and set it as App's gui diff --git a/pkg/app/files.go b/pkg/app/files.go index 25e5074..03e4014 100644 --- a/pkg/app/files.go +++ b/pkg/app/files.go @@ -11,7 +11,7 @@ import ( // generateDirectories returns poosible git repositories to pipe into git pkg's // load function -func generateDirectories(directories []string, depth int) (gitDirectories []string) { +func GenerateDirectories(directories []string, depth int) (gitDirectories []string) { for i := 0; i <= depth; i++ { nonrepos, repos := walkRecursive(directories, gitDirectories) directories = nonrepos 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 +} |
