diff options
| author | Ibrahim Serdar Acikgoz <serdaracikgoz86@gmail.com> | 2018-11-28 00:24:03 +0300 |
|---|---|---|
| committer | Ibrahim Serdar Acikgoz <serdaracikgoz86@gmail.com> | 2018-11-28 00:24:03 +0300 |
| commit | 2788833387e48ea2b3885b4ec65edc01fcceb078 (patch) | |
| tree | 1f7ac84e2bdd0f1201ca8f02a05c6782d286264f | |
| parent | minor format changes (diff) | |
| download | gitbatch-2788833387e48ea2b3885b4ec65edc01fcceb078.tar.gz | |
improving queue mechanism
| -rw-r--r-- | pkg/git/repository.go | 9 | ||||
| -rw-r--r-- | pkg/gui/branchview.go | 2 | ||||
| -rw-r--r-- | pkg/gui/execview.go | 72 | ||||
| -rw-r--r-- | pkg/gui/gui-util.go | 1 | ||||
| -rw-r--r-- | pkg/gui/mainview.go | 13 | ||||
| -rw-r--r-- | pkg/job/job.go | 35 |
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 } |
