forked from security/hakurei
cmd/pkgserver: add createPackageIndex
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"cmp"
|
||||||
"context"
|
"context"
|
||||||
"embed"
|
"embed"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -8,7 +9,9 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
|
"slices"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
"unique"
|
||||||
|
|
||||||
"hakurei.app/command"
|
"hakurei.app/command"
|
||||||
"hakurei.app/container/check"
|
"hakurei.app/container/check"
|
||||||
@@ -61,16 +64,61 @@ func serveAPI(pi *PackageIndex) func(w http.ResponseWriter, r *http.Request) {
|
|||||||
type SortOrders int
|
type SortOrders int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
NameAscending SortOrders = iota
|
DeclarationDescending SortOrders = iota
|
||||||
|
DeclarationAscending
|
||||||
|
NameAscending
|
||||||
NameDescending
|
NameDescending
|
||||||
|
limitSortOrders
|
||||||
)
|
)
|
||||||
|
|
||||||
type PackageIndex struct {
|
type PackageIndex [limitSortOrders][rosa.PresetUnexportedStart]*PackageIndexEntry
|
||||||
sorts [][]*pkg.Artifact
|
|
||||||
|
type PackageIndexEntry struct {
|
||||||
|
id unique.Handle[pkg.ID]
|
||||||
|
name string
|
||||||
|
description string
|
||||||
|
website string
|
||||||
|
version string
|
||||||
|
status []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func createPackageIndex(cache *pkg.Cache, report *rosa.Report) *PackageIndex {
|
func createPackageIndex(cache *pkg.Cache, report *rosa.Report) *PackageIndex {
|
||||||
return &PackageIndex{}
|
var index PackageIndex
|
||||||
|
var work []PackageIndexEntry
|
||||||
|
for p := range rosa.PresetUnexportedStart {
|
||||||
|
m := rosa.GetMetadata(p)
|
||||||
|
v := rosa.Std.Version(p)
|
||||||
|
a := rosa.Std.Load(p)
|
||||||
|
id := cache.Ident(a)
|
||||||
|
status, n := report.ArtifactOf(id)
|
||||||
|
work[p] = PackageIndexEntry{
|
||||||
|
id: id,
|
||||||
|
name: m.Name,
|
||||||
|
description: m.Description,
|
||||||
|
website: m.Website,
|
||||||
|
version: v,
|
||||||
|
status: status[:n],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i, p := range work {
|
||||||
|
index[DeclarationAscending][i] = &p
|
||||||
|
}
|
||||||
|
slices.Reverse(work)
|
||||||
|
for i, p := range work {
|
||||||
|
index[DeclarationDescending][i] = &p
|
||||||
|
}
|
||||||
|
slices.SortFunc(work, func(a PackageIndexEntry, b PackageIndexEntry) int {
|
||||||
|
return cmp.Compare(a.name, b.name)
|
||||||
|
})
|
||||||
|
for i, p := range work {
|
||||||
|
index[NameAscending][i] = &p
|
||||||
|
}
|
||||||
|
slices.Reverse(work)
|
||||||
|
for i, p := range work {
|
||||||
|
index[NameDescending][i] = &p
|
||||||
|
}
|
||||||
|
|
||||||
|
return &index
|
||||||
}
|
}
|
||||||
func main() {
|
func main() {
|
||||||
log.SetFlags(0)
|
log.SetFlags(0)
|
||||||
@@ -99,13 +147,16 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
pi := createPackageIndex(cache, report)
|
defer report.HandleAccess(&err)()
|
||||||
|
index := createPackageIndex(cache, report)
|
||||||
http.HandleFunc("GET /{$}", serveWebUI)
|
http.HandleFunc("GET /{$}", serveWebUI)
|
||||||
http.HandleFunc("GET /favicon.ico", serveStaticContent)
|
http.HandleFunc("GET /favicon.ico", serveStaticContent)
|
||||||
http.HandleFunc("GET /static/", serveStaticContent)
|
http.HandleFunc("GET /static/", serveStaticContent)
|
||||||
http.HandleFunc("GET /api/", serveAPI(pi))
|
http.HandleFunc("GET /api/", serveAPI(index))
|
||||||
http.ListenAndServe(fmt.Sprintf(":%d", flagPort), nil)
|
err = http.ListenAndServe(fmt.Sprintf(":%d", flagPort), nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}).Flag(
|
}).Flag(
|
||||||
&flagBaseDir,
|
&flagBaseDir,
|
||||||
|
|||||||
Reference in New Issue
Block a user