146 lines
3.4 KiB
Go
146 lines
3.4 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"flag"
|
|
"fmt"
|
|
"github.com/Jguer/go-alpm/v2"
|
|
log "github.com/sirupsen/logrus"
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
"somegit.dev/ALHP/ALHP.GO/ent/dbpackage"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
APIBase = "https://api.alhp.dev/"
|
|
)
|
|
|
|
var (
|
|
jsonFlag = flag.Bool("j", false, "output as JSON")
|
|
debugFlag = flag.Bool("d", false, "enable debug output")
|
|
exitCodeFlag = flag.Bool("e", false, "exit with non-zero if one of your packages is in queue")
|
|
)
|
|
|
|
type JSONOut struct {
|
|
InQueue int `json:"in_queue"`
|
|
PackageBases []string `json:"package_base"`
|
|
}
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
|
|
if *debugFlag {
|
|
log.SetLevel(log.DebugLevel)
|
|
}
|
|
|
|
h, er := alpm.Initialize("/", "/var/lib/pacman")
|
|
if er != nil {
|
|
log.Errorf("error initializing alpm library: %v", er)
|
|
os.Exit(1)
|
|
}
|
|
defer func(h *alpm.Handle) {
|
|
err := h.Release()
|
|
if err != nil {
|
|
log.Errorf("error releasing alpm library: %v", err)
|
|
}
|
|
}(h)
|
|
|
|
db, er := h.LocalDB()
|
|
if er != nil {
|
|
log.Errorf("error initializing alpm library: %v", er)
|
|
os.Exit(1)
|
|
}
|
|
|
|
alhpQueue, err := ALHPBuildQueuePkgbase()
|
|
if err != nil {
|
|
log.Errorf("error getting build queue from ALHP api: %v", err)
|
|
os.Exit(1)
|
|
}
|
|
log.Debugf("alhp build queue length: %d", len(alhpQueue))
|
|
|
|
var packagesInQueue []string
|
|
for _, pkg := range db.PkgCache().Slice() {
|
|
if Find(alhpQueue, pkg.Base()) != -1 {
|
|
log.Debugf("found package in queue: %s", pkg.Base())
|
|
packagesInQueue = append(packagesInQueue, pkg.Base())
|
|
}
|
|
}
|
|
|
|
if len(packagesInQueue) > 0 {
|
|
log.Debugf("found %d of your local packages in queue", packagesInQueue)
|
|
if *jsonFlag {
|
|
err = json.NewEncoder(os.Stdout).Encode(JSONOut{
|
|
InQueue: len(packagesInQueue),
|
|
PackageBases: packagesInQueue,
|
|
})
|
|
if err != nil {
|
|
log.Errorf("error encoding JSON: %v", err)
|
|
os.Exit(1)
|
|
}
|
|
} else {
|
|
fmt.Println(strings.Join(packagesInQueue, "\n"))
|
|
}
|
|
|
|
if *exitCodeFlag {
|
|
os.Exit(20)
|
|
}
|
|
}
|
|
}
|
|
|
|
func Find[T comparable](arr []T, match T) int {
|
|
for i, v := range arr {
|
|
if v == match {
|
|
return i
|
|
}
|
|
}
|
|
|
|
return -1
|
|
}
|
|
|
|
type ThinPackage struct {
|
|
Pkgbase string `json:"pkgbase"`
|
|
Repo string `json:"repo"`
|
|
SplitPackages []string `json:"split_packages"`
|
|
Status dbpackage.Status `json:"status"`
|
|
SkipReason *string `json:"skip_reason,omitempty"`
|
|
LTO dbpackage.Lto `json:"lto"`
|
|
DebugSymbols dbpackage.DebugSymbols `json:"debug_symbols"`
|
|
ArchVersion string `json:"arch_version"`
|
|
RepoVersion string `json:"repo_version"`
|
|
BuildDate *string `json:"build_date,omitempty"`
|
|
PeakMem *string `json:"peak_mem,omitempty"`
|
|
}
|
|
|
|
type PackageResponse struct {
|
|
Packages []*ThinPackage `json:"packages"`
|
|
Total int `json:"total"`
|
|
Offset int `json:"offset"`
|
|
Limit int `json:"limit"`
|
|
}
|
|
|
|
func ALHPBuildQueuePkgbase() ([]string, error) {
|
|
resp, err := http.Get(fmt.Sprintf("%spackages?status=built&status=building&status=queued&limit=0&offset=0", APIBase))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
bResp, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
jResp := new(PackageResponse)
|
|
if err = json.Unmarshal(bResp, jResp); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
respArray := make([]string, len(jResp.Packages))
|
|
for i := range jResp.Packages {
|
|
respArray[i] = jResp.Packages[i].Pkgbase
|
|
}
|
|
return respArray, nil
|
|
}
|