diff --git a/distro.py b/distro.py index 8b41cde..2ad600d 100644 --- a/distro.py +++ b/distro.py @@ -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