summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIbrahim Serdar Acikgoz <serdaracikgoz86@gmail.com>2018-11-28 00:24:03 +0300
committerIbrahim Serdar Acikgoz <serdaracikgoz86@gmail.com>2018-11-28 00:24:03 +0300
commit2788833387e48ea2b3885b4ec65edc01fcceb078 (patch)
tree1f7ac84e2bdd0f1201ca8f02a05c6782d286264f
parentminor format changes (diff)
downloadgitbatch-2788833387e48ea2b3885b4ec65edc01fcceb078.tar.gz
improving queue mechanism
-rw-r--r--pkg/git/repository.go9
-rw-r--r--pkg/gui/branchview.go2
-rw-r--r--pkg/gui/execview.go72
-rw-r--r--pkg/gui/gui-util.go1
-rw-r--r--pkg/gui/mainview.go13
-rw-r--r--pkg/job/job.go35
6 files changed, 83 insertions, 49 deletions
diff --git a/pkg/git/repository.go b/pkg/git/repository.go
index 2c3770c..3b81b0f 100644
--- a/pkg/git/repository.go
+++ b/pkg/git/repository.go
@@ -23,6 +23,15 @@ type RepoEntity struct {
Marked bool
}
+type RepoState uint8
+
+const (
+ Available RepoState = 0
+ Queued RepoState = 1
+ Success RepoState = 2
+ Fail RepoState = 3
+)
+
func InitializeRepository(directory string) (entity *RepoEntity, err error) {
file, err := os.Open(directory)
if err != nil {
diff --git a/pkg/gui/branchview.go b/pkg/gui/branchview.go
index 5e61bff..ef0ca6c 100644
--- a/pkg/gui/branchview.go
+++ b/pkg/gui/branchview.go
@@ -29,7 +29,7 @@ func (gui *Gui) updateBranch(g *gocui.Gui, entity *git.RepoEntity) error {
fmt.Fprintln(out, selectionIndicator()+b.Name+suffix)
continue
}
- fmt.Fprintln(out, tab()+b.Name+suffix)
+ fmt.Fprintln(out, tab()+b.Name)
}
if err = gui.smartAnchorRelativeToLine(out, currentindex, totalbranches); err != nil {
return err
diff --git a/pkg/gui/execview.go b/pkg/gui/execview.go
index e258f43..eba8509 100644
--- a/pkg/gui/execview.go
+++ b/pkg/gui/execview.go
@@ -3,42 +3,54 @@ package gui
import (
"errors"
"fmt"
- "strconv"
+ // "strconv"
"github.com/jroimartin/gocui"
)
func (gui *Gui) openExecConfirmationView(g *gocui.Gui, v *gocui.View) error {
- maxX, maxY := g.Size()
- err := gui.State.Queue.StartNext()
- if err != nil {
- return err
- }
- if mrs, _ := gui.getMarkedEntities(); len(mrs) < 1 {
- return nil
- }
-
- v, err = g.SetView(execViewFeature.Name, maxX/2-35, maxY/2-5, maxX/2+35, maxY/2+5)
- if err != nil {
- if err != gocui.ErrUnknownView {
- return err
- }
- v.Title = gui.State.Mode.DisplayString + " Confirmation"
- v.Wrap = true
- mrs, _ := gui.getMarkedEntities()
- jobs := strconv.Itoa(len(mrs)) + " " + gui.State.Mode.ExecString + ":"
- fmt.Fprintln(v, jobs)
- for _, r := range mrs {
- line := " - " + green.Sprint(r.Name) + ": " + r.Remote.Name + green.Sprint(" → ") + r.Branch.Name
- fmt.Fprintln(v, line)
+ // maxX, maxY := g.Size()
+ go func(gui_go *Gui, g_go *gocui.Gui) {
+ for {
+ finished, err := gui_go.State.Queue.StartNext()
+ g.Update(func(gu *gocui.Gui) error {
+ gui_go.refreshMain(gu)
+ return nil
+ })
+ if err != nil {
+ return
+ }
+ if finished {
+ return
+ }
}
- ps := red.Sprint("Note:") + " When " + gui.State.Mode.CommandString + " operation is completed, you will be notified."
- fmt.Fprintln(v, "\n"+ps)
- }
- gui.updateKeyBindingsView(g, execViewFeature.Name)
- if _, err := g.SetCurrentView(execViewFeature.Name); err != nil {
- return err
- }
+ }(gui, g)
+ return nil
+ // if mrs, _ := gui.getMarkedEntities(); len(mrs) < 1 {
+ // return nil
+ // }
+
+ // v, err := g.SetView(execViewFeature.Name, maxX/2-35, maxY/2-5, maxX/2+35, maxY/2+5)
+ // if err != nil {
+ // if err != gocui.ErrUnknownView {
+ // return err
+ // }
+ // v.Title = gui.State.Mode.DisplayString + " Confirmation"
+ // v.Wrap = true
+ // mrs, _ := gui.getMarkedEntities()
+ // jobs := strconv.Itoa(len(mrs)) + " " + gui.State.Mode.ExecString + ":"
+ // fmt.Fprintln(v, jobs)
+ // for _, r := range mrs {
+ // line := " - " + green.Sprint(r.Name) + ": " + r.Remote.Name + green.Sprint(" → ") + r.Branch.Name
+ // fmt.Fprintln(v, line)
+ // }
+ // ps := red.Sprint("Note:") + " When " + gui.State.Mode.CommandString + " operation is completed, you will be notified."
+ // fmt.Fprintln(v, "\n"+ps)
+ // }
+ // gui.updateKeyBindingsView(g, execViewFeature.Name)
+ // if _, err := g.SetCurrentView(execViewFeature.Name); err != nil {
+ // return err
+ // }
return nil
}
diff --git a/pkg/gui/gui-util.go b/pkg/gui/gui-util.go
index 73e9c85..7f30bed 100644
--- a/pkg/gui/gui-util.go
+++ b/pkg/gui/gui-util.go
@@ -44,7 +44,6 @@ func (gui *Gui) switchMode(g *gocui.Gui, v *gocui.View) error {
gui.State.Mode = fetchMode
}
gui.updateKeyBindingsView(g, mainViewFeature.Name)
- gui.unMarkAllRepositories(g, v)
return nil
}
diff --git a/pkg/gui/mainview.go b/pkg/gui/mainview.go
index 346bdc4..4c4ce36 100644
--- a/pkg/gui/mainview.go
+++ b/pkg/gui/mainview.go
@@ -112,18 +112,21 @@ func (gui *Gui) markRepository(g *gocui.Gui, v *gocui.View) error {
return nil
}
if !r.Marked {
- r.Mark()
err := gui.State.Queue.AddJob(&job.Job{
JobType: job.Fetch,
- RepoID: r.RepoID,
- Name: r.Name,
+ Entity: r,
Args: make([]string, 0),
})
if err != nil {
- return err
+ if err = gui.openErrorView(g, "This repository is already queued for another operation",
+ "You switch mode and deselect to remove operaton from the queue"); err != nil {
+ return err
+ }
+ return nil
}
+ r.Mark()
} else {
- err := gui.State.Queue.RemoveFromQueue(r.RepoID)
+ err := gui.State.Queue.RemoveFromQueue(r)
if err != nil {
return err
}
diff --git a/pkg/job/job.go b/pkg/job/job.go
index 0e756d8..eaa1820 100644
--- a/pkg/job/job.go
+++ b/pkg/job/job.go
@@ -3,12 +3,14 @@ package job
import (
"errors"
"fmt"
+ "time"
+
+ "github.com/isacikgoz/gitbatch/pkg/git"
)
type Job struct {
JobType JobType
- RepoID string
- Name string
+ Entity *git.RepoEntity
Args []string
}
@@ -29,11 +31,13 @@ func CreateJob() (j *Job, err error) {
}
func (job *Job) start() error {
+ time.Sleep(2*time.Second)
+ job.Entity.Marked = false
switch mode := job.JobType; mode {
case Fetch:
- fmt.Println("Fetch operation is started")
+ job.Entity.PullTest()
case Pull:
- fmt.Println("Pull operation is started")
+ job.Entity.PullTest()
default:
return errors.New("Unknown job type")
}
@@ -49,7 +53,7 @@ func CreateJobQueue() (jobQueue *JobQueue) {
func (jobQueue *JobQueue) AddJob(j *Job) error {
for _, job := range jobQueue.series {
- if job.RepoID == j.RepoID && job.JobType == j.JobType {
+ if job.Entity.RepoID == j.Entity.RepoID && job.JobType == j.JobType {
return errors.New("Same job already is in the queue")
}
}
@@ -57,18 +61,25 @@ func (jobQueue *JobQueue) AddJob(j *Job) error {
return nil
}
-func (jobQueue *JobQueue) StartNext() error {
- lastJob := jobQueue.series[len(jobQueue.series)-1]
- if err := lastJob.start(); err != nil {
- return err
+func (jobQueue *JobQueue) StartNext() (finished bool, err error) {
+ finished = false
+ if len(jobQueue.series) < 1 {
+ finished = true
+ return finished, nil
}
- return nil
+ i := len(jobQueue.series)-1
+ lastJob := jobQueue.series[i]
+ jobQueue.series = jobQueue.series[:i]
+ if err = lastJob.start(); err != nil {
+ return finished, err
+ }
+ return finished, nil
}
-func (jobQueue *JobQueue) RemoveFromQueue(repoID string) error {
+func (jobQueue *JobQueue) RemoveFromQueue(entity *git.RepoEntity) error {
removed := false
for i, job := range jobQueue.series {
- if job.RepoID == repoID {
+ if job.Entity.RepoID == entity.RepoID {
jobQueue.series = append(jobQueue.series[:i], jobQueue.series[i+1:]...)
removed = true
}