Implement debian snapshot mr api
This commit is contained in:
parent
35d34fdbe0
commit
b1d034a7fe
2
go.mod
2
go.mod
@ -6,6 +6,8 @@ replace code.dumpstack.io/tools/out-of-tree/qemu => ./qemu
|
|||||||
|
|
||||||
replace code.dumpstack.io/tools/out-of-tree/config => ./config
|
replace code.dumpstack.io/tools/out-of-tree/config => ./config
|
||||||
|
|
||||||
|
replace code.dumpstack.io/tools/out-of-tree/kernel => ./kernel
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/alecthomas/kong v0.7.1
|
github.com/alecthomas/kong v0.7.1
|
||||||
github.com/go-git/go-git/v5 v5.6.1
|
github.com/go-git/go-git/v5 v5.6.1
|
||||||
|
122
kernel/debian/snapshot/mr/mr.go
Normal file
122
kernel/debian/snapshot/mr/mr.go
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
package mr
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
)
|
||||||
|
|
||||||
|
const apiURL = "https://snapshot.debian.org/mr"
|
||||||
|
|
||||||
|
// https://salsa.debian.org/snapshot-team/snapshot/blob/master/API
|
||||||
|
|
||||||
|
// /mr/package/<package>/
|
||||||
|
type Package struct {
|
||||||
|
Comment string `json:"_comment"`
|
||||||
|
Package string `json:"package"`
|
||||||
|
Result []struct {
|
||||||
|
Version string `json:"version"`
|
||||||
|
} `json:"result"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// /mr/package/<package>/<version>/binpackages
|
||||||
|
type Binpackages struct {
|
||||||
|
Comment string `json:"_comment"`
|
||||||
|
Package string `json:"package"`
|
||||||
|
Result []struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Version string `json:"version"`
|
||||||
|
} `json:"result"`
|
||||||
|
Version string `json:"version"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// /mr/binary/<binary>/
|
||||||
|
type Binary struct {
|
||||||
|
Comment string `json:"_comment"`
|
||||||
|
Binary string `json:"binary"`
|
||||||
|
Result []struct {
|
||||||
|
BinaryVersion string `json:"binary_version"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Source string `json:"source"`
|
||||||
|
Version string `json:"version"`
|
||||||
|
} `json:"result"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// /mr/binary/<binpkg>/<binversion>/binfiles
|
||||||
|
type Binfiles struct {
|
||||||
|
Comment string `json:"_comment"`
|
||||||
|
Binary string `json:"binary"`
|
||||||
|
BinaryVersion string `json:"binary_version"`
|
||||||
|
Result []struct {
|
||||||
|
Architecture string `json:"architecture"`
|
||||||
|
Hash string `json:"hash"`
|
||||||
|
} `json:"result"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Fileinfo struct {
|
||||||
|
ArchiveName string `json:"archive_name"`
|
||||||
|
FirstSeen string `json:"first_seen"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Path string `json:"path"`
|
||||||
|
Size int `json:"size"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// /mr/file/<hash>/info
|
||||||
|
type Info struct {
|
||||||
|
Comment string `json:"_comment"`
|
||||||
|
Hash string `json:"hash"`
|
||||||
|
Result []Fileinfo `json:"result"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func getJson(url string, target interface{}) (err error) {
|
||||||
|
resp, err := http.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
return json.NewDecoder(resp.Body).Decode(target)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPackage(name string) (pkg Package, err error) {
|
||||||
|
query := fmt.Sprintf("%s/package/%s/", apiURL,
|
||||||
|
url.QueryEscape(name),
|
||||||
|
)
|
||||||
|
err = getJson(query, &pkg)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetBinpackages(name, version string) (binpkgs Binpackages, err error) {
|
||||||
|
query := fmt.Sprintf("%s/package/%s/%s/binpackages", apiURL,
|
||||||
|
url.QueryEscape(name),
|
||||||
|
url.QueryEscape(version),
|
||||||
|
)
|
||||||
|
err = getJson(query, &binpkgs)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetBinary(pkg string) (binary Binary, err error) {
|
||||||
|
query := fmt.Sprintf("%s/binary/%s/", apiURL,
|
||||||
|
url.QueryEscape(pkg),
|
||||||
|
)
|
||||||
|
err = getJson(query, &binary)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetBinfiles(binpkg, binversion string) (binfiles Binfiles, err error) {
|
||||||
|
query := fmt.Sprintf("%s/binary/%s/%s/binfiles", apiURL,
|
||||||
|
url.QueryEscape(binpkg),
|
||||||
|
url.QueryEscape(binversion),
|
||||||
|
)
|
||||||
|
err = getJson(query, &binfiles)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetInfo(hash string) (info Info, err error) {
|
||||||
|
query := fmt.Sprintf("%s/file/%s/info", apiURL,
|
||||||
|
url.QueryEscape(hash),
|
||||||
|
)
|
||||||
|
err = getJson(query, &info)
|
||||||
|
return
|
||||||
|
}
|
50
kernel/debian/snapshot/mr/mr_test.go
Normal file
50
kernel/debian/snapshot/mr/mr_test.go
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package mr
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMR(t *testing.T) {
|
||||||
|
name := "linux"
|
||||||
|
t.Log(name)
|
||||||
|
|
||||||
|
pkg, err := GetPackage(name)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
version := pkg.Result[0].Version
|
||||||
|
t.Log(version)
|
||||||
|
|
||||||
|
binpkgs, err := GetBinpackages(name, version)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
binpkgName := binpkgs.Result[0].Name
|
||||||
|
t.Log(binpkgName)
|
||||||
|
|
||||||
|
binary, err := GetBinary(binpkgName)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
binaryName := binary.Result[0].Name
|
||||||
|
binaryVersion := binary.Result[0].BinaryVersion
|
||||||
|
t.Log(binaryName, binaryVersion)
|
||||||
|
|
||||||
|
binfiles, err := GetBinfiles(binaryName, binaryVersion)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
hash := binfiles.Result[0].Hash
|
||||||
|
t.Log(hash)
|
||||||
|
|
||||||
|
info, err := GetInfo(hash)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Log(info)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user