import_project will scan through a project and find any layer and add it to the database by calling import_layer on each layer. This differs from import_layer as it tires to figure out the remote url and uses the subdirectory (if one exists) as the name.
Signed-off-by: Liam R. Howlett <liam.howl...@windriver.com> --- layerindex/tools/import_project.py | 180 +++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100755 layerindex/tools/import_project.py diff --git a/layerindex/tools/import_project.py b/layerindex/tools/import_project.py new file mode 100755 index 0000000..511282d --- /dev/null +++ b/layerindex/tools/import_project.py @@ -0,0 +1,180 @@ +#!/usr/bin/python3 + +# Import a project into the database. +# This will scan through the directories in a project and find any layer and +# call import_layer. +# +# +# Copyright (C) 2016 Wind River Systems +# Author: Liam R. Howlett <liam.howl...@windriver.com> +# +# Licensed under the MIT license, see COPYING.MIT for details + +from git import Repo +from urllib.parse import urlparse +import logging +import optparse +import os, fnmatch +import sys + +sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), '..'))) + +import import_layer +import update + +import utils + + + + +class ImportProject: + logger = utils.logger_create('ProjectIndexImport') + + def find_layers(self, path): + self.logger.debug("finding layer.."); + result = [] + for root, dirs, files in os.walk(path, followlinks=True): + for name in fnmatch.filter(files, 'layer.conf'): + if not root.endswith('conf'): + continue + + self.logger.debug("Found %s" % root) + result.append(root) + return result + + + def main(self): + parser = optparse.OptionParser( + usage = """ + %prog [options] [directory]""") + + parser.add_option("-d", "--debug", + help = "Enable debug output", + action="store_const", const=logging.DEBUG, dest="loglevel", default=logging.INFO) + parser.add_option("-n", "--dry-run", + help = "Don't write any data back to the database", + action="store_true", dest="dryrun") + + self.options, args = parser.parse_args(sys.argv) + + self.logger.setLevel(self.options.loglevel) + + if len(args) == 1: + print("Please provide a directory."); + sys.exit(1) + + install_dir = args[1] + lc_list = self.find_layers(install_dir) + core_layer = self.add_core(lc_list) + if core_layer: + lc_list.remove(core_layer) + + + + for layer in lc_list: + self.add_layer(layer) + + def add_layer(self, layer): + self.logger.debug("Processing layer %s" % layer); + try: + git_dir = utils.runcmd("git rev-parse --show-toplevel", destdir=layer, logger=self.logger) + except Exception as e: + self.logger.error("Cannot get root dir for layer %s: %s - Skipping." % (layer, str(e))) + return 1 + + repo = Repo(git_dir) + actual_branch = repo.active_branch.name + + + layer_name = layer.split('/')[-2] + + layer_subdir = None + if os.path.basename(git_dir) != layer_name: + layer_subdir = layer_name + + layer_name = self.get_layer_name(layer) + + for i in [1, 2, 3]: + try: + git_url = utils.runcmd("git config --get remote.origin.url", destdir=git_dir, logger=self.logger) + except Exception as e: + self.logger.info("Cannot get remote.origin.url for git dir %s: %s" % (git_dir, str(e))) + + if not os.path.exists(git_url): + # Assume this is remote. + self.logger.debug("Found git url = %s" % git_url) + break; + self.logger.debug("Iterating to find git url into %s" % git_dir) + git_dir = git_url + + cmd = ['import_layer.py'] + if self.options.loglevel == logging.DEBUG: + cmd.append("-d") + if layer_subdir: + cmd.append("-s") + cmd.append(layer_subdir) + + if actual_branch: + cmd.append("-a") + cmd.append(actual_branch) + cmd.append(git_url) + cmd.append(layer_name) + prefix = "Calling" + + if self.options.dryrun: + prefix = "Would Call" + + + self.logger.info("%s import_layer.main with %s for dir %s" % (prefix, str(cmd), layer)) + sys.argv = cmd + if not self.options.dryrun: + try: + import_layer.main(); + except SystemExit as see: + return see.code + return 0 + + def get_layer_name(self, layerconfdir): + layer_name = layerconfdir.split('/')[-2] + self.logger.debug('getting layer %s' % layerconfdir) + layer_conf = os.path.join(layerconfdir, 'layer.conf') + if os.path.isfile(layer_conf): + with open(layer_conf) as conf: + for line in conf: + if 'BBLAYERS_LAYERINDEX_NAME' in line: + layer_name = line.split('=')[1].strip(' "\n') + return layer_name + + def add_core(self, layers): + utils.setup_django() + core = None + import settings + for layer in layers: + layer_name = self.get_layer_name(layer) + if layer_name == settings.CORE_LAYER_NAME: + if self.add_layer(layer): + self.logger.info('Failed to add core layer\n') + core = layer + self.update() + break + return core + + def update(self): + update_py = os.path.realpath(os.path.join(os.path.dirname(__file__), '../update.py')) + cmd = [update_py] + if self.options.loglevel == logging.DEBUG: + cmd.append("-d") + sys.argv = cmd + self.logger.info("update") + if not self.options.dryrun: + try: + update.main(); + except SystemExit: + return 1 + + return 0 + + +if __name__ == "__main__": + x = ImportProject() + x.main() -- 1.9.1 -- _______________________________________________ yocto mailing list yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/yocto