]> git.ipfire.org Git - pbs.git/commitdiff
builds: Refactor handling bugs
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 24 Jan 2025 11:34:22 +0000 (11:34 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 24 Jan 2025 11:34:22 +0000 (11:34 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/builds.py

index ba80cfe4898874f6a7e771ebc658070b35b7d993..5e7fd387cd36f2fb1e8bfcc3de52d6083f660f7a 100644 (file)
@@ -848,52 +848,57 @@ class Build(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
                return set([row.bug_id for row in rows])
 
-       async def add_bug(self, bug_id, user=None):
-               await self.db.execute("""
-                       INSERT INTO
-                               build_bugs
-                       (
-                               build_id,
-                               bug_id,
-                               added_by
-                       )
-                       VALUES
-                       (
-                               %s, %s, %s
+       async def _find_bug(self, bug_id):
+               """
+                       Fetches a specific bug
+               """
+               stmt = (
+                       sqlalchemy
+                       .select(
+                               BuildBug,
                        )
-                       ON CONFLICT
-                       (
-                               build_id,
-                               bug_id
+                       .where(
+                               BuildBug.build == self,
+                               BuildBug.bug_id == bug_id,
+                               BuildBug.removed_at == None,
                        )
-                       WHERE
-                               removed_at IS NULL
-                       DO NOTHING
-                       """, self.id, bug_id, user,
                )
 
-               # Add to cache
-               self.bug_ids.add(bug_id)
+               return await self.db.fetch_one(stmt)
 
-       async def remove_bug(self, bug_id, user):
-               await self.db.execute("""
-                       UPDATE
-                               build_bugs
-                       SET
-                               removed_at = CURRENT_TIMESTAMP,
-                               removed_by = %s
-                       WHERE
-                               build_id = %s
-                       AND
-                               bug_id = %s
-                       """, self.id, bug_id,
+       async def add_bug(self, bug_id, added_by=None):
+               """
+                       Adds a new bug to this build
+               """
+               bug = await self.db.insert(
+                       BuildBug,
+                       build    = self,
+                       bug_id   = bug_id,
+                       added_by = added_by,
                )
 
-               # Remove from cache
-               try:
-                       self.bug_ids.remove(bug_id)
-               except KeyError:
-                       pass
+               # Log action
+               log.info("Added %s to %s" % (bug, self))
+
+               return bug
+
+       async def remove_bug(self, bug_id, removed_by=None):
+               """
+                       Removes a bug from this build
+               """
+               bug = await self._find_bug(bug_id)
+
+               # Nothing to do if we couldn't find the bug
+               if not bug:
+                       return
+
+               # Remove it
+               bug.remove(removed_by=removed_by)
+
+               # Log action
+               log.info("Removed %s from %s" % (bug, self))
+
+               return bug
 
        async def get_bugs(self):
                """
@@ -1376,9 +1381,12 @@ class BuildGroup(database.Base, database.SoftDeleteMixin):
                self.failed = True
 
 
-class BuildBug(database.Base, database.BackendMixin):
+class BuildBug(database.Base):
        __tablename__ = "build_bugs"
 
+       def __str__(self):
+               return "#%s" % self.bug_id
+
        # ID
 
        id = Column(Integer, primary_key=True)
@@ -1424,6 +1432,18 @@ class BuildBug(database.Base, database.BackendMixin):
                "User", foreign_keys=[removed_by_id], lazy="joined",
        )
 
+       # Remove!
+
+       def remove(self, removed_by=None):
+               """
+                       Remove the bug from this build
+               """
+               self.removed_at = sqlalchemy.func.current_timestamp()
+
+               # Optionally store the user
+               if removed_by:
+                       self.removed_by = removed_by
+
 
 class BuildComment(database.Base, database.BackendMixin, database.SoftDeleteMixin):
        __tablename__ = "build_comments"