in web/server.go [416:510]
func (s *Server) serveListReposErr(q query.Q, qStr string, w http.ResponseWriter, r *http.Request) error {
ctx := r.Context()
repos, err := s.Searcher.List(ctx, q)
if err != nil {
return err
}
qvals := r.URL.Query()
order := qvals.Get("order")
switch order {
case "", "name", "revname":
sort.Slice(repos.Repos, func(i, j int) bool {
return strings.Compare(repos.Repos[i].Repository.Name, repos.Repos[j].Repository.Name) < 0
})
case "size", "revsize":
sort.Slice(repos.Repos, func(i, j int) bool {
return repos.Repos[i].Stats.ContentBytes < repos.Repos[j].Stats.ContentBytes
})
case "time", "revtime":
sort.Slice(repos.Repos, func(i, j int) bool {
return repos.Repos[i].IndexMetadata.IndexTime.Before(
repos.Repos[j].IndexMetadata.IndexTime)
})
default:
return fmt.Errorf("got unknown sort key %q, allowed [rev]name, [rev]time, [rev]size", order)
}
if strings.HasPrefix(order, "rev") {
for i, j := 0, len(repos.Repos)-1; i < j; {
repos.Repos[i], repos.Repos[j] = repos.Repos[j], repos.Repos[i]
i++
j--
}
}
aggregate := zoekt.RepoStats{
Repos: len(repos.Repos),
}
for _, s := range repos.Repos {
aggregate.Add(&s.Stats)
}
res := RepoListInput{
Last: LastInput{
Query: qStr,
AutoFocus: true,
},
Stats: aggregate,
}
numStr := qvals.Get("num")
num, err := strconv.Atoi(numStr)
if err != nil || num <= 0 {
num = 0
}
if num > 0 {
if num > len(repos.Repos) {
num = len(repos.Repos)
}
repos.Repos = repos.Repos[:num]
}
for _, r := range repos.Repos {
t := s.getTemplate(r.Repository.CommitURLTemplate)
repo := Repository{
Name: r.Repository.Name,
URL: r.Repository.URL,
IndexTime: r.IndexMetadata.IndexTime,
Size: r.Stats.ContentBytes,
Files: int64(r.Stats.Documents),
}
for _, b := range r.Repository.Branches {
var buf bytes.Buffer
if err := t.Execute(&buf, b); err != nil {
return err
}
repo.Branches = append(repo.Branches,
Branch{
Name: b.Name,
Version: b.Version,
URL: buf.String(),
})
}
res.Repos = append(res.Repos, repo)
}
var buf bytes.Buffer
if err := s.repolist.Execute(&buf, &res); err != nil {
return err
}
w.Write(buf.Bytes())
return nil
}