summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/bldcontrol
diff options
context:
space:
mode:
authorAlexandru DAMIAN <alexandru.damian@intel.com>2014-11-14 17:07:06 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-11-21 11:49:23 +0000
commit0b6859cdf3a4b66bb8b94361681a5b6b362f93ae (patch)
tree37bf5c650e99b023bd0e0605b63a53cc0ebd0b72 /bitbake/lib/toaster/bldcontrol
parent5b0616ad7d7c3734f1818a56b631a2d254271678 (diff)
downloadpoky-0b6859cdf3a4b66bb8b94361681a5b6b362f93ae.tar.gz
bitbake: toastergui: layer name correlation
This patch modifies how layers are identified and matched. Layers were primarely organized by the source of layer information, and Releases were separated by both layer git branches and originating source of layer information. This setup prevented mixing layers from different sources for a certain release, which didn't match the way people use Yocto Project / bitbake. This patch brings name-based indentification, where layers with the same name are assumed to be equivalent, in the sense of being able to substitute one another. To facilitate this identification to humans, layers are differentiated by GIT URI instead of layer sources, which was a rather arbitrary abstraction. Additional changes include modification to models in order accomodate for the new data structure, and to config file loading to match the new toasterconf.json layout. (Bitbake rev: 4357200aed522ad56cfd84917f877645b83b6a70) Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/toaster/bldcontrol')
-rw-r--r--bitbake/lib/toaster/bldcontrol/management/commands/checksettings.py47
-rw-r--r--bitbake/lib/toaster/bldcontrol/management/commands/loadconf.py29
2 files changed, 54 insertions, 22 deletions
diff --git a/bitbake/lib/toaster/bldcontrol/management/commands/checksettings.py b/bitbake/lib/toaster/bldcontrol/management/commands/checksettings.py
index 56e4e1bf0c..cd604eba7e 100644
--- a/bitbake/lib/toaster/bldcontrol/management/commands/checksettings.py
+++ b/bitbake/lib/toaster/bldcontrol/management/commands/checksettings.py
@@ -34,6 +34,22 @@ class Command(NoArgsCommand):
34 return ret 34 return ret
35 return None 35 return None
36 36
37 def _recursive_list_directories(self, startdirectory, level = 0):
38 if level < 0:
39 return []
40 dirs = []
41 try:
42 for i in os.listdir(startdirectory):
43 j = os.path.join(startdirectory, i)
44 if os.path.isdir(j):
45 dirs.append(j)
46 except OSError:
47 pass
48 for j in dirs:
49 dirs = dirs + self._recursive_list_directories(j, level - 1)
50 return dirs
51
52
37 def _get_suggested_sourcedir(self, be): 53 def _get_suggested_sourcedir(self, be):
38 if be.betype != BuildEnvironment.TYPE_LOCAL: 54 if be.betype != BuildEnvironment.TYPE_LOCAL:
39 return "" 55 return ""
@@ -67,7 +83,6 @@ class Command(NoArgsCommand):
67 print("Verifying the Build Environment type %s id %d." % (be.get_betype_display(), be.pk)) 83 print("Verifying the Build Environment type %s id %d." % (be.get_betype_display(), be.pk))
68 if len(be.sourcedir) == 0: 84 if len(be.sourcedir) == 0:
69 suggesteddir = self._get_suggested_sourcedir(be) 85 suggesteddir = self._get_suggested_sourcedir(be)
70 homesourcedir = suggesteddir
71 be.sourcedir = raw_input(" -- Layer sources checkout directory may not be empty [guessed \"%s\"]:" % suggesteddir) 86 be.sourcedir = raw_input(" -- Layer sources checkout directory may not be empty [guessed \"%s\"]:" % suggesteddir)
72 if len(be.sourcedir) == 0 and len(suggesteddir) > 0: 87 if len(be.sourcedir) == 0 and len(suggesteddir) > 0:
73 be.sourcedir = suggesteddir 88 be.sourcedir = suggesteddir
@@ -94,17 +109,25 @@ class Command(NoArgsCommand):
94 be.save() 109 be.save()
95 110
96 if is_changed and be.betype == BuildEnvironment.TYPE_LOCAL: 111 if is_changed and be.betype == BuildEnvironment.TYPE_LOCAL:
97 baselayerdir = DN(DN(self._find_first_path_for_file(homesourcedir, "toasterconf.json", 3))) 112 for dirname in self._recursive_list_directories(be.sourcedir,2):
98 if baselayerdir: 113 if os.path.exists(os.path.join(dirname, ".templateconf")):
99 i = raw_input(" -- Do you want to import basic layer configuration from \"%s\" ? (y/N):" % baselayerdir) 114 import subprocess
100 if len(i) and i.upper()[0] == 'Y': 115 conffilepath, error = subprocess.Popen('bash -c ". '+os.path.join(dirname, ".templateconf")+'; echo \"\$TEMPLATECONF\""', shell=True, stdout=subprocess.PIPE).communicate()
101 from loadconf import Command as LoadConfigCommand 116 conffilepath = os.path.join(conffilepath.strip(), "toasterconf.json")
102 LoadConfigCommand()._import_layer_config(os.path.join(baselayerdir, "meta/conf/toasterconf.json")) 117 candidatefilepath = os.path.join(dirname, conffilepath)
103 # we run lsupdates after config update 118 if os.path.exists(candidatefilepath):
104 print "Updating information from the layer source, please wait." 119 i = raw_input(" -- Do you want to import basic layer configuration from \"%s\" ? (y/N):" % candidatefilepath)
105 from django.core.management import call_command 120 if len(i) and i.upper()[0] == 'Y':
106 call_command("lsupdates") 121 from loadconf import Command as LoadConfigCommand
107 pass 122
123 LoadConfigCommand()._import_layer_config(candidatefilepath)
124 # we run lsupdates after config update
125 print "Layer configuration imported. Updating information from the layer source, please wait."
126 from django.core.management import call_command
127 call_command("lsupdates")
128
129 # we don't look for any other config files
130 return is_changed
108 131
109 return is_changed 132 return is_changed
110 133
diff --git a/bitbake/lib/toaster/bldcontrol/management/commands/loadconf.py b/bitbake/lib/toaster/bldcontrol/management/commands/loadconf.py
index c9af487d9d..6e1f97a9f9 100644
--- a/bitbake/lib/toaster/bldcontrol/management/commands/loadconf.py
+++ b/bitbake/lib/toaster/bldcontrol/management/commands/loadconf.py
@@ -1,6 +1,6 @@
1from django.core.management.base import BaseCommand, CommandError 1from django.core.management.base import BaseCommand, CommandError
2from orm.models import LayerSource, ToasterSetting, Branch, Layer, Layer_Version 2from orm.models import LayerSource, ToasterSetting, Branch, Layer, Layer_Version
3from orm.models import BitbakeVersion, Release, ReleaseDefaultLayer 3from orm.models import BitbakeVersion, Release, ReleaseDefaultLayer, ReleaseLayerSourcePriority
4import os 4import os
5 5
6from checksettings import DN 6from checksettings import DN
@@ -71,17 +71,23 @@ class Command(BaseCommand):
71 assert 'name' in lsi 71 assert 'name' in lsi
72 assert 'branches' in lsi 72 assert 'branches' in lsi
73 73
74 if lsi['sourcetype'] == LayerSource.TYPE_LAYERINDEX or lsi['apiurl'].startswith("/"): 74 def _get_id_for_sourcetype(s):
75 for i in LayerSource.SOURCE_TYPE:
76 if s == i[1]:
77 return i[0]
78 raise Exception("Could not find definition for sourcetype " + s)
79
80 if _get_id_for_sourcetype(lsi['sourcetype']) == LayerSource.TYPE_LAYERINDEX or lsi['apiurl'].startswith("/"):
75 apiurl = lsi['apiurl'] 81 apiurl = lsi['apiurl']
76 else: 82 else:
77 apiurl = self._reduce_canon_path(os.path.join(DN(filepath), lsi['apiurl'])) 83 apiurl = self._reduce_canon_path(os.path.join(DN(filepath), lsi['apiurl']))
78 84
79 try: 85 try:
80 ls = LayerSource.objects.get(sourcetype = lsi['sourcetype'], apiurl = apiurl) 86 ls = LayerSource.objects.get(sourcetype = _get_id_for_sourcetype(lsi['sourcetype']), apiurl = apiurl)
81 except LayerSource.DoesNotExist: 87 except LayerSource.DoesNotExist:
82 ls = LayerSource.objects.create( 88 ls = LayerSource.objects.create(
83 name = lsi['name'], 89 name = lsi['name'],
84 sourcetype = lsi['sourcetype'], 90 sourcetype = _get_id_for_sourcetype(lsi['sourcetype']),
85 apiurl = apiurl 91 apiurl = apiurl
86 ) 92 )
87 93
@@ -121,17 +127,20 @@ class Command(BaseCommand):
121 bvo = BitbakeVersion.objects.get(name = ri['bitbake']) 127 bvo = BitbakeVersion.objects.get(name = ri['bitbake'])
122 assert bvo is not None 128 assert bvo is not None
123 129
124 ro, created = Release.objects.get_or_create(name = ri['name'], bitbake_version = bvo, branch = Branch.objects.get( layer_source__name = ri['layersource'], name=ri['branch'])) 130 ro, created = Release.objects.get_or_create(name = ri['name'], bitbake_version = bvo, branch_name = ri['branch'])
125 ro.description = ri['description'] 131 ro.description = ri['description']
126 ro.helptext = ri['helptext'] 132 ro.helptext = ri['helptext']
127 ro.save() 133 ro.save()
128 134
135 # save layer source priority for release
136 for ls_name in ri['layersourcepriority'].keys():
137 rlspo, created = ReleaseLayerSourcePriority.objects.get_or_create(release = ro, layer_source = LayerSource.objects.get(name=ls_name))
138 rlspo.priority = ri['layersourcepriority'][ls_name]
139 rlspo.save()
140
129 for dli in ri['defaultlayers']: 141 for dli in ri['defaultlayers']:
130 layer, created = Layer.objects.get_or_create( 142 # find layers with the same name
131 layer_source = LayerSource.objects.get(name = ri['layersource']), 143 ReleaseDefaultLayer.objects.get_or_create( release = ro, layer_name = dli)
132 name = dli
133 )
134 ReleaseDefaultLayer.objects.get_or_create( release = ro, layer = layer)
135 144
136 # set default release 145 # set default release
137 if ToasterSetting.objects.filter(name = "DEFAULT_RELEASE").count() > 0: 146 if ToasterSetting.objects.filter(name = "DEFAULT_RELEASE").count() > 0: