func (s *releaseServer) ListReleases(req *services.ListReleasesRequest, stream services.ReleaseService_ListReleasesServer) error { if !checkClientVersion(stream.Context()) { return errIncompatibleVersion } if len(req.StatusCodes) == 0 { req.StatusCodes = []release.Status_Code{release.Status_DEPLOYED} } //rels, err := s.env.Releases.ListDeployed() rels, err := s.env.Releases.ListFilterAll(func(r *release.Release) bool { for _, sc := range req.StatusCodes { if sc == r.Info.Status.Code { return true } } return false }) if err != nil { return err } if len(req.Filter) != 0 { rels, err = filterReleases(req.Filter, rels) if err != nil { return err } } total := int64(len(rels)) switch req.SortBy { case services.ListSort_NAME: relutil.SortByName(rels) case services.ListSort_LAST_RELEASED: relutil.SortByDate(rels) } if req.SortOrder == services.ListSort_DESC { ll := len(rels) rr := make([]*release.Release, ll) for i, item := range rels { rr[ll-i-1] = item } rels = rr } l := int64(len(rels)) if req.Offset != "" { i := -1 for ii, cur := range rels { if cur.Name == req.Offset { i = ii } } if i == -1 { return fmt.Errorf("offset %q not found", req.Offset) } if len(rels) < i { return fmt.Errorf("no items after %q", req.Offset) } rels = rels[i:] l = int64(len(rels)) } if req.Limit == 0 { req.Limit = ListDefaultLimit } next := "" if l > req.Limit { next = rels[req.Limit].Name rels = rels[0:req.Limit] l = int64(len(rels)) } res := &services.ListReleasesResponse{ Next: next, Count: l, Total: total, Releases: rels, } return stream.Send(res) }
func (s *releaseServer) ListReleases(req *services.ListReleasesRequest, stream services.ReleaseService_ListReleasesServer) error { rels, err := s.env.Releases.List() if err != nil { return err } if len(req.Filter) != 0 { rels, err = filterReleases(req.Filter, rels) if err != nil { return err } } total := int64(len(rels)) switch req.SortBy { case services.ListSort_NAME: sort.Sort(byName(rels)) case services.ListSort_LAST_RELEASED: sort.Sort(byDate(rels)) } if req.SortOrder == services.ListSort_DESC { ll := len(rels) rr := make([]*release.Release, ll) for i, item := range rels { rr[ll-i-1] = item } rels = rr } l := int64(len(rels)) if req.Offset != "" { i := -1 for ii, cur := range rels { if cur.Name == req.Offset { i = ii } } if i == -1 { return fmt.Errorf("offset %q not found", req.Offset) } if len(rels) < i { return fmt.Errorf("no items after %q", req.Offset) } rels = rels[i:] l = int64(len(rels)) } if req.Limit == 0 { req.Limit = ListDefaultLimit } next := "" if l > req.Limit { next = rels[req.Limit].Name rels = rels[0:req.Limit] l = int64(len(rels)) } res := &services.ListReleasesResponse{ Next: next, Count: l, Total: total, Releases: rels, } stream.Send(res) return nil }