dnf-json: read arguments as JSON from stdin

This allows us to have more expressive input arguments.
This commit is contained in:
Lars Karlitski 2019-11-03 17:48:39 +01:00 committed by Tom Gundersen
parent 0feb4e4d44
commit cae1fdd04d
2 changed files with 28 additions and 14 deletions

View file

@ -11,16 +11,9 @@ def timestamp_to_rfc3339(timestamp):
return d.strftime('%Y-%m-%dT%H:%M:%SZ')
# base.sack.query().filter(provides=str(reldep))
try:
command = sys.argv[1]
arguments = sys.argv[2:]
except IndexError:
command = "list"
arguments = []
call = json.load(sys.stdin)
command = call["command"]
arguments = call.get("arguments", {})
base = dnf.Base()

View file

@ -39,10 +39,22 @@ type PackageSpec struct {
Arch string `json:"arch,omitempty"`
}
func runDNF(command string, arguments []string, result interface{}) error {
argv := append([]string{"dnf-json", command}, arguments...)
func runDNF(command string, arguments interface{}, result interface{}) error {
var call = struct {
Command string `json:"command"`
Arguments interface{} `json:"arguments,omitempty"`
}{
command,
arguments,
}
cmd := exec.Command("python3", "dnf-json")
stdin, err := cmd.StdinPipe()
if err != nil {
return err
}
cmd := exec.Command("python3", argv...)
cmd.Stderr = os.Stderr
stdout, err := cmd.StdoutPipe()
if err != nil {
@ -54,6 +66,12 @@ func runDNF(command string, arguments []string, result interface{}) error {
return err
}
err = json.NewEncoder(stdin).Encode(call)
if err != nil {
return err
}
stdin.Close()
err = json.NewDecoder(stdout).Decode(result)
if err != nil {
return err
@ -69,8 +87,11 @@ func FetchPackageList(repo RepoConfig) (PackageList, error) {
}
func Depsolve(specs ...string) ([]PackageSpec, error) {
var arguments = struct {
PackageSpecs []string `json:"package-specs"`
}{ specs }
var dependencies []PackageSpec
err := runDNF("depsolve", specs, &dependencies)
err := runDNF("depsolve", arguments, &dependencies)
return dependencies, err
}