distro.py: add $repo.db parsing

This commit is contained in:
InsanePrawn 2021-11-21 18:55:37 +01:00
parent b623d017be
commit f5e6590e29

View file

@ -1,4 +1,10 @@
from copy import deepcopy
import urllib.request
import tempfile
import os
import tarfile
import logging
from constants import ARCHES, BASE_DISTROS, REPOSITORIES, KUPFER_HTTPS
from config import config
@ -28,6 +34,18 @@ class PackageInfo:
self.filename = filename
self.resolved_url = resolved_url
def __repr__(self):
return f'{self.name}@{self.version}'
def parse_desc(desc_str: str, resolved_url=None):
"""Parses a desc file, returning a PackageInfo"""
pruned_lines = ([line.strip() for line in desc_str.split('%') if line.strip()])
desc = {}
for key, value in zip(pruned_lines[0::2], pruned_lines[1::2]):
desc[key.strip()] = value.strip()
return PackageInfo(desc['NAME'], desc['VERSION'], desc['FILENAME'], resolved_url=resolved_url)
class RepoInfo:
options: dict[str, str] = {}
@ -49,10 +67,29 @@ class Repo(RepoInfo):
def scan(self):
self.resolved_url = resolve_url(self.url_template, repo_name=self.name, arch=self.arch)
self.remote = not self.resolved_url.startswith('file://')
# TODO
uri = f'{self.resolved_url}/{self.name}.db'
file_handle = None
path = ''
if self.remote:
logging.debug(f'Downloading repo file from {uri}')
with urllib.request.urlopen(uri) as request:
fd, path = tempfile.mkstemp()
with open(fd, 'wb') as writable:
writable.write(request.read())
else:
path = uri.split('file://')[1]
logging.debug(f'Parsing repo file at {path}')
with tarfile.open(path) as index:
for node in index.getmembers():
if os.path.basename(node.name) == 'desc':
logging.debug(f'Parsing desc file for {os.path.dirname(node.name)}')
pkg = PackageInfo.parse_desc(index.extractfile(node).read().decode(), self.resolved_url)
self.packages[pkg.name] = pkg
self.scanned = True
def __init__(self, name: str, url_template: str, arch: str, options={}, scan=True):
self.packages = {}
self.name = name
self.url_template = url_template
self.arch = arch