diff options
author | Dave Lerner <dave.lerner@windriver.com> | 2014-01-23 11:47:41 -0600 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-02-17 15:38:52 +0000 |
commit | 620553df864634e7061c9124ea70a90e5c067cde (patch) | |
tree | d196d7dbea61da09846e9a645f245ab931889516 /bitbake/lib/toaster/toastergui/views.py | |
parent | 47634378ac516496bcc155e001983973f241ee61 (diff) | |
download | poky-620553df864634e7061c9124ea70a90e5c067cde.tar.gz |
bitbake: toaster: Implementation of package detail views
Adds new package detail views. The views are based on
specifications found in attachments to:
https://bugzilla.yoctoproject.org/show_bug.cgi?id=4328
specifically:
design-1.5.1-package-details.pdf, and
design-1.1.1-included-package-details.
This patch includes a redefinition of constant numbers for
task dependency tasks. This is needed in order to achieve
sorting criteria from the design.
This change invalidates currently dependency information for
currently existing builds, as it breaks compatibility.
[YOCTO #4328]
(Bitbake rev: 6855925c06e7e5bb15ae9d0c08d77f3a9a2574bc)
Signed-off-by: Dave Lerner <dave.lerner@windriver.com>
Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
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 | ||