123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- #
- # BitBake Toaster Implementation
- #
- # Copyright (C) 2015 Intel Corporation
- #
- # SPDX-License-Identifier: GPL-2.0-only
- #
- import subprocess
- from toastergui.widgets import ToasterTypeAhead
- from orm.models import Project
- from django.urls import reverse
- from django.core.cache import cache
- class LayersTypeAhead(ToasterTypeAhead):
- """ Typeahead for layers available and not added in the current project's
- configuration """
- def apply_search(self, search_term, prj, request):
- layers = prj.get_all_compatible_layer_versions()
- layers = layers.order_by('layer__name')
- # Unlike the other typeaheads we also don't want to show suggestions
- # for layers already in the project unless required such as when adding
- # layerdeps to a new layer.
- if "include_added" in request.GET and \
- request.GET['include_added'] != "true":
- layers = layers.exclude(
- pk__in=prj.get_project_layer_versions(pk=True))
- primary_results = layers.filter(layer__name__istartswith=search_term)
- secondary_results = layers.filter(
- layer__name__icontains=search_term).exclude(
- pk__in=primary_results)
- results = []
- for layer_version in list(primary_results) + list(secondary_results):
- vcs_reference = layer_version.get_vcs_reference()
- detail = "[ %s | %s ]" % (layer_version.layer.vcs_url,
- vcs_reference)
- needed_fields = {
- 'id': layer_version.pk,
- 'name': layer_version.layer.name,
- 'layerdetailurl': layer_version.get_detailspage_url(prj.pk),
- 'xhrLayerUrl': reverse('xhr_layer',
- args=(prj.pk, layer_version.pk)),
- 'vcs_url': layer_version.layer.vcs_url,
- 'vcs_reference': vcs_reference,
- 'detail': detail,
- 'local_source_dir': layer_version.layer.local_source_dir,
- }
- results.append(needed_fields)
- return results
- class MachinesTypeAhead(ToasterTypeAhead):
- """ Typeahead for all the machines available in the current project's
- configuration """
- def apply_search(self, search_term, prj, request):
- machines = prj.get_available_machines()
- machines = machines.order_by("name")
- primary_results = machines.filter(name__istartswith=search_term)
- secondary_results = machines.filter(
- name__icontains=search_term).exclude(pk__in=primary_results)
- tertiary_results = machines.filter(
- layer_version__layer__name__icontains=search_term).exclude(
- pk__in=primary_results).exclude(pk__in=secondary_results)
- results = []
- for machine in list(primary_results) + list(secondary_results) + \
- list(tertiary_results):
- detail = "[ %s ]" % (machine.layer_version.layer.name)
- needed_fields = {
- 'id': machine.pk,
- 'name': machine.name,
- 'detail': detail,
- }
- results.append(needed_fields)
- return results
- class DistrosTypeAhead(ToasterTypeAhead):
- """ Typeahead for all the distros available in the current project's
- configuration """
- def __init__(self):
- super(DistrosTypeAhead, self).__init__()
- def apply_search(self, search_term, prj, request):
- distros = prj.get_available_distros()
- distros = distros.order_by("name")
- primary_results = distros.filter(name__istartswith=search_term)
- secondary_results = distros.filter(name__icontains=search_term).exclude(pk__in=primary_results)
- tertiary_results = distros.filter(layer_version__layer__name__icontains=search_term).exclude(pk__in=primary_results).exclude(pk__in=secondary_results)
- results = []
- for distro in list(primary_results) + list(secondary_results) + list(tertiary_results):
- detail = "[ %s ]" % (distro.layer_version.layer.name)
- needed_fields = {
- 'id' : distro.pk,
- 'name' : distro.name,
- 'detail' : detail,
- }
- results.append(needed_fields)
- return results
- class RecipesTypeAhead(ToasterTypeAhead):
- """ Typeahead for all the recipes available in the current project's
- configuration """
- def apply_search(self, search_term, prj, request):
- recipes = prj.get_available_recipes()
- recipes = recipes.order_by("name")
- primary_results = recipes.filter(name__istartswith=search_term)
- secondary_results = recipes.filter(
- name__icontains=search_term).exclude(pk__in=primary_results)
- tertiary_results = recipes.filter(
- layer_version__layer__name__icontains=search_term).exclude(
- pk__in=primary_results).exclude(pk__in=secondary_results)
- results = []
- for recipe in list(primary_results) + list(secondary_results) + \
- list(tertiary_results):
- detail = "[ %s ]" % (recipe.layer_version.layer.name)
- needed_fields = {
- 'id': recipe.pk,
- 'name': recipe.name,
- 'detail': detail,
- }
- results.append(needed_fields)
- return results
- class ProjectsTypeAhead(ToasterTypeAhead):
- """ Typeahead for all the projects, except for command line builds """
- def apply_search(self, search_term, prj, request):
- projects = Project.objects.exclude(is_default=True).order_by("name")
- primary_results = projects.filter(name__istartswith=search_term)
- secondary_results = projects.filter(
- name__icontains=search_term).exclude(pk__in=primary_results)
- results = []
- for project in list(primary_results) + list(secondary_results):
- needed_fields = {
- 'id': project.pk,
- 'name': project.name,
- 'detail': "",
- 'projectPageUrl': reverse('project', args=(project.pk,))
- }
- results.append(needed_fields)
- return results
- class GitRevisionTypeAhead(ToasterTypeAhead):
- def apply_search(self, search_term, prj, request):
- results = []
- git_url = request.GET.get('git_url')
- ls_remote = cache.get(git_url)
- if ls_remote is None:
- ls_remote = subprocess.check_output(['git', 'ls-remote', git_url],
- universal_newlines=True)
- ls_remote = ls_remote.splitlines()
- # Avoid fetching the list of git refs on each new input
- cache.set(git_url, ls_remote, 120)
- for rev in ls_remote:
- git_rev = str(rev).split("/")[-1:][0]
- # "HEAD" has a special meaning in Toaster... YOCTO #9924
- if "HEAD" in git_rev:
- continue
- if git_rev.startswith(search_term):
- results.append({'name': git_rev,
- 'detail': '[ %s ]' % str(rev)})
- return results
|