Sync a declarative package list with the pacman package manager
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

74 lines
1.3 KiB

package validation
import (
"errors"
"fmt"
"os"
"os/exec"
"time"
)
var LockFile = "/var/lib/pacman/db.lock"
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
}
age := time.Since(info.ModTime())
if age > 24*time.Hour {
cmd := exec.Command("pacman", "-Syy")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
return fmt.Errorf("failed to refresh pacman database: %w", err)
}
}
return nil
}
func validatePackages(packages []string) error {
for _, pkg := range packages {
if err := validatePackage(pkg); err != nil {
return err
}
}
return nil
}
func validatePackage(name string) error {
cmd := exec.Command("pacman", "-Qip", name)
if err := cmd.Run(); err == nil {
return nil
}
cmd = exec.Command("pacman", "-Sip", name)
if err := cmd.Run(); err == nil {
return nil
}
cmd = exec.Command("aur", "search", name)
if out, err := cmd.Output(); err == nil && len(out) > 0 {
return nil
}
return fmt.Errorf("package not found: %s", name)
}