diff options
author | Alexandru DAMIAN <alexandru.damian@intel.com> | 2015-02-02 17:57:36 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-02-10 23:07:48 +0000 |
commit | 202d808f890b03958cd6873486e6a37f3f437098 (patch) | |
tree | 7b88e2cb5ab7b85648821bec4d2f4c16d290207f /bitbake/lib/toaster/bldcontrol | |
parent | b741c9a4b4047439c6c5428e36a72c22a784feda (diff) | |
download | poky-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.py | 13 | ||||
-rw-r--r-- | bitbake/lib/toaster/bldcontrol/localhostbecontroller.py | 54 | ||||
-rw-r--r-- | bitbake/lib/toaster/bldcontrol/sshbecontroller.py | 2 |
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 | ||
84 | def _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 | |||
97 | class BuildEnvironmentController(object): | 84 | class 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 | ||
31 | from toastermain import settings | 31 | from toastermain import settings |
32 | 32 | ||
33 | from bbcontroller import BuildEnvironmentController, ShellCmdException, BuildSetupException, _get_git_clonedirectory | 33 | from bbcontroller import BuildEnvironmentController, ShellCmdException, BuildSetupException |
34 | 34 | ||
35 | import logging | 35 | import logging |
36 | logger = logging.getLogger("toaster") | 36 | logger = 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 | ||
30 | from toastermain import settings | 30 | from toastermain import settings |
31 | 31 | ||
32 | from bbcontroller import BuildEnvironmentController, ShellCmdException, BuildSetupException, _get_git_clonedirectory | 32 | from bbcontroller import BuildEnvironmentController, ShellCmdException, BuildSetupException |
33 | 33 | ||
34 | def DN(path): | 34 | def DN(path): |
35 | return "/".join(path.split("/")[0:-1]) | 35 | return "/".join(path.split("/")[0:-1]) |