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.py61
1 files changed, 50 insertions, 11 deletions
diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py
index 25bc1dbe15..caad2afe81 100644
--- a/bitbake/lib/toaster/orm/models.py
+++ b/bitbake/lib/toaster/orm/models.py
@@ -862,31 +862,70 @@ class CustomImagePackage(Package):
862 related_name='appends_set') 862 related_name='appends_set')
863 863
864 864
865
866class Package_DependencyManager(models.Manager): 865class Package_DependencyManager(models.Manager):
867 use_for_related_fields = True 866 use_for_related_fields = True
867 TARGET_LATEST = "use-latest-target-for-target"
868 868
869 def get_queryset(self): 869 def get_queryset(self):
870 return super(Package_DependencyManager, self).get_queryset().exclude(package_id = F('depends_on__id')) 870 return super(Package_DependencyManager, self).get_queryset().exclude(package_id = F('depends_on__id'))
871 871
872 def get_total_source_deps_size(self): 872 def for_target_or_none(self, target):
873 """ Returns the total file size of all the packages that depend on 873 """ filter the dependencies to be displayed by the supplied target
874 thispackage. 874 if no dependences are found for the target then try None as the target
875 """ 875 which will return the dependences calculated without the context of a
876 return self.all().aggregate(Sum('depends_on__size')) 876 target e.g. non image recipes.
877 877
878 def get_total_revdeps_size(self): 878 returns: { size, packages }
879 """ Returns the total file size of all the packages that depend on
880 this package.
881 """ 879 """
882 return self.all().aggregate(Sum('package_id__size')) 880 package_dependencies = self.all_depends().order_by('depends_on__name')
883 881
882 if target is self.TARGET_LATEST:
883 installed_deps =\
884 package_dependencies.filter(~Q(target__target=None))
885 else:
886 installed_deps =\
887 package_dependencies.filter(Q(target__target=target))
888
889 packages_list = None
890 total_size = 0
891
892 # If we have installed depdencies for this package and target then use
893 # these to display
894 if installed_deps.count() > 0:
895 packages_list = installed_deps
896 total_size = installed_deps.aggregate(
897 Sum('depends_on__size'))['depends_on__size__sum']
898 else:
899 new_list = []
900 package_names = []
901
902 # Find dependencies for the package that we know about even if
903 # it's not installed on a target e.g. from a non-image recipe
904 for p in package_dependencies.filter(Q(target=None)):
905 if p.depends_on.name in package_names:
906 continue
907 else:
908 package_names.append(p.depends_on.name)
909 new_list.append(p.pk)
910 # while we're here we may as well total up the size to
911 # avoid iterating again
912 total_size += p.depends_on.size
913
914 # We want to return a queryset here for consistency so pick the
915 # deps from the new_list
916 packages_list = package_dependencies.filter(Q(pk__in=new_list))
917
918 return {'packages': packages_list,
919 'size': total_size}
884 920
885 def all_depends(self): 921 def all_depends(self):
886 """ Returns just the depends packages and not any other dep_type """ 922 """ Returns just the depends packages and not any other dep_type
923 Note that this is for any target
924 """
887 return self.filter(Q(dep_type=Package_Dependency.TYPE_RDEPENDS) | 925 return self.filter(Q(dep_type=Package_Dependency.TYPE_RDEPENDS) |
888 Q(dep_type=Package_Dependency.TYPE_TRDEPENDS)) 926 Q(dep_type=Package_Dependency.TYPE_TRDEPENDS))
889 927
928
890class Package_Dependency(models.Model): 929class Package_Dependency(models.Model):
891 TYPE_RDEPENDS = 0 930 TYPE_RDEPENDS = 0
892 TYPE_TRDEPENDS = 1 931 TYPE_TRDEPENDS = 1