status: allow for package search endpoint
OBS has issues searching for packages in scmsynced projects. Since we have a list of all the repositories, we can allow for a search endpoint here. /search?q=term1&q=term2... results is JSON [ project1/pkgA, project2/pkgB ]
This commit is contained in:
@@ -20,6 +20,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -268,6 +269,32 @@ func main() {
|
|||||||
|
|
||||||
res.Write(BuildStatusSvg(nil, &common.PackageBuildStatus{Package: pkg, Code: "unknown"}))
|
res.Write(BuildStatusSvg(nil, &common.PackageBuildStatus{Package: pkg, Code: "unknown"}))
|
||||||
})
|
})
|
||||||
|
http.HandleFunc("GET /search", func(res http.ResponseWriter, req *http.Request) {
|
||||||
|
common.LogInfo("GET /serach?" + req.URL.RawQuery)
|
||||||
|
queries := req.URL.Query()
|
||||||
|
if !queries.Has("q") {
|
||||||
|
res.WriteHeader(400)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
names := queries["q"]
|
||||||
|
if len(names) < 1 || len(names) > 10 {
|
||||||
|
res.WriteHeader(400)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
packages := FindPackages(names)
|
||||||
|
data, err := json.MarshalIndent(packages, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
res.WriteHeader(500)
|
||||||
|
common.LogError("Error in marshalling data.", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res.Write(data)
|
||||||
|
res.WriteHeader(200)
|
||||||
|
})
|
||||||
|
|
||||||
http.HandleFunc("GET /buildlog/{Project}/{Package}/{Repository}/{Arch}", func(res http.ResponseWriter, req *http.Request) {
|
http.HandleFunc("GET /buildlog/{Project}/{Package}/{Repository}/{Arch}", func(res http.ResponseWriter, req *http.Request) {
|
||||||
prj := req.PathValue("Project")
|
prj := req.PathValue("Project")
|
||||||
pkg := req.PathValue("Package")
|
pkg := req.PathValue("Package")
|
||||||
|
|||||||
@@ -110,6 +110,33 @@ func FindRepoResults(project, repo string) []*common.BuildResult {
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func FindPackages(search_terms []string) []string {
|
||||||
|
RepoStatusLock.RLock()
|
||||||
|
defer RepoStatusLock.RUnlock()
|
||||||
|
|
||||||
|
data := make([]string, 0, 100)
|
||||||
|
for _, repo := range RepoStatus {
|
||||||
|
for _, status := range repo.Status {
|
||||||
|
pkg := status.Package
|
||||||
|
match := true
|
||||||
|
for _, term := range search_terms {
|
||||||
|
match = match && strings.Contains(pkg, term)
|
||||||
|
}
|
||||||
|
|
||||||
|
if match {
|
||||||
|
entry := repo.Project + "/" + repo.Status[0].Package
|
||||||
|
if idx, found := slices.BinarySearch(data, entry); !found {
|
||||||
|
data = slices.Insert(data, idx, entry)
|
||||||
|
if len(data) >= 100 {
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
func FindAndUpdateProjectResults(project string) []*common.BuildResult {
|
func FindAndUpdateProjectResults(project string) []*common.BuildResult {
|
||||||
res := FindProjectResults(project)
|
res := FindProjectResults(project)
|
||||||
wg := &sync.WaitGroup{}
|
wg := &sync.WaitGroup{}
|
||||||
|
|||||||
Reference in New Issue
Block a user