From: Michael Tremer Date: Wed, 22 Jan 2025 17:01:20 +0000 (+0000) Subject: config: Refactor iterating over repositories X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=75a73e022d545a9ab856a27ee1efcea304bfbc47;p=pbs.git config: Refactor iterating over repositories Signed-off-by: Michael Tremer --- diff --git a/src/buildservice/config.py b/src/buildservice/config.py index 6f010ec9..cc31c1f9 100644 --- a/src/buildservice/config.py +++ b/src/buildservice/config.py @@ -17,7 +17,7 @@ class PakfireConfig(base.Object): 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 @@ -38,16 +38,6 @@ class PakfireConfig(base.Object): # 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() @@ -61,14 +51,21 @@ class PakfireConfig(base.Object): # 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 @@ -86,7 +83,7 @@ class PakfireConfig(base.Object): 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) @@ -101,12 +98,17 @@ class PakfireConfig(base.Object): 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: @@ -118,7 +120,7 @@ class PakfireConfig(base.Object): 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) diff --git a/src/buildservice/distros.py b/src/buildservice/distros.py index 04a0415d..afb0fc1e 100644 --- a/src/buildservice/distros.py +++ b/src/buildservice/distros.py @@ -224,12 +224,9 @@ class Distro(database.Base, database.BackendMixin, database.SoftDeleteMixin): repos.Repo.distro == self, repos.Repo.owner == None, ) - .order_by( - repos.Repo.name, - ) ) - return await self.db.fetch_as_list(stmt) + return await self.db.fetch_as_set(stmt) async def get_repo(self, slug): """ diff --git a/src/buildservice/repos.py b/src/buildservice/repos.py index f7d9def3..d2caca29 100644 --- a/src/buildservice/repos.py +++ b/src/buildservice/repos.py @@ -405,49 +405,42 @@ class Repo(database.Base, database.BackendMixin, database.SoftDeleteMixin): # 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): @@ -811,8 +804,10 @@ class Repo(database.Base, database.BackendMixin, database.SoftDeleteMixin): # 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): """