Integrate dyalpm for local/sync package queries

This commit is contained in:
AI Bot
2026-04-14 21:46:02 +02:00
committed by Riyyi
parent 2a90c0cd11
commit be9c9c6df1
8 changed files with 351 additions and 206 deletions
+4 -105
View File
@@ -1,12 +1,7 @@
package validation
import (
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"net/url"
"os"
"os/exec"
"time"
@@ -14,33 +9,10 @@ import (
var LockFile = "/var/lib/pacman/db.lock"
const AURInfoURL = "https://aur.archlinux.org/rpc?v=5&type=info"
func CheckDBFreshness() error {
start := time.Now()
fmt.Fprintf(os.Stderr, "[debug] CheckDBFreshness: starting...\n")
type AURResponse struct {
Results []AURResult `json:"results"`
}
type AURResult struct {
Name string `json:"Name"`
}
func Validate(packages []string) error {
if len(packages) == 0 {
return errors.New("no packages found")
}
if err := checkDBFreshness(); err != nil {
return err
}
if err := validatePackages(packages); err != nil {
return err
}
return nil
}
func checkDBFreshness() error {
info, err := os.Stat(LockFile)
if err != nil {
return nil
@@ -56,79 +28,6 @@ func checkDBFreshness() error {
}
}
fmt.Fprintf(os.Stderr, "[debug] CheckDBFreshness: done (%.2fs)\n", time.Since(start).Seconds())
return nil
}
func validatePackages(packages []string) error {
var pacmanPkgs []string
var aurPkgs []string
for _, pkg := range packages {
if inPacman(pkg) {
pacmanPkgs = append(pacmanPkgs, pkg)
} else {
aurPkgs = append(aurPkgs, pkg)
}
}
if len(aurPkgs) > 0 {
foundAUR := batchSearchAUR(aurPkgs)
for _, pkg := range aurPkgs {
if !foundAUR[pkg] {
return fmt.Errorf("package not found: %s", pkg)
}
}
}
return nil
}
func inPacman(name string) bool {
cmd := exec.Command("pacman", "-Qip", name)
if err := cmd.Run(); err == nil {
return true
}
cmd = exec.Command("pacman", "-Sip", name)
if err := cmd.Run(); err == nil {
return true
}
return false
}
func batchSearchAUR(packages []string) map[string]bool {
result := make(map[string]bool)
if len(packages) == 0 {
return result
}
v := url.Values{}
v.Set("type", "info")
for _, pkg := range packages {
v.Add("arg[]", pkg)
}
resp, err := http.Get(AURInfoURL + "&" + v.Encode())
if err != nil {
return result
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return result
}
var aurResp AURResponse
if err := json.Unmarshal(body, &aurResp); err != nil {
return result
}
for _, r := range aurResp.Results {
result[r.Name] = true
}
return result
}