]> git.ipfire.org Git - pbs.git/commitdiff
config: Refactor iterating over repositories
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Jan 2025 17:01:20 +0000 (17:01 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Jan 2025 17:01:20 +0000 (17:01 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/config.py
src/buildservice/distros.py
src/buildservice/repos.py

index 6f010ec9eb0815ada94536efc0db6646c4c1239c..cc31c1f9af66fdd2b8a9ae0e95283e49da76b473 100644 (file)
@@ -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)
 
index 04a0415d504af69fa702381923b385b1c0feff95..afb0fc1e5ee32d4527fa4d0f3400a92634274c6e 100644 (file)
@@ -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):
                """
index f7d9def3d05309f527fc66ac245e6d040ac5fb8d..d2caca29ae74ab88ecd682d8f571b9f3bf5927e2 100644 (file)
@@ -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):
                """