aboutsummaryrefslogtreecommitdiff
path: root/repos/__init__.py
blob: 005dcf849d666793b0d9c39d25e30a5aa2cf311a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from typing import Mapping, List

from . import alpine_linux, arch_linux, crates_io, homebrew
from .base import Repository, slug, Version

__all__ = [
    'get_versions',
]

def repos_from(module):
    for exported in module.__all__:
        attr = getattr(module, exported)
        if isinstance(attr, Repository):
            yield attr

all_repos: List[Repository] = [
    *repos_from(alpine_linux),
    *repos_from(arch_linux),
    *repos_from(crates_io),
    *repos_from(homebrew),
]

def get_versions(package: str, args: Mapping[str, str]) -> Mapping[str, Version]:
    special_cases = dict()
    for repo, name in args.items():
        special_cases[repo] = name
    result = dict()
    for repo in all_repos:
        repo_versions = repo.get_versions()
        if slug(repo.full_name()) in special_cases:
            package_here = special_cases[slug(repo.full_name())]
        elif slug(repo.family) in special_cases:
            package_here = special_cases[slug(repo.family)]
        elif slug(repo.repo) in special_cases:
            package_here = special_cases[slug(repo.repo)]
        else:
            package_here = package
        if package_here in repo_versions:
            result[repo.full_name()] = repo_versions[package_here]
    return result