Make each command accept a `repos` key containing repository descriptions. Make weldr API pass the repository like this. Nothing should change, because the repos were the same (Fedora 30).
83 lines
2.2 KiB
Python
83 lines
2.2 KiB
Python
#!/usr/bin/python3
|
|
|
|
import datetime
|
|
import dnf
|
|
import json
|
|
import sys
|
|
|
|
|
|
def timestamp_to_rfc3339(timestamp):
|
|
d = datetime.datetime.utcfromtimestamp(package.buildtime)
|
|
return d.strftime('%Y-%m-%dT%H:%M:%SZ')
|
|
|
|
|
|
def dnfrepo(desc, parent_conf=None):
|
|
"""Makes a dnf.repo.Repo out of a JSON repository description"""
|
|
|
|
repo = dnf.repo.Repo(desc["id"], parent_conf)
|
|
repo.name = desc["name"]
|
|
|
|
if "baseurl" in desc:
|
|
repo.baseurl = desc["baseurl"]
|
|
elif "metalink" in desc:
|
|
repo.metalink = desc["metalink"]
|
|
elif "mirrorlist" in desc:
|
|
repo.metalink = desc["mirrorlist"]
|
|
else:
|
|
assert False
|
|
|
|
return repo
|
|
|
|
|
|
def create_base(repos):
|
|
base = dnf.Base()
|
|
|
|
for repo in repos:
|
|
base.repos.add(dnfrepo(repo, base.conf))
|
|
|
|
base.fill_sack(load_system_repo=False)
|
|
return base
|
|
|
|
|
|
call = json.load(sys.stdin)
|
|
command = call["command"]
|
|
arguments = call.get("arguments", {})
|
|
|
|
if command == "list":
|
|
base = create_base(arguments.get("repos", {}))
|
|
packages = [p.name for p in base.sack.query().available()]
|
|
json.dump(packages, sys.stdout)
|
|
|
|
elif command == "dump":
|
|
base = create_base(arguments.get("repos", {}))
|
|
packages = []
|
|
for package in base.sack.query().available():
|
|
packages.append({
|
|
"name": package.name,
|
|
"summary": package.summary,
|
|
"description": package.description,
|
|
"url": package.url,
|
|
"epoch": package.epoch,
|
|
"version": package.version,
|
|
"release": package.release,
|
|
"arch": package.arch,
|
|
"buildtime": timestamp_to_rfc3339(package.buildtime),
|
|
"license": package.license
|
|
})
|
|
json.dump(packages, sys.stdout)
|
|
|
|
elif command == "depsolve":
|
|
base = create_base(arguments.get("repos", {}))
|
|
for pkgspec in arguments:
|
|
base.install(pkgspec)
|
|
base.resolve()
|
|
packages = []
|
|
for package in base.transaction.install_set:
|
|
packages.append({
|
|
"name": package.name,
|
|
"epoch": package.epoch,
|
|
"version": package.version,
|
|
"release": package.release,
|
|
"arch": package.arch
|
|
})
|
|
json.dump(packages, sys.stdout)
|