tree-wide: use a standard project layout
Keep main.go files under cmd/ and internal libraries under internal/. This will allow us to add more exutables under cmd/ (whereas only one was possible when main.go was kept in the root). Signed-off-by: Tom Gundersen <teg@jklm.no>
This commit is contained in:
parent
11af3f0c0b
commit
b60f580d92
6 changed files with 5 additions and 5 deletions
90
internal/rpmmd/repository.go
Normal file
90
internal/rpmmd/repository.go
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
package rpmmd
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"os/exec"
|
||||
"sort"
|
||||
"time"
|
||||
)
|
||||
|
||||
type RepoConfig struct {
|
||||
Id string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
BaseURL string `json:"baseurl,omitempty"`
|
||||
Metalink string `json:"metalink,omitempty"`
|
||||
MirrorList string `json:"mirrorlist,omitempty"`
|
||||
}
|
||||
|
||||
type PackageList []Package
|
||||
|
||||
type Package struct {
|
||||
Name string
|
||||
Summary string
|
||||
Description string
|
||||
URL string
|
||||
Epoch uint
|
||||
Version string
|
||||
Release string
|
||||
Arch string
|
||||
BuildTime time.Time
|
||||
License string
|
||||
}
|
||||
|
||||
type PackageSpec struct {
|
||||
Name string `json:"name"`
|
||||
Epoch uint `json:"epoch,omitempty"`
|
||||
Version string `json:"version,omitempty"`
|
||||
Release string `json:"release,omitempty"`
|
||||
Arch string `json:"arch,omitempty"`
|
||||
}
|
||||
|
||||
func runDNF(command string, arguments []string, result interface{}) error {
|
||||
argv := append([]string{"dnf-json", command}, arguments...)
|
||||
|
||||
cmd := exec.Command("python3", argv...)
|
||||
stdout, err := cmd.StdoutPipe()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = cmd.Start()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = json.NewDecoder(stdout).Decode(result)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return cmd.Wait()
|
||||
}
|
||||
|
||||
func FetchPackageList(repo RepoConfig) (PackageList, error) {
|
||||
var packages PackageList
|
||||
err := runDNF("dump", nil, &packages)
|
||||
return packages, err
|
||||
}
|
||||
|
||||
func Depsolve(specs ...string) ([]PackageSpec, error) {
|
||||
var dependencies []PackageSpec
|
||||
err := runDNF("depsolve", specs, &dependencies)
|
||||
return dependencies, err
|
||||
}
|
||||
|
||||
func (packages PackageList) Search(name string) (int, int) {
|
||||
first := sort.Search(len(packages), func(i int) bool {
|
||||
return packages[i].Name >= name
|
||||
})
|
||||
|
||||
if first == len(packages) || packages[first].Name != name {
|
||||
return first, 0
|
||||
}
|
||||
|
||||
last := first + 1
|
||||
for last < len(packages) && packages[last].Name == name {
|
||||
last++
|
||||
}
|
||||
|
||||
return first, last - first
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue