[Toaster] [review-request][PATCH 1/3] toaster: Import external layers outside poky from toasterconf.json
sujith h
sujith.h at gmail.com
Mon Oct 5 07:56:03 PDT 2015
The poky-contrib branch available to verify the patch set is :
http://git.yoctoproject.org/cgit/cgit.cgi/poky-contrib/log/?h=sujith/Import-external-layers-toaster-and-error-fix
On Mon, Oct 5, 2015 at 8:23 PM, Sujith H <sujith.h at gmail.com> wrote:
> This patch helps to import external layers from toasterconf.json
> which are already checked out. The branch of the checkedout layers
> is HEAD. Hence no checkout happens when toaster is using the configuration.
> This essentially speeds up toaster, while using locally checked out layers.
>
> Signed-off-by: Sujith H <sujith.h at gmail.com>
> Signed-off-by: Sujith Haridasan <Sujith_Haridasan at mentor.com>
> ---
> .../toaster/bldcontrol/localhostbecontroller.py | 108
> +++++++++++++--------
> .../bldcontrol/management/commands/loadconf.py | 14 ++-
> 2 files changed, 76 insertions(+), 46 deletions(-)
>
> diff --git a/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py
> b/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py
> index a8d8398..2b3c452 100644
> --- a/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py
> +++ b/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py
> @@ -192,6 +192,21 @@ class
> LocalhostBEController(BuildEnvironmentController):
> #logger.debug("localhostbecontroller: using HEAD checkout in %s"
> % local_checkout_path)
> return local_checkout_path
>
> + def getHeadLayers(self, gitrepos, layers):
> + """ HEAD layers are special cases. They don't need to be cloned.
> """
> +
> + layerlist = []
> + headlayers = [commit for giturl, commit in gitrepos.keys() if
> commit == "HEAD"]
> + if set(headlayers) == set(["HEAD"]):
> + # Populate layerlist if all of them are HEAD
> + for layer_version in
> Layer_Version.objects.all().filter(local_path__startswith = "/"):
> + if layer_version.commit == "HEAD":
> + if layer_version.local_path not in layerlist:
> + layerlist.append(layer_version.local_path)
> + if
> os.path.exists(os.path.join(os.path.dirname(layer_version.local_path),
> "oe-init-build-env")):
> + self.pokydirname =
> os.path.dirname(layer_version.local_path)
> + return layerlist
> +
>
> def setLayers(self, bitbakes, layers, targets):
> """ a word of attention: by convention, the first layer for any
> build will be poky! """
> @@ -239,51 +254,58 @@ class
> LocalhostBEController(BuildEnvironmentController):
> layerlist = []
>
>
> - # 3. checkout the repositories
> - for giturl, commit in gitrepos.keys():
> - localdirname = os.path.join(self.be.sourcedir,
> self.getGitCloneDirectory(giturl, commit))
> - logger.debug("localhostbecontroller: giturl %s:%s checking
> out in current directory %s" % (giturl, commit, localdirname))
> + # Verify HEAD layers
>
> - # make sure our directory is a git repository
> - if os.path.exists(localdirname):
> - localremotes = self._shellcmd("git remote -v",
> localdirname)
> - if not giturl in localremotes:
> - 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))
> - else:
> - if giturl in cached_layers:
> - logger.debug("localhostbecontroller git-copying %s to
> %s" % (cached_layers[giturl], localdirname))
> - self._shellcmd("git clone \"%s\" \"%s\"" %
> (cached_layers[giturl], localdirname))
> - self._shellcmd("git remote remove origin",
> localdirname)
> - self._shellcmd("git remote add origin \"%s\"" %
> giturl, localdirname)
> + layerlist = self.getHeadLayers(gitrepos,layers)
> +
> + # If the layerlist doesn't have already cloned layers then
> checkout repositories
> + if len(layerlist) == 0:
> +
> + # 3. checkout the repositories
> + for giturl, commit in gitrepos.keys():
> + localdirname = os.path.join(self.be.sourcedir,
> self.getGitCloneDirectory(giturl, commit))
> + logger.debug("localhostbecontroller: giturl %s:%s
> checking out in current directory %s" % (giturl, commit, localdirname))
> +
> + # make sure our directory is a git repository
> + if os.path.exists(localdirname):
> + localremotes = self._shellcmd("git remote -v",
> localdirname)
> + if not giturl in localremotes:
> + 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))
> else:
> - logger.debug("localhostbecontroller: cloning %s in
> %s" % (giturl, localdirname))
> - self._shellcmd('git clone "%s" "%s"' % (giturl,
> localdirname))
> -
> - # branch magic name "HEAD" will inhibit checkout
> - if commit != "HEAD":
> - logger.debug("localhostbecontroller: checking out commit
> %s to %s " % (commit, localdirname))
> - ref = commit if re.match('^[a-fA-F0-9]+$', commit) else
> 'origin/%s' % commit
> - self._shellcmd('git fetch --all && git reset --hard "%s"'
> % ref, localdirname)
> -
> - # take the localdirname as poky dir if we can find the
> oe-init-build-env
> - if self.pokydirname is None and
> os.path.exists(os.path.join(localdirname, "oe-init-build-env")):
> - logger.debug("localhostbecontroller: selected poky dir
> name %s" % localdirname)
> - self.pokydirname = localdirname
> -
> - # make sure we have a working bitbake
> - if not os.path.exists(os.path.join(self.pokydirname,
> 'bitbake')):
> - logger.debug("localhostbecontroller: checking bitbake
> into the poky dirname %s " % self.pokydirname)
> - self._shellcmd("git clone -b \"%s\" \"%s\" \"%s\" " %
> (bitbakes[0].commit, bitbakes[0].giturl, os.path.join(self.pokydirname,
> 'bitbake')))
> -
> - # verify our repositories
> - for name, dirpath in gitrepos[(giturl, commit)]:
> - localdirpath = os.path.join(localdirname, dirpath)
> - logger.debug("localhostbecontroller: localdirpath
> expected '%s'" % localdirpath)
> - if not os.path.exists(localdirpath):
> - raise BuildSetupException("Cannot find layer git path
> '%s' in checked out repository '%s:%s'. Aborting." % (localdirpath, giturl,
> commit))
> -
> - if name != "bitbake":
> - layerlist.append(localdirpath.rstrip("/"))
> + if giturl in cached_layers:
> + logger.debug("localhostbecontroller git-copying
> %s to %s" % (cached_layers[giturl], localdirname))
> + self._shellcmd("git clone \"%s\" \"%s\"" %
> (cached_layers[giturl], localdirname))
> + self._shellcmd("git remote remove origin",
> localdirname)
> + self._shellcmd("git remote add origin \"%s\"" %
> giturl, localdirname)
> + else:
> + logger.debug("localhostbecontroller: cloning %s
> in %s" % (giturl, localdirname))
> + self._shellcmd('git clone "%s" "%s"' % (giturl,
> localdirname))
> +
> + # branch magic name "HEAD" will inhibit checkout
> + if commit != "HEAD":
> + logger.debug("localhostbecontroller: checking out
> commit %s to %s " % (commit, localdirname))
> + ref = commit if re.match('^[a-fA-F0-9]+$', commit)
> else 'origin/%s' % commit
> + self._shellcmd('git fetch --all && git reset --hard
> "%s"' % ref, localdirname)
> +
> + # take the localdirname as poky dir if we can find the
> oe-init-build-env
> + if self.pokydirname is None and
> os.path.exists(os.path.join(localdirname, "oe-init-build-env")):
> + logger.debug("localhostbecontroller: selected poky
> dir name %s" % localdirname)
> + self.pokydirname = localdirname
> +
> + # make sure we have a working bitbake
> + if not os.path.exists(os.path.join(self.pokydirname,
> 'bitbake')):
> + logger.debug("localhostbecontroller: checking
> bitbake into the poky dirname %s " % self.pokydirname)
> + self._shellcmd("git clone -b \"%s\" \"%s\" \"%s\"
> " % (bitbakes[0].commit, bitbakes[0].giturl, os.path.join(self.pokydirname,
> 'bitbake')))
> +
> + # verify our repositories
> + for name, dirpath in gitrepos[(giturl, commit)]:
> + localdirpath = os.path.join(localdirname, dirpath)
> + logger.debug("localhostbecontroller: localdirpath
> expected '%s'" % localdirpath)
> + if not os.path.exists(localdirpath):
> + raise BuildSetupException("Cannot find layer git
> path '%s' in checked out repository '%s:%s'. Aborting." % (localdirpath,
> giturl, commit))
> +
> + if name != "bitbake":
> + layerlist.append(localdirpath.rstrip("/"))
>
> logger.debug("localhostbecontroller: current layer list %s " %
> pformat(layerlist))
>
> diff --git
> a/bitbake/lib/toaster/bldcontrol/management/commands/loadconf.py
> b/bitbake/lib/toaster/bldcontrol/management/commands/loadconf.py
> index 5022b59..21bc380 100644
> --- a/bitbake/lib/toaster/bldcontrol/management/commands/loadconf.py
> +++ b/bitbake/lib/toaster/bldcontrol/management/commands/loadconf.py
> @@ -45,12 +45,14 @@ class Command(BaseCommand):
> for i in ['bitbake', 'releases', 'defaultrelease', 'config',
> 'layersources']:
> assert i in data
>
> - def _read_git_url_from_local_repository(address):
> + def _read_git_url_from_local_repository(address, path = None):
> url = None
> + if not path:
> + path = os.path.dirname(filepath)
> # we detect the remote name at runtime
> import subprocess
> (remote, remote_name) = address.split(":", 1)
> - cmd = subprocess.Popen("git remote -v", shell=True, cwd =
> os.path.dirname(filepath), stdout=subprocess.PIPE, stderr = subprocess.PIPE)
> + cmd = subprocess.Popen("git remote -v", shell=True, cwd =
> path, stdout=subprocess.PIPE, stderr = subprocess.PIPE)
> (out,err) = cmd.communicate()
> if cmd.returncode != 0:
> logging.warning("Error while importing layer vcs_url: git
> error: %s" % err)
> @@ -121,7 +123,11 @@ class Command(BaseCommand):
> logger.error("Local layer path %s must exists.
> Are you trying to import a layer that does not exist ? Check your local
> toasterconf.json" % lo.local_path)
>
> if layerinfo['vcs_url'].startswith("remote:"):
> - lo.vcs_url =
> _read_git_url_from_local_repository(layerinfo['vcs_url'])
> + if not layerinfo['local_path'].startswith("/"):
> + path = None
> + else:
> + path = layerinfo['local_path']
> + lo.vcs_url =
> _read_git_url_from_local_repository(layerinfo['vcs_url'], path)
> if lo.vcs_url is None:
> logger.error("The toaster config file
> references the local git repo, but Toaster cannot detect it.\nYour local
> configuration for layer %s is invalid. Make sure that the toasterconf.json
> file is correct." % layerinfo['name'])
>
> @@ -138,6 +144,8 @@ class Command(BaseCommand):
> commit = branch.name,
> layer = lo)
> lvo.dirpath = layerinfo['dirpath']
> + if len(layerinfo['local_path']) > 1 and
> layerinfo['local_path'].startswith("/") and branch.name == "HEAD":
> + lvo.local_path = layerinfo['local_path']
> lvo.save()
> # set releases
> for ri in data['releases']:
> --
> 1.9.1
>
>
--
സുജിത് ഹരിദാസന്
Bangalore
<Project>Contributor to KDE project
http://fci.wikia.com/wiki/Anti-DRM-Campaign
<Blog> http://sujithh.info
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.yoctoproject.org/pipermail/toaster/attachments/20151005/98311468/attachment-0001.html>
More information about the toaster
mailing list