def init_bbhandler(self, config_only = False):
if not self.bbhandler:
- self.bbhandler = bb.tinfoil.Tinfoil()
+ self.bbhandler = bb.tinfoil.Tinfoil(tracking=True)
self.bblayers = (self.bbhandler.config_data.getVar('BBLAYERS', True) or "").split()
self.bbhandler.prepare(config_only)
+ layerconfs = self.bbhandler.config_data.varhistory.get_variable_items_files('BBFILE_COLLECTIONS', self.bbhandler.config_data)
+ self.bbfile_collections = {layer: os.path.dirname(os.path.dirname(path)) for layer, path in layerconfs.iteritems()}
+
def do_show_layers(self, args):
"""show current configured layers"""
self.init_bbhandler(config_only = True)
logger.plain("%s %s %s" % ("layer".ljust(20), "path".ljust(40), "priority"))
logger.plain('=' * 74)
- for layerdir in self.bblayers:
+ for layer, _, regex, pri in self.bbhandler.cooker.recipecache.bbfile_config_priorities:
+ layerdir = self.bbfile_collections.get(layer, None)
layername = self.get_layer_name(layerdir)
- layerpri = 0
- for layer, _, regex, pri in self.bbhandler.cooker.recipecache.bbfile_config_priorities:
- if regex.match(os.path.join(layerdir, 'test')):
- layerpri = pri
- break
-
- logger.plain("%s %s %d" % (layername.ljust(20), layerdir.ljust(40), layerpri))
+ logger.plain("%s %s %d" % (layername.ljust(20), layerdir.ljust(40), pri))
def do_add_layer(self, args):
logger.warning("File %s does not match the flattened layer's BBFILES setting, you may need to edit conf/layer.conf or move the file elsewhere" % f1full)
def get_file_layer(self, filename):
- for layer, _, regex, _ in self.bbhandler.cooker.recipecache.bbfile_config_priorities:
- if regex.match(filename):
- for layerdir in self.bblayers:
- if regex.match(os.path.join(layerdir, 'test')) and re.match(layerdir, filename):
- return self.get_layer_name(layerdir)
- return "?"
+ layerdir = self.get_file_layerdir(filename)
+ if layerdir:
+ return self.get_layer_name(layerdir)
+ else:
+ return '?'
def get_file_layerdir(self, filename):
- for layer, _, regex, _ in self.bbhandler.cooker.recipecache.bbfile_config_priorities:
- if regex.match(filename):
- for layerdir in self.bblayers:
- if regex.match(os.path.join(layerdir, 'test')) and re.match(layerdir, filename):
- return layerdir
- return "?"
+ layer = bb.utils.get_file_layer(filename, self.bbhandler.config_data)
+ return self.bbfile_collections.get(layer, None)
def remove_layer_prefix(self, f):
"""Remove the layer_dir prefix, e.g., f = /path/to/layer_dir/foo/blah, the
return value will be: layer_dir/foo/blah"""
f_layerdir = self.get_file_layerdir(f)
+ if not f_layerdir:
+ return f
prefix = os.path.join(os.path.dirname(f_layerdir), '')
return f[len(prefix):] if f.startswith(prefix) else f
lines.append(line)
return lines
+ def get_variable_items_files(self, var, d):
+ """
+ Use variable history to map items added to a list variable and
+ the files in which they were added.
+ """
+ history = self.variable(var)
+ finalitems = (d.getVar(var, True) or '').split()
+ filemap = {}
+ isset = False
+ for event in history:
+ if 'flag' in event:
+ continue
+ if event['op'] == '_remove':
+ continue
+ if isset and event['op'] == 'set?':
+ continue
+ isset = True
+ items = d.expand(event['detail']).split()
+ for item in items:
+ # This is a little crude but is belt-and-braces to avoid us
+ # having to handle every possible operation type specifically
+ if item in finalitems and not item in filemap:
+ filemap[item] = event['file']
+ return filemap
+
def del_var_history(self, var, f=None, line=None):
"""If file f and line are not given, the entire history of var is deleted"""
if var in self.variables:
import fcntl
import subprocess
import glob
+import fnmatch
import traceback
import errno
import signal
for collection in collections:
collection_res[collection] = d.getVar('BBFILE_PATTERN_%s' % collection, True) or ''
- # Use longest path so we handle nested layers
- matchlen = 0
- match = None
- for collection, regex in collection_res.iteritems():
- if len(regex) > matchlen and re.match(regex, filename):
- matchlen = len(regex)
- match = collection
- return match
+ def path_to_layer(path):
+ # Use longest path so we handle nested layers
+ matchlen = 0
+ match = None
+ for collection, regex in collection_res.iteritems():
+ if len(regex) > matchlen and re.match(regex, path):
+ matchlen = len(regex)
+ match = collection
+ return match
+
+ result = None
+ bbfiles = (d.getVar('BBFILES', True) or '').split()
+ bbfilesmatch = False
+ for bbfilesentry in bbfiles:
+ if fnmatch.fnmatch(filename, bbfilesentry):
+ bbfilesmatch = True
+ result = path_to_layer(bbfilesentry)
+
+ if not bbfilesmatch:
+ # Probably a bbclass
+ result = path_to_layer(filename)
+
+ return result