summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/orm/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/toaster/orm/models.py')
-rw-r--r--bitbake/lib/toaster/orm/models.py68
1 files changed, 65 insertions, 3 deletions
diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py
index 7e0cf9676a..b7975ef865 100644
--- a/bitbake/lib/toaster/orm/models.py
+++ b/bitbake/lib/toaster/orm/models.py
@@ -29,6 +29,9 @@ from django.core import validators
29from django.conf import settings 29from django.conf import settings
30import django.db.models.signals 30import django.db.models.signals
31 31
32import os.path
33import re
34
32import logging 35import logging
33logger = logging.getLogger("toaster") 36logger = logging.getLogger("toaster")
34 37
@@ -234,6 +237,14 @@ class Project(models.Model):
234 except (Build.DoesNotExist,IndexError): 237 except (Build.DoesNotExist,IndexError):
235 return( "not_found" ) 238 return( "not_found" )
236 239
240 def get_last_build_extensions(self):
241 """
242 Get list of file name extensions for images produced by the most
243 recent build
244 """
245 last_build = Build.objects.get(pk = self.get_last_build_id())
246 return last_build.get_image_file_extensions()
247
237 def get_last_imgfiles(self): 248 def get_last_imgfiles(self):
238 build_id = self.get_last_build_id 249 build_id = self.get_last_build_id
239 if (-1 == build_id): 250 if (-1 == build_id):
@@ -376,6 +387,57 @@ class Build(models.Model):
376 eta += ((eta - self.started_on)*(100-completeper))/completeper 387 eta += ((eta - self.started_on)*(100-completeper))/completeper
377 return eta 388 return eta
378 389
390 def get_image_file_extensions(self):
391 """
392 Get list of file name extensions for images produced by this build
393 """
394 targets = Target.objects.filter(build_id = self.id)
395 extensions = []
396
397 # pattern to match against file path for building extension string
398 pattern = re.compile('\.([^\.]+?)$')
399
400 for target in targets:
401 if (not target.is_image):
402 continue
403
404 target_image_files = Target_Image_File.objects.filter(target_id = target.id)
405
406 for target_image_file in target_image_files:
407 file_name = os.path.basename(target_image_file.file_name)
408 suffix = ''
409
410 continue_matching = True
411
412 # incrementally extract the suffix from the file path,
413 # checking it against the list of valid suffixes at each
414 # step; if the path is stripped of all potential suffix
415 # parts without matching a valid suffix, this returns all
416 # characters after the first '.' in the file name
417 while continue_matching:
418 matches = pattern.search(file_name)
419
420 if None == matches:
421 continue_matching = False
422 suffix = re.sub('^\.', '', suffix)
423 continue
424 else:
425 suffix = matches.group(1) + suffix
426
427 if suffix in Target_Image_File.SUFFIXES:
428 continue_matching = False
429 continue
430 else:
431 # reduce the file name and try to find the next
432 # segment from the path which might be part
433 # of the suffix
434 file_name = re.sub('.' + matches.group(1), '', file_name)
435 suffix = '.' + suffix
436
437 if not suffix in extensions:
438 extensions.append(suffix)
439
440 return ', '.join(extensions)
379 441
380 def get_sorted_target_list(self): 442 def get_sorted_target_list(self):
381 tgts = Target.objects.filter(build_id = self.id).order_by( 'target' ); 443 tgts = Target.objects.filter(build_id = self.id).order_by( 'target' );
@@ -418,7 +480,7 @@ class Build(models.Model):
418 return self.get_outcome_text() 480 return self.get_outcome_text()
419 481
420 def __str__(self): 482 def __str__(self):
421 return "%s %s %s" % (self.id, self.project, ",".join([t.target for t in self.target_set.all()])) 483 return "%d %s %s" % (self.id, self.project, ",".join([t.target for t in self.target_set.all()]))
422 484
423 485
424# an Artifact is anything that results from a Build, and may be of interest to the user, and is not stored elsewhere 486# an Artifact is anything that results from a Build, and may be of interest to the user, and is not stored elsewhere
@@ -609,7 +671,7 @@ class Task(models.Model):
609 sstate_text = property(get_sstate_text) 671 sstate_text = property(get_sstate_text)
610 672
611 def __unicode__(self): 673 def __unicode__(self):
612 return "%s(%s) %s:%s" % (self.pk, self.build.pk, self.recipe.name, self.task_name) 674 return "%d(%d) %s:%s" % (self.pk, self.build.pk, self.recipe.name, self.task_name)
613 675
614 class Meta: 676 class Meta:
615 ordering = ('order', 'recipe' ,) 677 ordering = ('order', 'recipe' ,)
@@ -1265,7 +1327,7 @@ class Layer_Version(models.Model):
1265 return sorted(result, key=lambda x: x.layer.name) 1327 return sorted(result, key=lambda x: x.layer.name)
1266 1328
1267 def __unicode__(self): 1329 def __unicode__(self):
1268 return "%s %s (VCS %s, Project %s)" % (self.pk, str(self.layer), self.get_vcs_reference(), self.build.project if self.build is not None else "No project") 1330 return "%d %s (VCS %s, Project %s)" % (self.pk, str(self.layer), self.get_vcs_reference(), self.build.project if self.build is not None else "No project")
1269 1331
1270 class Meta: 1332 class Meta:
1271 unique_together = ("layer_source", "up_id") 1333 unique_together = ("layer_source", "up_id")