1#
2# SPDX-License-Identifier: GPL-2.0-only
3#
4
5from django.core.management.base import BaseCommand
6from django.core.exceptions import ObjectDoesNotExist
7from orm.models import Build
8from django.db import OperationalError
9
10
11class Command(BaseCommand):
12    args    = '<buildID1 buildID2 .....>'
13    help    = "Deletes selected build(s)"
14
15    def add_arguments(self, parser):
16        parser.add_argument('buildids', metavar='N', type=int, nargs='+',
17                    help="Build ID's to delete")
18
19    def handle(self, *args, **options):
20        for bid in options['buildids']:
21            try:
22                b = Build.objects.get(pk = bid)
23            except ObjectDoesNotExist:
24                print('build %s does not exist, skipping...' %(bid))
25                continue
26            # theoretically, just b.delete() would suffice
27            # however SQLite runs into problems when you try to
28            # delete too many rows at once, so we delete some direct
29            # relationships from Build manually.
30            for t in b.target_set.all():
31                t.delete()
32            for t in b.task_build.all():
33                t.delete()
34            for p in b.package_set.all():
35                p.delete()
36            for lv in b.layer_version_build.all():
37                lv.delete()
38            for v in b.variable_build.all():
39                v.delete()
40            for l in b.logmessage_set.all():
41                l.delete()
42
43            # delete the build; some databases might have had problem with migration of the bldcontrol app
44            retry_count = 0
45            need_bldcontrol_migration = False
46            while True:
47                if retry_count >= 5:
48                    break
49                retry_count += 1
50                if need_bldcontrol_migration:
51                    from django.core import management
52                    management.call_command('migrate', 'bldcontrol', interactive=False)
53
54                try:
55                    b.delete()
56                    break
57                except OperationalError as e:
58                    # execute migrations
59                    need_bldcontrol_migration = True
60
61