layerindex-web/rrs/tools/common.py
Paul Eggleton add075ae00 rrs/tools/common.py: ensure we pass a string to loadDataFull()
We're calling translate() on the string deep in the bowels of the
parsing code and that doesn't work well if the string is unicode, so
convert it to a plain string first. That won't work well if the filename
is unicode but the chances of that with a recipe is pretty small I would
think.

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
2018-05-04 23:57:53 +12:00

155 lines
4.4 KiB
Python

# Common functionality for RRS tools.
#
# Copyright (C) 2015 Intel Corporation
# Author: Anibal Limon <anibal.limon@linux.intel.com>
#
# Licensed under the MIT license, see COPYING.MIT for details
import sys
import os
import logging
class DryRunRollbackException(Exception):
pass
def common_setup():
sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), '../../')))
sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), '../../layerindex')))
def get_logger(name, settings):
from logging.handlers import RotatingFileHandler
logger = logging.getLogger(name)
formatter = logging.Formatter("%(asctime)s: %(levelname)s: %(message)s")
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger.addHandler(handler)
filename = os.path.join(settings.TOOLS_LOG_DIR, name)
maxBytes = 8388608 # 8MB
handler = RotatingFileHandler(filename, maxBytes=maxBytes)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)
return logger
def get_pv_type(pv):
pv_type = ''
if '+git' in pv:
pv_type = 'git'
elif '+svn' in pv:
pv_type = 'svn'
elif '+hg' in pv:
pv_type = 'hg'
return pv_type
def get_recipe_files(layerdir):
from layerindex import recipeparse
sublayer_dirs = []
for root, dirs, files in os.walk(layerdir):
for d in dirs:
if os.path.exists(os.path.join(root, d, 'conf', 'layer.conf')):
sublayer_dirs.append(os.path.join(root, d) + os.sep)
recipe_files = []
for root, dirs, files in os.walk(layerdir):
if '.git' in dirs:
dirs.remove('.git')
# remove sublayer dirs
for d in dirs[:]:
fullpath = os.path.join(root, d) + os.sep
if fullpath in sublayer_dirs:
dirs.remove(d)
for f in files:
fullpath = os.path.join(root, f)
(typename, _, filename) = recipeparse.detect_file_type(fullpath,
layerdir + os.sep)
if typename == 'recipe':
recipe_files.append(fullpath)
return recipe_files
def load_recipes(layerbranch, bitbakepath, fetchdir, settings, logger,
recipe_files=None, nocheckout=False):
from layerindex import recipeparse
from bb.fetch import FetchError
try:
(tinfoil, tempdir) = recipeparse.init_parser(settings,
layerbranch.branch, bitbakepath, nocheckout=nocheckout,
logger=logger)
except recipeparse.RecipeParseError as e:
logger.error(str(e))
sys.exit(1)
layer = layerbranch.layer
urldir = str(layer.get_fetch_dir())
repodir = os.path.join(fetchdir, urldir)
layerdir = os.path.join(repodir, str(layerbranch.vcs_subdir))
d = recipeparse.setup_layer(tinfoil.config_data, fetchdir, layerdir,
layer, layerbranch)
if recipe_files is None:
recipe_files = get_recipe_files(layerdir)
recipes = []
for fn in recipe_files:
try:
logger.debug('Parsing %s' % fn)
if hasattr(tinfoil, 'parse_recipe_file'):
data = tinfoil.parse_recipe_file(fn, appends=False, config_data=d)
else:
data = bb.cache.Cache.loadDataFull(str(fn), [], d)
try:
pv = data.getVar('PV', True)
except FetchError:
data.setVar('SRCPV', '')
recipes.append(data)
except Exception as e:
logger.error("%s: branch %s couldn't be parsed, %s" \
% (layerbranch, fn, str(e)))
continue
return (tinfoil, d, recipes)
# XXX: Copied from oe-core recipeutils to avoid import errors.
def get_recipe_pv_without_srcpv(pv, uri_type):
"""
Get PV without SRCPV common in SCM's for now only
support git.
Returns tuple with pv, prefix and suffix.
"""
import re
pfx = ''
sfx = ''
if uri_type == 'git':
git_regex = re.compile("(?P<pfx>(v|r|))(?P<ver>((\d+[\.\-_]*)+))(?P<sfx>(\+|)(git|)(r|)(AUTOINC|)(\+|))(?P<rev>.*)")
m = git_regex.match(pv)
if m:
pv = m.group('ver')
pfx = m.group('pfx')
sfx = m.group('sfx')
else:
regex = re.compile("(?P<pfx>(v|r|))(?P<ver>((\d+[\.\-_]*)+))")
m = regex.match(pv)
if m:
pv = m.group('ver')
pfx = m.group('pfx')
return (pv, pfx, sfx)