From 8ef5165b5accaffa59a51a2316ed3304680da224 Mon Sep 17 00:00:00 2001 From: Alexandru DAMIAN Date: Tue, 23 Jun 2015 10:44:42 +0100 Subject: bitbake: toaster: delete multiple builds This patch fixes the build deletion on unmigrated databases, and enhances it to delete multiple builds in a single run. [YOCTO #7726] (Bitbake rev: d5468d84c1ef83c780de5974c8e3a11eab762489) Signed-off-by: Alexandru DAMIAN Signed-off-by: Richard Purdie --- bitbake/lib/toaster/toastergui/views.py | 4 +- .../toastermain/management/commands/builddelete.py | 56 ++++++++++++++-------- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index 1a504b8455..ec65903080 100755 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py @@ -64,9 +64,9 @@ def _get_latest_builds(prj=None): if prj is not None: queryset = queryset.filter(project = prj) - return itertools.chain( + return list(itertools.chain( queryset.filter(outcome=Build.IN_PROGRESS).order_by("-pk"), - queryset.filter(outcome__lt=Build.IN_PROGRESS).order_by("-pk")[:3] ) + queryset.filter(outcome__lt=Build.IN_PROGRESS).order_by("-pk")[:3] )) # a JSON-able dict of recent builds; for use in the Project page, xhr_ updates, and other places, as needed diff --git a/bitbake/lib/toaster/toastermain/management/commands/builddelete.py b/bitbake/lib/toaster/toastermain/management/commands/builddelete.py index 5cec436714..343d3114c0 100644 --- a/bitbake/lib/toaster/toastermain/management/commands/builddelete.py +++ b/bitbake/lib/toaster/toastermain/management/commands/builddelete.py @@ -1,33 +1,49 @@ from django.core.management.base import BaseCommand, CommandError from orm.models import Build +from django.db import OperationalError import os class Command(BaseCommand): args = "buildId" - help = "Deletes selected build" + help = "Deletes selected build(s)" def handle(self, buildId, *args, **options): - b = Build.objects.get(pk = buildId) - # theoretically, just b.delete() would suffice - # however SQLite runs into problems when you try to - # delete too many rows at once, so we delete some direct - # relationships from Build manually. + for bid in buildId.split(","): + b = Build.objects.get(pk = bid) + # theoretically, just b.delete() would suffice + # however SQLite runs into problems when you try to + # delete too many rows at once, so we delete some direct + # relationships from Build manually. + for t in b.target_set.all(): + t.delete() + for t in b.task_build.all(): + t.delete() + for p in b.package_set.all(): + p.delete() + for lv in b.layer_version_build.all(): + lv.delete() + for v in b.variable_build.all(): + v.delete() + for l in b.logmessage_set.all(): + l.delete() - for t in b.target_set.all(): - t.delete() - for t in b.task_build.all(): - t.delete() - for p in b.package_set.all(): - p.delete() - for lv in b.layer_version_build.all(): - lv.delete() - for v in b.variable_build.all(): - v.delete() - for l in b.logmessage_set.all(): - l.delete() + # delete the build; some databases might have had problem with migration of the bldcontrol app + retry_count = 0 + need_bldcontrol_migration = False + while True: + if retry_count >= 5: + break + retry_count += 1 + if need_bldcontrol_migration: + from django.core import management + management.call_command('migrate', 'bldcontrol', interactive=False) - # this should take care of the rest - b.delete() + try: + b.delete() + break + except OperationalError as e: + # execute migrations + need_bldcontrol_migration = True -- cgit v1.2.3-54-g00ecf