def add_dependency(layerDependencyId, index, deps, required): try: depDict = bb.utils.explode_dep_versions2(deps) except bb.utils.VersionStringException as vse: bb.fatal('Error parsing LAYERDEPENDS_%s: %s' % (c, str(vse))) for dep, oplist in list(depDict.items()): # We need to search ourselves, so use the _ version... depLayerBranch = index.find_collection( dep, branches=[branchName]) if not depLayerBranch: # Missing dependency?! logger.error('Missing dependency %s (%s)' % (dep, branchName)) continue # We assume that the oplist matches... layerDependencyId += 1 layerDependency = layerindexlib.LayerDependency( index, None) layerDependency.define_data( id=layerDependencyId, required=required, layerbranch=layerBranchId, dependency=depLayerBranch.layer_id) logger.debug( 1, '%s requires %s' % (layerDependency.layer.name, layerDependency.dependency.name)) index.add_element("layerDependencies", [layerDependency]) return layerDependencyId
def store_index(self, url, index): """ Store layer information into a local file/dir. The return value is a dictionary containing API, layer, branch, dependency, recipe, machine, distro, information. ud is a parsed url to a directory or file. If the path is a directory, we will split the files into one file per layer. If the path is to a file (exists or not) the entire DB will be dumped into that one file. """ up = urlparse(url) if up.scheme != 'file': raise layerindexlib.plugin.LayerIndexPluginUrlError(self.type, url) logger.debug("Storing to %s..." % up.path) try: layerbranches = index.layerBranches except KeyError: logger.error('No layerBranches to write.') return def filter_item(layerbranchid, objects): filtered = [] for obj in getattr(index, objects, None): try: if getattr(index, objects)[obj].layerbranch_id == layerbranchid: filtered.append(getattr(index, objects)[obj]._data) except AttributeError: logger.debug('No obj.layerbranch_id: %s' % objects) # No simple filter method, just include it... try: filtered.append(getattr(index, objects)[obj]._data) except AttributeError: logger.debug('No obj._data: %s %s' % (objects, type(obj))) filtered.append(obj) return filtered # Write out to a single file. # Filter out unnecessary items, then sort as we write for determinism if not os.path.isdir(up.path): pindex = {} pindex['branches'] = [] pindex['layerItems'] = [] pindex['layerBranches'] = [] for layerbranchid in layerbranches: if layerbranches[layerbranchid].branch._data not in pindex[ 'branches']: pindex['branches'].append( layerbranches[layerbranchid].branch._data) if layerbranches[layerbranchid].layer._data not in pindex[ 'layerItems']: pindex['layerItems'].append( layerbranches[layerbranchid].layer._data) if layerbranches[layerbranchid]._data not in pindex[ 'layerBranches']: pindex['layerBranches'].append( layerbranches[layerbranchid]._data) for entry in index._index: # Skip local items, apilinks and items already processed if entry in index.config['local'] or \ entry == 'apilinks' or \ entry == 'branches' or \ entry == 'layerBranches' or \ entry == 'layerItems': continue if entry not in pindex: pindex[entry] = [] pindex[entry].extend(filter_item(layerbranchid, entry)) bb.debug(1, 'Writing index to %s' % up.path) with open(up.path, 'wt') as f: json.dump(layerindexlib.sort_entry(pindex), f, indent=4) return # Write out to a directory one file per layerBranch # Prepare all layer related items, to create a minimal file. # We have to sort the entries as we write so they are deterministic for layerbranchid in layerbranches: pindex = {} for entry in index._index: # Skip local items, apilinks and items already processed if entry in index.config['local'] or \ entry == 'apilinks' or \ entry == 'branches' or \ entry == 'layerBranches' or \ entry == 'layerItems': continue pindex[entry] = filter_item(layerbranchid, entry) # Add the layer we're processing as the first one... pindex['branches'] = [layerbranches[layerbranchid].branch._data] pindex['layerItems'] = [layerbranches[layerbranchid].layer._data] pindex['layerBranches'] = [layerbranches[layerbranchid]._data] # We also need to include the layerbranch for any dependencies... for layerdep in pindex['layerDependencies']: layerdependency = layerindexlib.LayerDependency( index, layerdep) layeritem = layerdependency.dependency layerbranch = layerdependency.dependency_layerBranch # We need to avoid duplicates... if layeritem._data not in pindex['layerItems']: pindex['layerItems'].append(layeritem._data) if layerbranch._data not in pindex['layerBranches']: pindex['layerBranches'].append(layerbranch._data) # apply mirroring adjustments here.... fname = index.config['DESCRIPTION'] + '__' + pindex['branches'][0][ 'name'] + '__' + pindex['layerItems'][0]['name'] fname = fname.translate(str.maketrans('/ ', '__')) fpath = os.path.join(up.path, fname) bb.debug(1, 'Writing index to %s' % fpath + '.json') with open(fpath + '.json', 'wt') as f: json.dump(layerindexlib.sort_entry(pindex), f, indent=4)