You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.5 KiB
Python
72 lines
1.5 KiB
Python
import importlib
|
|
import pkgutil
|
|
|
|
import logging
|
|
import vcs_mirrors.command
|
|
import vcs_mirrors.host
|
|
import vcs_mirrors.repo
|
|
from vcs_mirrors.lib.interfaces import IHost, IRepo
|
|
|
|
REPOS = None
|
|
HOSTS = None
|
|
COMMANDS = None
|
|
|
|
|
|
def _load_all(package):
|
|
"""
|
|
https://stackoverflow.com/a/1707786/3368468
|
|
"""
|
|
result = {}
|
|
for _, modname, ispkg in pkgutil.iter_modules(package.__path__):
|
|
if ispkg == False:
|
|
module = importlib.import_module(
|
|
package.__name__ + '.' + modname, package)
|
|
result[modname] = module
|
|
return result
|
|
|
|
|
|
def load_commands():
|
|
global COMMANDS
|
|
if COMMANDS is not None:
|
|
return COMMANDS
|
|
|
|
COMMANDS = _load_all(vcs_mirrors.command)
|
|
return COMMANDS
|
|
|
|
|
|
def load_repos():
|
|
global REPOS
|
|
if REPOS is not None:
|
|
return REPOS
|
|
|
|
REPOS = {}
|
|
for k, m in _load_all(vcs_mirrors.repo).items():
|
|
# pylint: disable=E1120
|
|
if IRepo.implementedBy(m.Repo):
|
|
REPOS[k] = m.Repo
|
|
else:
|
|
logging.error('Repo "%s" doesn\'t implement IRepo' % k)
|
|
# pylint: enable=E1120
|
|
|
|
return REPOS
|
|
|
|
|
|
def load_hosts():
|
|
global HOSTS
|
|
if HOSTS is not None:
|
|
return HOSTS
|
|
|
|
HOSTS = {}
|
|
for k, m in _load_all(vcs_mirrors.host).items():
|
|
if not m.__virtual__():
|
|
continue
|
|
|
|
# pylint: disable=E1120
|
|
if IHost.implementedBy(m.Host):
|
|
HOSTS[k] = m.Host
|
|
else:
|
|
logging.error('Host "%s" doesn\'t implement IHost' % k)
|
|
# pylint: enable=E1120
|
|
|
|
return HOSTS
|