summaryrefslogtreecommitdiff
path: root/pkg/gui/commitview.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/gui/commitview.go')
-rw-r--r--pkg/gui/commitview.go187
1 files changed, 187 insertions, 0 deletions
diff --git a/pkg/gui/commitview.go b/pkg/gui/commitview.go
new file mode 100644
index 0000000..94ef574
--- /dev/null
+++ b/pkg/gui/commitview.go
@@ -0,0 +1,187 @@
+package gui
+
+import (
+ "errors"
+ "fmt"
+ "regexp"
+
+ "github.com/isacikgoz/gitbatch/pkg/git"
+ "github.com/jroimartin/gocui"
+)
+
+var (
+ commitFrameViewFeature = viewFeature{Name: "commitframe", Title: " Frame "}
+ commitUserNameLabelFeature = viewFeature{Name: "commitusernamelabel", Title: " Name: "}
+ commitUserEmailLabelViewFeature = viewFeature{Name: "commituseremaillabel", Title: " E-Mail: "}
+
+ // these views used as a input for the credentials
+ commitMessageViewFeature = viewFeature{Name: "commitmessage", Title: " Commit Mesage "}
+ commitUserUserViewFeature = viewFeature{Name: "commitusername", Title: " Name "}
+ commitUserEmailViewFeature = viewFeature{Name: "commituseremail", Title: " E-Mail "}
+
+ commitViews = []viewFeature{commitMessageViewFeature, commitUserUserViewFeature, commitUserEmailViewFeature}
+ commitLabelViews = []viewFeature{commitFrameViewFeature, commitUserNameLabelFeature, commitUserEmailLabelViewFeature}
+)
+
+// open the commit message views
+func (gui *Gui) openCommitMessageView(g *gocui.Gui, v *gocui.View) error {
+ maxX, maxY := g.Size()
+ commitMesageReturnView = v.Name()
+ v_frame, err := g.SetView(commitFrameViewFeature.Name, maxX/2-30, maxY/2-4, maxX/2+30, maxY/2+3)
+ if err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ v_frame.Frame = true
+ fmt.Fprintln(v_frame, " Enter your commit message:")
+ }
+ v, err = g.SetView(commitMessageViewFeature.Name, maxX/2-29, maxY/2-3, maxX/2+29, maxY/2)
+ if err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ v.Frame = false
+ v.Wrap = true
+ v.Editable = true
+ v.Editor = gocui.DefaultEditor
+ g.Cursor = true
+ }
+ if err := gui.openCommitUserNameView(g); err != nil {
+ return err
+ }
+ if err := gui.openCommitUserEmailView(g); err != nil {
+ return err
+ }
+ gui.updateKeyBindingsView(g, commitMessageViewFeature.Name)
+ if _, err := g.SetCurrentView(commitMessageViewFeature.Name); err != nil {
+ return err
+ }
+ return nil
+}
+
+// open an error view to inform user with a message and a useful note
+func (gui *Gui) openCommitUserNameView(g *gocui.Gui) error {
+ entity := gui.getSelectedRepository()
+ maxX, maxY := g.Size()
+ // first, create the label for user
+ vlabel, err := g.SetView(commitUserNameLabelFeature.Name, maxX/2-30, maxY/2, maxX/2-19, maxY/2+2)
+ if err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ fmt.Fprintln(vlabel, commitUserNameLabelFeature.Title)
+ vlabel.Frame = false
+ }
+ // second, crete the user input
+ v, err := g.SetView(commitUserUserViewFeature.Name, maxX/2-18, maxY/2, maxX/2+29, maxY/2+2)
+ if err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ name, err := git.Config(entity, git.ConfigOptions{
+ Section: "user",
+ Option: "name",
+ })
+ if err != nil {
+ return err
+ }
+ fmt.Fprintln(v, name)
+ v.Editable = true
+ v.Frame = false
+ }
+ return nil
+}
+
+// open an error view to inform user with a message and a useful note
+func (gui *Gui) openCommitUserEmailView(g *gocui.Gui) error {
+ entity := gui.getSelectedRepository()
+ maxX, maxY := g.Size()
+ // first, create the label for password
+ vlabel, err := g.SetView(commitUserEmailLabelViewFeature.Name, maxX/2-30, maxY/2+1, maxX/2-19, maxY/2+3)
+ if err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ fmt.Fprintln(vlabel, commitUserEmailLabelViewFeature.Title)
+ vlabel.Frame = false
+ }
+ // second, crete the masked password input
+ v, err := g.SetView(commitUserEmailViewFeature.Name, maxX/2-18, maxY/2+1, maxX/2+29, maxY/2+3)
+ if err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ email, err := git.Config(entity, git.ConfigOptions{
+ Section: "user",
+ Option: "email",
+ })
+ if err != nil {
+ return err
+ }
+ fmt.Fprintln(v, email)
+ v.Editable = true
+ v.Frame = false
+ }
+ return nil
+}
+
+// close the opened commite mesage view
+func (gui *Gui) submitCommitMessageView(g *gocui.Gui, v *gocui.View) error {
+ entity := gui.getSelectedRepository()
+ // in order to read buffer of the views, first we need to find'em
+ v_msg, err := g.View(commitMessageViewFeature.Name)
+ v_name, err := g.View(commitUserUserViewFeature.Name)
+ v_email, err := g.View(commitUserEmailViewFeature.Name)
+ // the return string of the views contain trailing new lines
+ re := regexp.MustCompile(`\r?\n`)
+ // TODO: maybe intentionally added new lines?
+ msg := re.ReplaceAllString(v_msg.ViewBuffer(), "")
+ name := re.ReplaceAllString(v_name.ViewBuffer(), "")
+ email := re.ReplaceAllString(v_email.ViewBuffer(), "")
+ if len(email) <= 0 {
+ return errors.New("User email needs to be provided")
+ }
+ err = git.CommitCommand(entity, git.CommitOptions{
+ CommitMsg: msg,
+ User: name,
+ Email: email,
+ })
+ if err != nil {
+ return err
+ }
+ entity.Refresh()
+ err = gui.closeCommitMessageView(g, v)
+ return err
+}
+
+// focus to next view
+func (gui *Gui) nextCommitView(g *gocui.Gui, v *gocui.View) error {
+ err := gui.nextViewOfGroup(g, v, commitViews)
+ return err
+}
+
+// close the opened commite mesage view
+func (gui *Gui) closeCommitMessageView(g *gocui.Gui, v *gocui.View) error {
+ entity := gui.getSelectedRepository()
+ g.Cursor = false
+ for _, view := range commitViews {
+ if err := g.DeleteView(view.Name); err != nil {
+ return err
+ }
+ }
+ for _, view := range commitLabelViews {
+ if err := g.DeleteView(view.Name); err != nil {
+ return err
+ }
+ }
+ if err := gui.refreshMain(g); err != nil {
+ return err
+ }
+ if err := gui.refreshViews(g, entity); err != nil {
+ return err
+ }
+ if err := refreshAllStatusView(g, entity, true); err != nil {
+ return err
+ }
+ return gui.closeViewCleanup(commitMesageReturnView)
+}