def init(self, distro=None, repos=None, vendor=None, contact=None,
arch=None, include_source=False, mirrored=True, build=None, logger=None):
self.distro = distro
- self.repos = set()
+ self.repos = repos
# Overwritten for user repositories
self.vendor = vendor
# Log messages to here
self.logger = logger
- # Add all repositories belonging to the distribution
- if self.distro:
- for repo in self.distro.repos:
- self.add_repo(repo)
-
- # Add any repositories
- if repos:
- for repo in repos:
- self.add_repo(repo)
-
def __str__(self):
config = self._make_config()
# Repositories
- def add_repo(self, repo):
+ async def fetch_repos(self):
"""
- Adds a repository to this configuration
+ Collects all repositories that are used in this configuration
"""
- self.repos.add(repo)
+ repos = set(self.repos or [])
+
+ # Add all repositories belonging to the distribution
+ if self.distro:
+ repos |= await self.distro.get_repos()
+
+ # Add all parent repositories
+ for repo in repos:
+ repos |= await repo.get_parents()
- # Add any sibling repositories
- self.repos.update(repo.parents)
+ return sorted(repos)
# Context
f = io.StringIO()
# Make configuration
- config = self._make_config(local=True)
+ config = await self._make_config(local=True)
# Write the configuration to the buffer
config.write(f)
async def __aexit__(self, type, value, traceback):
pass
- def _make_config(self, local=False):
+ async def _make_config(self, local=False):
"""
Generates the configuration file
"""
- config = configparser.ConfigParser(interpolation=None,
- default_section="general")
+ config = configparser.ConfigParser(
+ interpolation = None,
+ default_section = "general",
+ )
+
+ # Fetch all repositories
+ repos = await self.fetch_repos()
# Apply some general settings
if local:
vendor=self.vendor, contact=self.contact)
# Add the repository configurations
- for repo in self.repos:
+ for repo in sorted(repos):
repo.write_config(config, local=local, include_source=self.include_source,
mirrored=self.mirrored, build=self.build)
# Sibling repositories
- @property
- def parents(self):
+ async def get_parents(self):
"""
Returns all parent repositories
"""
# User repositories have the distro repositories as parents
if self.is_user():
- return self.distro.repos
+ return await self.distro.get_repos()
# Distro repositories don't have any parents
elif self.is_distro():
- return []
+ return set()
- @property
- def children(self):
+ async def get_children(self):
"""
Returns all repositories that depend on this
"""
# User repositories don't have any children
if self.is_user():
- return []
+ return set()
# Distro repositories are parents for all user repositories
elif self.is_distro():
- return self.backend.repos._get_repositories("""
- SELECT
- *
- FROM
- repositories
- WHERE
- deleted_at IS NULL
- AND
- distro_id = %s
- AND
- owner_id IS NOT NULL
- ORDER BY
- created_at
- """, self.distro,
-
- # Cache
- distro=self.distro,
+ stmt = (
+ sqlalchemy
+ .select(
+ Repo,
+ )
+ .where(
+ Repo.deleted_at == None,
+ Repo.distro == self.distro,
+ Repo.owner != None,
+ )
)
+ return await self.db.fetch_as_set(stmt)
+
# Builds
async def get_builds(self, **kwargs):
# Perform this for all child repositories
async with asyncio.TaskGroup() as tasks:
- for repo in self.children:
- tasks.create_task(repo._relaunch_pending_jobs())
+ for repo in await self.get_children():
+ tasks.create_task(
+ repo._relaunch_pending_jobs(),
+ )
async def _relaunch_pending_jobs(self):
"""