summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorİbrahim Serdar Açıkgöz <serdaracikgoz86@gmail.com>2019-01-04 14:07:44 +0300
committerİbrahim Serdar Açıkgöz <serdaracikgoz86@gmail.com>2019-01-04 14:07:44 +0300
commit164958183d3e44db91d9a6b1511bfd2be47efd4f (patch)
tree2885ba7847f3ad9b52338e6b88f6fe0523bfb92b
parentadd state to repository and some renaming (diff)
downloadgitbatch-164958183d3e44db91d9a6b1511bfd2be47efd4f.tar.gz
sort at lazy start
-rw-r--r--core/errors/util-errors.go4
-rw-r--r--gui/gui.go47
2 files changed, 50 insertions, 1 deletions
diff --git a/core/errors/util-errors.go b/core/errors/util-errors.go
index c734904..f922617 100644
--- a/core/errors/util-errors.go
+++ b/core/errors/util-errors.go
@@ -37,6 +37,8 @@ var (
ErrConflictAfterMerge = errors.New("conflict while merging")
// ErrUnmergedFiles possibly occurs after a conflict
ErrUnmergedFiles = errors.New("unmerged files detected")
+ // ErrReferenceBroken thrown when unable to resolve reference
+ ErrReferenceBroken = errors.New("unable to resolve reference")
// ErrUnclassified is unconsidered error type
ErrUnclassified = errors.New("unclassified error")
)
@@ -54,6 +56,8 @@ func ParseGitError(out string, err error) error {
return ErrConflictAfterMerge
} else if strings.Contains(out, "error: Pulling is not possible because you have unmerged files.") {
return ErrUnmergedFiles
+ } else if strings.Contains(out, "unable to resolve reference") {
+ return ErrReferenceBroken
}
return ErrUnclassified
}
diff --git a/gui/gui.go b/gui/gui.go
index 84bdb51..3bfa9e2 100644
--- a/gui/gui.go
+++ b/gui/gui.go
@@ -2,6 +2,7 @@ package gui
import (
"sync"
+ "unicode"
"github.com/isacikgoz/gitbatch/core/git"
"github.com/isacikgoz/gitbatch/core/job"
@@ -132,11 +133,55 @@ func (gui *Gui) Run() error {
}
func (gui *Gui) addRepository(r *git.Repository) {
- gui.State.Repositories = append(gui.State.Repositories, r)
+ gui.mutex.Lock()
+ gui.State.Repositories = gui.appendAlphabetically(r)
+ gui.mutex.Unlock()
r.On(git.RepositoryUpdated, gui.repositoryUpdated)
+
gui.repositoryUpdated(nil)
}
+func (gui *Gui) appendAlphabetically(r *git.Repository) []*git.Repository {
+ rs := gui.State.Repositories
+ i := len(rs) - 1
+ if i >= 0 && rs[i] != nil && !less(rs[i], r) {
+ rs = append(rs, nil)
+ copy(rs[i+1:], rs[i:])
+ rs[i] = r
+ } else {
+ rs = append(rs, r)
+ }
+ return rs
+}
+
+func less(ri, rj *git.Repository) bool {
+ iRunes := []rune(ri.Name)
+ jRunes := []rune(rj.Name)
+
+ max := len(iRunes)
+ if max > len(jRunes) {
+ max = len(jRunes)
+ }
+
+ for idx := 0; idx < max; idx++ {
+ ir := iRunes[idx]
+ jr := jRunes[idx]
+
+ lir := unicode.ToLower(ir)
+ ljr := unicode.ToLower(jr)
+
+ if lir != ljr {
+ return lir < ljr
+ }
+
+ // the lowercase runes are the same, so compare the original
+ if ir != jr {
+ return ir < jr
+ }
+ }
+ return false
+}
+
// set the layout and create views with their default size, name etc. values
// TODO: window sizes can be handled better
func (gui *Gui) layout(g *gocui.Gui) error {