diff options
Diffstat (limited to 'bitbake/lib/toaster/toastergui/views.py')
-rw-r--r-- | bitbake/lib/toaster/toastergui/views.py | 196 |
1 files changed, 187 insertions, 9 deletions
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index 7b84df3340..37e2af2574 100644 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py | |||
@@ -378,15 +378,6 @@ def recipe(request, build_id, recipe_id): | |||
378 | } | 378 | } |
379 | return render(request, template, context) | 379 | return render(request, template, context) |
380 | 380 | ||
381 | def package(request, build_id, package_id): | ||
382 | template = "singlepackage.html" | ||
383 | if Build.objects.filter(pk=build_id).count() == 0 : | ||
384 | return redirect(builds) | ||
385 | context = { | ||
386 | 'build' : Build.objects.filter(pk=build_id)[0], | ||
387 | } | ||
388 | return render(request, template, context) | ||
389 | |||
390 | def target(request, build_id, target_id): | 381 | def target(request, build_id, target_id): |
391 | template = "target.html" | 382 | template = "target.html" |
392 | if Build.objects.filter(pk=build_id).count() == 0 : | 383 | if Build.objects.filter(pk=build_id).count() == 0 : |
@@ -705,4 +696,191 @@ def layer_versions_recipes(request, layerversion_id): | |||
705 | 696 | ||
706 | return render(request, template, context) | 697 | return render(request, template, context) |
707 | 698 | ||
699 | # A set of dependency types valid for both included and built package views | ||
700 | OTHER_DEPENDS_BASE = [ | ||
701 | Package_Dependency.TYPE_RSUGGESTS, | ||
702 | Package_Dependency.TYPE_RPROVIDES, | ||
703 | Package_Dependency.TYPE_RREPLACES, | ||
704 | Package_Dependency.TYPE_RCONFLICTS, | ||
705 | ] | ||
706 | |||
707 | # value for invalid row id | ||
708 | INVALID_KEY = -1 | ||
709 | |||
710 | """ | ||
711 | Given a package id, target_id retrieves two sets of this image and package's | ||
712 | dependencies. The return value is a dictionary consisting of two other | ||
713 | lists: a list of 'runtime' dependencies, that is, having RDEPENDS | ||
714 | values in source package's recipe, and a list of other dependencies, that is | ||
715 | the list of possible recipe variables as found in OTHER_DEPENDS_BASE plus | ||
716 | the RRECOMENDS or TRECOMENDS value. | ||
717 | The lists are built in the sort order specified for the package runtime | ||
718 | dependency views. | ||
719 | """ | ||
720 | def get_package_dependencies(package_id, target_id = INVALID_KEY): | ||
721 | runtime_deps = [] | ||
722 | other_deps = [] | ||
723 | other_depends_types = OTHER_DEPENDS_BASE | ||
724 | |||
725 | if target_id != INVALID_KEY : | ||
726 | rdepends_type = Package_Dependency.TYPE_TRDEPENDS | ||
727 | other_depends_types += [Package_Dependency.TYPE_TRECOMMENDS] | ||
728 | else : | ||
729 | rdepends_type = Package_Dependency.TYPE_RDEPENDS | ||
730 | other_depends_types += [Package_Dependency.TYPE_RRECOMMENDS] | ||
731 | |||
732 | package = Package.objects.get(pk=package_id) | ||
733 | if target_id != INVALID_KEY : | ||
734 | alldeps = package.package_dependencies_source.filter(target_id__exact = target_id) | ||
735 | else : | ||
736 | alldeps = package.package_dependencies_source.all() | ||
737 | for idep in alldeps: | ||
738 | dep_package = Package.objects.get(pk=idep.depends_on_id) | ||
739 | dep_entry = Package_Dependency.DEPENDS_DICT[idep.dep_type] | ||
740 | if dep_package.version == '' : | ||
741 | version = '' | ||
742 | else : | ||
743 | version = dep_package.version + "-" + dep_package.revision | ||
744 | installed = False | ||
745 | if target_id != INVALID_KEY : | ||
746 | if Target_Installed_Package.objects.filter(target_id__exact = target_id, package_id__exact = dep_package.id).count() > 0: | ||
747 | installed = True | ||
748 | dep = { | ||
749 | 'name' : dep_package.name, | ||
750 | 'version' : version, | ||
751 | 'size' : dep_package.size, | ||
752 | 'dep_type' : idep.dep_type, | ||
753 | 'dep_type_display' : dep_entry[0].capitalize(), | ||
754 | 'dep_type_help' : dep_entry[1] % (dep_package.name, package.name), | ||
755 | 'depends_on_id' : dep_package.id, | ||
756 | 'installed' : installed, | ||
757 | } | ||
758 | if idep.dep_type == rdepends_type : | ||
759 | runtime_deps.append(dep) | ||
760 | elif idep.dep_type in other_depends_types : | ||
761 | other_deps.append(dep) | ||
762 | |||
763 | rdep_sorted = sorted(runtime_deps, key=lambda k: k['name']) | ||
764 | odep_sorted = sorted( | ||
765 | sorted(other_deps, key=lambda k: k['name']), | ||
766 | key=lambda k: k['dep_type']) | ||
767 | retvalues = {'runtime_deps' : rdep_sorted, 'other_deps' : odep_sorted} | ||
768 | return retvalues | ||
769 | |||
770 | # Return the count of packages dependent on package for this target_id image | ||
771 | def get_package_reverse_dep_count(package, target_id): | ||
772 | return package.package_dependencies_target.filter(target_id__exact=target_id, dep_type__exact = Package_Dependency.TYPE_TRDEPENDS).count() | ||
773 | |||
774 | # Return the count of the packages that this package_id is dependent on. | ||
775 | # Use one of the two RDEPENDS types, either TRDEPENDS if the package was | ||
776 | # installed, or else RDEPENDS if only built. | ||
777 | def get_package_dependency_count(package, target_id, is_installed): | ||
778 | if is_installed : | ||
779 | return package.package_dependencies_source.filter(target_id__exact = target_id, | ||
780 | dep_type__exact = Package_Dependency.TYPE_TRDEPENDS).count() | ||
781 | else : | ||
782 | return package.package_dependencies_source.filter(dep_type__exact = Package_Dependency.TYPE_RDEPENDS).count() | ||
783 | |||
784 | def package_built_detail(request, build_id, package_id): | ||
785 | template = "package_built_detail.html" | ||
786 | if Build.objects.filter(pk=build_id).count() == 0 : | ||
787 | return redirect(builds) | ||
788 | package = Package.objects.filter(pk=package_id)[0] | ||
789 | context = { | ||
790 | 'build' : Build.objects.filter(pk=build_id)[0], | ||
791 | 'package' : package, | ||
792 | 'dependency_count' : get_package_dependency_count(package, -1, False), | ||
793 | } | ||
794 | return render(request, template, context) | ||
795 | |||
796 | def package_built_dependencies(request, build_id, package_id): | ||
797 | template = "package_built_dependencies.html" | ||
798 | if Build.objects.filter(pk=build_id).count() == 0 : | ||
799 | return redirect(builds) | ||
800 | |||
801 | package = Package.objects.filter(pk=package_id)[0] | ||
802 | dependencies = get_package_dependencies(package_id) | ||
803 | context = { | ||
804 | 'build' : Build.objects.filter(pk=build_id)[0], | ||
805 | 'package' : package, | ||
806 | 'runtime_deps' : dependencies['runtime_deps'], | ||
807 | 'other_deps' : dependencies['other_deps'], | ||
808 | 'dependency_count' : get_package_dependency_count(package, -1, False) | ||
809 | } | ||
810 | return render(request, template, context) | ||
811 | |||
812 | |||
813 | def package_included_detail(request, build_id, target_id, package_id): | ||
814 | template = "package_included_detail.html" | ||
815 | if Build.objects.filter(pk=build_id).count() == 0 : | ||
816 | return redirect(builds) | ||
817 | |||
818 | package = Package.objects.filter(pk=package_id)[0] | ||
819 | target = Target.objects.filter(pk=target_id)[0] | ||
820 | context = { | ||
821 | 'build' : Build.objects.filter(pk=build_id)[0], | ||
822 | 'target' : target, | ||
823 | 'package' : package, | ||
824 | 'reverse_count' : get_package_reverse_dep_count(package, target_id), | ||
825 | 'dependency_count' : get_package_dependency_count(package, target_id, True) | ||
826 | } | ||
827 | return render(request, template, context) | ||
828 | |||
829 | def package_included_dependencies(request, build_id, target_id, package_id): | ||
830 | template = "package_included_dependencies.html" | ||
831 | if Build.objects.filter(pk=build_id).count() == 0 : | ||
832 | return redirect(builds) | ||
833 | |||
834 | package = Package.objects.filter(pk=package_id)[0] | ||
835 | target = Target.objects.filter(pk=target_id)[0] | ||
836 | |||
837 | dependencies = get_package_dependencies(package_id, target_id) | ||
838 | context = { | ||
839 | 'build' : Build.objects.filter(pk=build_id)[0], | ||
840 | 'package' : package, | ||
841 | 'target' : target, | ||
842 | 'runtime_deps' : dependencies['runtime_deps'], | ||
843 | 'other_deps' : dependencies['other_deps'], | ||
844 | 'reverse_count' : get_package_reverse_dep_count(package, target_id), | ||
845 | 'dependency_count' : get_package_dependency_count(package, target_id, True) | ||
846 | } | ||
847 | return render(request, template, context) | ||
848 | |||
849 | def package_included_reverse_dependencies(request, build_id, target_id, package_id): | ||
850 | template = "package_included_reverse_dependencies.html" | ||
851 | if Build.objects.filter(pk=build_id).count() == 0 : | ||
852 | return redirect(builds) | ||
853 | |||
854 | package = Package.objects.filter(pk=package_id)[0] | ||
855 | target = Target.objects.filter(pk=target_id)[0] | ||
856 | |||
857 | reverse_deps = [] | ||
858 | alldeps = package.package_dependencies_target.filter(target_id__exact=target_id) | ||
859 | for idep in alldeps: | ||
860 | dep_package = Package.objects.get(pk=idep.package_id) | ||
861 | version = dep_package.version | ||
862 | if version != '' : | ||
863 | version += '-' + dep_package.revision | ||
864 | dep = { | ||
865 | 'name' : dep_package.name, | ||
866 | 'dependent_id' : dep_package.id, | ||
867 | 'version' : version, | ||
868 | 'size' : dep_package.size | ||
869 | } | ||
870 | if idep.dep_type == Package_Dependency.TYPE_TRDEPENDS : | ||
871 | reverse_deps.append(dep) | ||
872 | |||
873 | context = { | ||
874 | 'build' : Build.objects.filter(pk=build_id)[0], | ||
875 | 'package' : package, | ||
876 | 'target' : target, | ||
877 | 'reverse_deps' : reverse_deps, | ||
878 | 'reverse_count' : get_package_reverse_dep_count(package, target_id), | ||
879 | 'dependency_count' : get_package_dependency_count(package, target_id, True) | ||
880 | } | ||
881 | return render(request, template, context) | ||
882 | |||
883 | def image_information_dir(request, build_id, target_id, packagefile_id): | ||
884 | # stubbed for now | ||
885 | return redirect(builds) | ||
708 | 886 | ||