aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Muré <batolettre@gmail.com>2018-09-02 16:36:48 +0200
committerMichael Muré <batolettre@gmail.com>2018-09-02 16:36:48 +0200
commit0728c0050d82171659474900c407e1b6dcee43a5 (patch)
tree73473697a596bb0e93b30ab9a68fd25e7c3af98c
parente3c445fa85db65b084580a38b919f17b8f8c2b68 (diff)
downloadgit-bug-0728c0050d82171659474900c407e1b6dcee43a5.tar.gz
cache: provide a generic bug sorting function
-rw-r--r--cache/repo_cache.go67
-rw-r--r--cache/sorting.go73
-rw-r--r--commands/ls.go2
-rw-r--r--graphql/resolvers/repo.go3
-rw-r--r--termui/bug_table.go6
5 files changed, 89 insertions, 62 deletions
diff --git a/cache/repo_cache.go b/cache/repo_cache.go
index 8f43ad71..d5dd4c59 100644
--- a/cache/repo_cache.go
+++ b/cache/repo_cache.go
@@ -8,7 +8,6 @@ import (
"io/ioutil"
"os"
"path"
- "sort"
"strconv"
"strings"
@@ -154,6 +153,18 @@ func (c *RepoCache) buildAllExcerpt() {
}
}
+func (c *RepoCache) allExcerpt() []BugExcerpt {
+ result := make([]BugExcerpt, len(c.excerpts))
+
+ i := 0
+ for _, val := range c.excerpts {
+ result[i] = val
+ i++
+ }
+
+ return result
+}
+
func (c *RepoCache) ResolveBug(id string) (*BugCache, error) {
cached, ok := c.bugs[id]
if ok {
@@ -204,60 +215,6 @@ func (c *RepoCache) ResolveBugPrefix(prefix string) (*BugCache, error) {
return cached, nil
}
-func (c *RepoCache) AllBugOrderById() []string {
- result := make([]string, len(c.excerpts))
-
- i := 0
- for key := range c.excerpts {
- result[i] = key
- i++
- }
-
- sort.Strings(result)
-
- return result
-}
-
-func (c *RepoCache) AllBugsOrderByEdit() []string {
- excerpts := make([]BugExcerpt, len(c.excerpts))
-
- i := 0
- for _, val := range c.excerpts {
- excerpts[i] = val
- i++
- }
-
- sort.Sort(BugsByEditTime(excerpts))
-
- result := make([]string, len(excerpts))
-
- for i, val := range excerpts {
- result[i] = val.Id
- }
-
- return result
-}
-
-func (c *RepoCache) AllBugsOrderByCreation() []string {
- excerpts := make([]BugExcerpt, len(c.excerpts))
-
- i := 0
- for _, val := range c.excerpts {
- excerpts[i] = val
- i++
- }
-
- sort.Sort(BugsByCreationTime(excerpts))
-
- result := make([]string, len(excerpts))
-
- for i, val := range excerpts {
- result[i] = val.Id
- }
-
- return result
-}
-
// ClearAllBugs clear all bugs kept in memory
func (c *RepoCache) ClearAllBugs() {
c.bugs = make(map[string]*BugCache)
diff --git a/cache/sorting.go b/cache/sorting.go
new file mode 100644
index 00000000..eeeb315c
--- /dev/null
+++ b/cache/sorting.go
@@ -0,0 +1,73 @@
+package cache
+
+import "sort"
+
+type OrderBy int
+
+const (
+ _ OrderBy = iota
+ OrderById
+ OrderByCreation
+ OrderByEdit
+)
+
+type OrderDirection int
+
+const (
+ _ OrderDirection = iota
+ OrderAscending
+ OrderDescending
+)
+
+func (c *RepoCache) AllBugsId(order OrderBy, direction OrderDirection) []string {
+ if order == OrderById {
+ return c.orderIds(direction)
+ }
+
+ excerpts := c.allExcerpt()
+
+ var sorter sort.Interface
+
+ switch order {
+ case OrderByCreation:
+ sorter = BugsByCreationTime(excerpts)
+ case OrderByEdit:
+ sorter = BugsByEditTime(excerpts)
+ default:
+ panic("missing sort type")
+ }
+
+ if direction == OrderDescending {
+ sorter = sort.Reverse(sorter)
+ }
+
+ sort.Sort(sorter)
+
+ result := make([]string, len(excerpts))
+
+ for i, val := range excerpts {
+ result[i] = val.Id
+ }
+
+ return result
+}
+
+func (c *RepoCache) orderIds(direction OrderDirection) []string {
+ result := make([]string, len(c.excerpts))
+
+ i := 0
+ for key := range c.excerpts {
+ result[i] = key
+ i++
+ }
+
+ var sorter sort.Interface = sort.StringSlice(result)
+
+ if direction == OrderDescending {
+ sorter = sort.Reverse(sorter)
+ }
+
+ sort.Sort(sorter)
+
+ return result
+}
diff --git a/commands/ls.go b/commands/ls.go
index 03ea1255..ea5418c4 100644
--- a/commands/ls.go
+++ b/commands/ls.go
@@ -15,7 +15,7 @@ func runLsBug(cmd *cobra.Command, args []string) error {
return err
}
- allIds := backend.AllBugsOrderByCreation()
+ allIds := backend.AllBugsId(cache.OrderByCreation, cache.OrderAscending)
for _, id := range allIds {
b, err := backend.ResolveBug(id)
diff --git a/graphql/resolvers/repo.go b/graphql/resolvers/repo.go
index fc82faf4..75c1307d 100644
--- a/graphql/resolvers/repo.go
+++ b/graphql/resolvers/repo.go
@@ -4,6 +4,7 @@ import (
"context"
"github.com/MichaelMure/git-bug/bug"
+ "github.com/MichaelMure/git-bug/cache"
"github.com/MichaelMure/git-bug/graphql/connections"
"github.com/MichaelMure/git-bug/graphql/models"
)
@@ -19,7 +20,7 @@ func (repoResolver) AllBugs(ctx context.Context, obj *models.Repository, after *
}
// Simply pass a []string with the ids to the pagination algorithm
- source := obj.Repo.AllBugOrderById()
+ source := obj.Repo.AllBugsId(cache.OrderByCreation, cache.OrderAscending)
// The edger create a custom edge holding just the id
edger := func(id string, offset int) connections.Edge {
diff --git a/termui/bug_table.go b/termui/bug_table.go
index 00b0ffb4..55c7a2d5 100644
--- a/termui/bug_table.go
+++ b/termui/bug_table.go
@@ -212,7 +212,7 @@ func (bt *bugTable) disable(g *gocui.Gui) error {
}
func (bt *bugTable) paginate(max int) error {
- bt.allIds = bt.repo.AllBugsOrderByCreation()
+ bt.allIds = bt.repo.AllBugsId(cache.OrderByCreation, cache.OrderAscending)
return bt.doPaginate(max)
}
@@ -355,8 +355,6 @@ func (bt *bugTable) cursorClamp(v *gocui.View) error {
func (bt *bugTable) nextPage(g *gocui.Gui, v *gocui.View) error {
_, max := v.Size()
- bt.allIds = bt.repo.AllBugsOrderByCreation()
-
if bt.pageCursor+max >= len(bt.allIds) {
return nil
}
@@ -369,8 +367,6 @@ func (bt *bugTable) nextPage(g *gocui.Gui, v *gocui.View) error {
func (bt *bugTable) previousPage(g *gocui.Gui, v *gocui.View) error {
_, max := v.Size()
- bt.allIds = bt.repo.AllBugsOrderByCreation()
-
bt.pageCursor = maxInt(0, bt.pageCursor-max)
return bt.doPaginate(max)