From: Michael Tremer Date: Fri, 24 Jan 2025 11:34:22 +0000 (+0000) Subject: builds: Refactor handling bugs X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c10c77f98422031fc5ce1aa0c010aecf1ff6c25;p=pbs.git builds: Refactor handling bugs Signed-off-by: Michael Tremer --- diff --git a/src/buildservice/builds.py b/src/buildservice/builds.py index ba80cfe4..5e7fd387 100644 --- a/src/buildservice/builds.py +++ b/src/buildservice/builds.py @@ -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"