summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/bldcontrol
diff options
context:
space:
mode:
authorAlexandru DAMIAN <alexandru.damian@intel.com>2015-02-02 17:57:36 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-02-10 23:07:48 +0000
commit202d808f890b03958cd6873486e6a37f3f437098 (patch)
tree7b88e2cb5ab7b85648821bec4d2f4c16d290207f /bitbake/lib/toaster/bldcontrol
parentb741c9a4b4047439c6c5428e36a72c22a784feda (diff)
downloadpoky-202d808f890b03958cd6873486e6a37f3f437098.tar.gz
bitbake: toastergui: improvements in layer selection logic
This patch clearers and bring fixes for the layer selection logic in order to enable information collected during build to be used in configuring projects, specifically targeting the recipes learned through the building process. The patch also adds tests to verify the layer selection logic. [YOCTO #7189] (Bitbake rev: f0faba8ef0f08c98ac4bddf5b3954d540820d215) 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/bbcontroller.py13
-rw-r--r--bitbake/lib/toaster/bldcontrol/localhostbecontroller.py54
-rw-r--r--bitbake/lib/toaster/bldcontrol/sshbecontroller.py2
3 files changed, 39 insertions, 30 deletions
diff --git a/bitbake/lib/toaster/bldcontrol/bbcontroller.py b/bitbake/lib/toaster/bldcontrol/bbcontroller.py
index cf3f1fde75..42675d3fc6 100644
--- a/bitbake/lib/toaster/bldcontrol/bbcontroller.py
+++ b/bitbake/lib/toaster/bldcontrol/bbcontroller.py
@@ -81,19 +81,6 @@ def getBuildEnvironmentController(**kwargs):
81 raise Exception("FIXME: Implement BEC for type %s" % str(be.betype)) 81 raise Exception("FIXME: Implement BEC for type %s" % str(be.betype))
82 82
83 83
84def _get_git_clonedirectory(url, branch):
85 """ Utility that returns the last component of a git path as directory
86 """
87 import re
88 components = re.split(r'[:\.\/]', url)
89 base = components[-2] if components[-1] == "git" else components[-1]
90
91 if branch != "HEAD":
92 return "_%s_%s.toaster_cloned" % (base, branch)
93
94 return base
95
96
97class BuildEnvironmentController(object): 84class BuildEnvironmentController(object):
98 """ BuildEnvironmentController (BEC) is the abstract class that defines the operations that MUST 85 """ BuildEnvironmentController (BEC) is the abstract class that defines the operations that MUST
99 or SHOULD be supported by a Build Environment. It is used to establish the framework, and must 86 or SHOULD be supported by a Build Environment. It is used to establish the framework, and must
diff --git a/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py b/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py
index 47708d169a..005c464314 100644
--- a/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py
+++ b/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py
@@ -30,7 +30,7 @@ import subprocess
30 30
31from toastermain import settings 31from toastermain import settings
32 32
33from bbcontroller import BuildEnvironmentController, ShellCmdException, BuildSetupException, _get_git_clonedirectory 33from bbcontroller import BuildEnvironmentController, ShellCmdException, BuildSetupException
34 34
35import logging 35import logging
36logger = logging.getLogger("toaster") 36logger = logging.getLogger("toaster")
@@ -54,6 +54,7 @@ class LocalhostBEController(BuildEnvironmentController):
54 if cwd is None: 54 if cwd is None:
55 cwd = self.be.sourcedir 55 cwd = self.be.sourcedir
56 56
57 #logger.debug("lbc_shellcmmd: (%s) %s" % (cwd, command))
57 p = subprocess.Popen(command, cwd = cwd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 58 p = subprocess.Popen(command, cwd = cwd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
58 (out,err) = p.communicate() 59 (out,err) = p.communicate()
59 p.wait() 60 p.wait()
@@ -62,7 +63,7 @@ class LocalhostBEController(BuildEnvironmentController):
62 err = "command: %s \n%s" % (command, out) 63 err = "command: %s \n%s" % (command, out)
63 else: 64 else:
64 err = "command: %s \n%s" % (command, err) 65 err = "command: %s \n%s" % (command, err)
65 #logger.debug("localhostbecontroller: shellcmd error %s" % err) 66 #logger.warn("localhostbecontroller: shellcmd error %s" % err)
66 raise ShellCmdException(err) 67 raise ShellCmdException(err)
67 else: 68 else:
68 #logger.debug("localhostbecontroller: shellcmd success") 69 #logger.debug("localhostbecontroller: shellcmd success")
@@ -106,19 +107,12 @@ class LocalhostBEController(BuildEnvironmentController):
106 107
107 logger.debug("localhostbecontroller: running the listener at %s" % own_bitbake) 108 logger.debug("localhostbecontroller: running the listener at %s" % own_bitbake)
108 109
109 try:
110 os.remove(os.path.join(self.be.builddir, "toaster_ui.log"))
111 except OSError as e:
112 import errno
113 if e.errno != errno.ENOENT:
114 raise
115
116 110
117 cmd = "bash -c \"source %s/oe-init-build-env %s && bitbake --read conf/toaster-pre.conf --postread conf/toaster.conf --server-only -t xmlrpc -B 0.0.0.0:0 && DATABASE_URL=%s BBSERVER=0.0.0.0:-1 daemon -d -i -D %s -o toaster_ui.log -- %s --observe-only -u toasterui &\"" % (self.pokydirname, self.be.builddir, 111 cmd = "bash -c \"source %s/oe-init-build-env %s && bitbake --read conf/toaster-pre.conf --postread conf/toaster.conf --server-only -t xmlrpc -B 0.0.0.0:0 && DATABASE_URL=%s BBSERVER=0.0.0.0:-1 daemon -d -i -D %s -o toaster_ui.log -- %s --observe-only -u toasterui &\"" % (self.pokydirname, self.be.builddir,
118 self.dburl, self.be.builddir, own_bitbake) 112 self.dburl, self.be.builddir, own_bitbake)
119 logger.debug("fullcommand |%s| " % cmd)
120 port = "-1" 113 port = "-1"
121 for i in self._shellcmd(cmd).split("\n"): 114 cmdoutput = self._shellcmd(cmd)
115 for i in cmdoutput.split("\n"):
122 if i.startswith("Bitbake server address"): 116 if i.startswith("Bitbake server address"):
123 port = i.split(" ")[-1] 117 port = i.split(" ")[-1]
124 logger.debug("localhostbecontroller: Found bitbake server port %s" % port) 118 logger.debug("localhostbecontroller: Found bitbake server port %s" % port)
@@ -132,10 +126,17 @@ class LocalhostBEController(BuildEnvironmentController):
132 return True 126 return True
133 return False 127 return False
134 128
135 while not _toaster_ui_started(os.path.join(self.be.builddir, "toaster_ui.log")): 129 retries = 0
130 started = False
131 while not started and retries < 10:
132 started = _toaster_ui_started(os.path.join(self.be.builddir, "toaster_ui.log"))
136 import time 133 import time
137 logger.debug("localhostbecontroller: Waiting bitbake server to start") 134 logger.debug("localhostbecontroller: Waiting bitbake server to start")
138 time.sleep(0.5) 135 time.sleep(0.5)
136 retries += 1
137
138 if not started:
139 raise BuildSetupException("localhostbecontroller: Bitbake server did not start in 5 seconds, aborting (Error: '%s')" % (cmdoutput))
139 140
140 logger.debug("localhostbecontroller: Started bitbake server") 141 logger.debug("localhostbecontroller: Started bitbake server")
141 142
@@ -163,6 +164,25 @@ class LocalhostBEController(BuildEnvironmentController):
163 self.be.save() 164 self.be.save()
164 logger.debug("localhostbecontroller: Stopped bitbake server") 165 logger.debug("localhostbecontroller: Stopped bitbake server")
165 166
167 def getGitCloneDirectory(self, url, branch):
168 """ Utility that returns the last component of a git path as directory
169 """
170 import re
171 components = re.split(r'[:\.\/]', url)
172 base = components[-2] if components[-1] == "git" else components[-1]
173
174 if branch != "HEAD":
175 return "_%s_%s.toaster_cloned" % (base, branch)
176
177
178 # word of attention; this is a localhost-specific issue; only on the localhost we expect to have "HEAD" releases
179 # which _ALWAYS_ means the current poky checkout
180 from os.path import dirname as DN
181 local_checkout_path = DN(DN(DN(DN(DN(os.path.abspath(__file__))))))
182 #logger.debug("localhostbecontroller: using HEAD checkout in %s" % local_checkout_path)
183 return local_checkout_path
184
185
166 def setLayers(self, bitbakes, layers): 186 def setLayers(self, bitbakes, layers):
167 """ a word of attention: by convention, the first layer for any build will be poky! """ 187 """ a word of attention: by convention, the first layer for any build will be poky! """
168 188
@@ -208,15 +228,17 @@ class LocalhostBEController(BuildEnvironmentController):
208 228
209 layerlist = [] 229 layerlist = []
210 230
231
211 # 3. checkout the repositories 232 # 3. checkout the repositories
212 for giturl, commit in gitrepos.keys(): 233 for giturl, commit in gitrepos.keys():
213 localdirname = os.path.join(self.be.sourcedir, _get_git_clonedirectory(giturl, commit)) 234 localdirname = os.path.join(self.be.sourcedir, self.getGitCloneDirectory(giturl, commit))
214 logger.debug("localhostbecontroller: giturl %s:%s checking out in current directory %s" % (giturl, commit, localdirname)) 235 logger.debug("localhostbecontroller: giturl %s:%s checking out in current directory %s" % (giturl, commit, localdirname))
215 236
216 # make sure our directory is a git repository 237 # make sure our directory is a git repository
217 if os.path.exists(localdirname): 238 if os.path.exists(localdirname):
218 if not giturl in self._shellcmd("git remote -v", localdirname): 239 localremotes = self._shellcmd("git remote -v", localdirname)
219 raise BuildSetupException("Existing git repository at %s, but with different remotes (not '%s'). Aborting." % (localdirname, giturl)) 240 if not giturl in localremotes:
241 raise BuildSetupException("Existing git repository at %s, but with different remotes ('%s', expected '%s'). Toaster will not continue out of fear of damaging something." % (localdirname, ", ".join(localremotes.split("\n")), giturl))
220 else: 242 else:
221 if giturl in cached_layers: 243 if giturl in cached_layers:
222 logger.debug("localhostbecontroller git-copying %s to %s" % (cached_layers[giturl], localdirname)) 244 logger.debug("localhostbecontroller git-copying %s to %s" % (cached_layers[giturl], localdirname))
@@ -230,7 +252,7 @@ class LocalhostBEController(BuildEnvironmentController):
230 # branch magic name "HEAD" will inhibit checkout 252 # branch magic name "HEAD" will inhibit checkout
231 if commit != "HEAD": 253 if commit != "HEAD":
232 logger.debug("localhostbecontroller: checking out commit %s to %s " % (commit, localdirname)) 254 logger.debug("localhostbecontroller: checking out commit %s to %s " % (commit, localdirname))
233 self._shellcmd("git fetch --all && git checkout \"%s\"" % commit , localdirname) 255 self._shellcmd("git fetch --all && git checkout \"%s\" && git pull --rebase" % (commit) , localdirname)
234 256
235 # take the localdirname as poky dir if we can find the oe-init-build-env 257 # take the localdirname as poky dir if we can find the oe-init-build-env
236 if self.pokydirname is None and os.path.exists(os.path.join(localdirname, "oe-init-build-env")): 258 if self.pokydirname is None and os.path.exists(os.path.join(localdirname, "oe-init-build-env")):
diff --git a/bitbake/lib/toaster/bldcontrol/sshbecontroller.py b/bitbake/lib/toaster/bldcontrol/sshbecontroller.py
index be797c9486..11ad08d440 100644
--- a/bitbake/lib/toaster/bldcontrol/sshbecontroller.py
+++ b/bitbake/lib/toaster/bldcontrol/sshbecontroller.py
@@ -29,7 +29,7 @@ import subprocess
29 29
30from toastermain import settings 30from toastermain import settings
31 31
32from bbcontroller import BuildEnvironmentController, ShellCmdException, BuildSetupException, _get_git_clonedirectory 32from bbcontroller import BuildEnvironmentController, ShellCmdException, BuildSetupException
33 33
34def DN(path): 34def DN(path):
35 return "/".join(path.split("/")[0:-1]) 35 return "/".join(path.split("/")[0:-1])