def testLoadInstalledInRoot(self): # make sure that we find this autoconf213 trove even though it's # been built. (RMK-371) self.openRepository() repos = self.openRmakeRepository() sourceV = VFS('/localhost@rpl:1//autoconf213/2.13-1.1') binV = sourceV.createShadow(versions.Label('rmakehost@rpl:1')) binV.incrementBuildCount() loadInstalledRecipe = fixtures.loadInstalledRecipe.replace( "loadInstalled('loaded')", "loadInstalled('loaded=:autoconf213')") self.addComponent('loaded:runtime', str(binV)) trv = self.addCollection('loaded', str(binV), [':runtime']) self.updatePkg('loaded=rmakehost@rpl:1') self.addComponent('loaded:source', str(sourceV), [('loaded.recipe', fixtures.loadedRecipe.replace('@@', '2.13'))]) trv = self.addComponent('loadinstalled:source', '1', [('loadinstalled.recipe', loadInstalledRecipe)]) n,v,f = trv.getNameVersionFlavor() db = self.openDatabase() source = recipeutil.RemoveHostSource(db, 'rmakehost') (loader, recipeClass, localFlags, usedFlags) = \ recipeutil.loadRecipeClass(repos, n, v, f, ignoreInstalled=False, root=self.cfg.root, loadInstalledSource=source) assert(recipeClass.loadedVersion == '2.13')
def testLoadInstalledInRoot(self): # make sure that we find this autoconf213 trove even though it's # been built. (RMK-371) self.openRepository() repos = self.openRmakeRepository() sourceV = VFS("/localhost@rpl:1//autoconf213/2.13-1.1") binV = sourceV.createShadow(versions.Label("rmakehost@rpl:1")) binV.incrementBuildCount() loadInstalledRecipe = fixtures.loadInstalledRecipe.replace( "loadInstalled('loaded')", "loadInstalled('loaded=:autoconf213')" ) self.addComponent("loaded:runtime", str(binV)) trv = self.addCollection("loaded", str(binV), [":runtime"]) self.updatePkg("loaded=rmakehost@rpl:1") self.addComponent( "loaded:source", str(sourceV), [("loaded.recipe", fixtures.loadedRecipe.replace("@@", "2.13"))] ) trv = self.addComponent("loadinstalled:source", "1", [("loadinstalled.recipe", loadInstalledRecipe)]) n, v, f = trv.getNameVersionFlavor() db = self.openDatabase() source = recipeutil.RemoveHostSource(db, "rmakehost") (loader, recipeClass, localFlags, usedFlags) = recipeutil.loadRecipeClass( repos, n, v, f, ignoreInstalled=False, root=self.cfg.root, loadInstalledSource=source ) assert recipeClass.loadedVersion == "2.13"
def testLoad2LevelsDeep(self): myLoadedRecipe = loadedRecipe.replace('@@', '1') myLoadedRecipe = "loadSuperClass('loaded2')\n" + myLoadedRecipe loadedSrc = self.addComponent('loaded:source', ':branch/1', [('loaded.recipe', myLoadedRecipe)]) self.addComponent('loaded:runtime', ':branch/1') loaded = self.addCollection('loaded', ':branch/1', ['loaded:runtime']) loaded2 = self.addComponent('loaded2:source', ':branch2/1', [('loaded2.recipe', loaded2Recipe)]) loadInstalled = self.addComponent( 'loadinstalled:source', '1', [('loadinstalled.recipe', loadInstalledRecipe)]) buildCfg = copy.deepcopy(self.buildCfg) buildCfg.resolveTroveTups = [[ loaded.getNameVersionFlavor(), loaded2.getNameVersionFlavor() ]] job = self.newJob(loadInstalled, buildConfig=buildCfg) b = builder.Builder(self.rmakeCfg, job) b.initializeBuild() buildTrove = job.iterTroves().next() assert (buildTrove.packages == set(['loadinstalled', 'loaded-1'])) assert (buildTrove.getLoadedSpecs() == dict( loaded=(loadedSrc.getNameVersionFlavor(), dict(loaded2=(loaded2.getNameVersionFlavor(), {}))))) # make sure that the correct version are loaded using loadRecipeClass # normally using loadRecipeClass we'd just load out of the repository self.addComponent('loaded:source', '1', [('loaded.recipe', myLoadedRecipe)]) n, v, f = loadInstalled.getNameVersionFlavor() repos = self.openRepository() repos = self.openRmakeRepository() loader, recipeClass = recipeutil.loadRecipeClass( repos, n, v, f, overrides=buildTrove.getLoadedSpecs())[0:2] if hasattr(loader, 'getLoadedSpecs'): assert (loader.getLoadedSpecs().values()[0][0] == loadedSrc.getNameVersionFlavor()) else: assert(recipeClass._loadedSpecs.values()[0][0] \ == loadedSrc.getNameVersionFlavor()) # test that again, except for this time, make sure that cook # gets the same info - cook would never find these troves # without having it passed in from the outside. job = self.newJob(loadInstalled, buildConfig=buildCfg) b = builder.Builder(self.rmakeCfg, job) txt = self.captureOutput(b.build)[1] assert (b.job.isBuilt()) buildTrove = b.job.iterTroves().next() builtTroves = repos.getTroves( [x for x in buildTrove.getBinaryTroves() if ':' not in x[0]]) builtTroves = dict((x.getName(), x) for x in builtTroves) assert (set(builtTroves['loadinstalled'].getLoadedTroves()) == set( [loadedSrc.getNameVersionFlavor(), loaded2.getNameVersionFlavor()]))
def testLoad2LevelsDeep(self): myLoadedRecipe = loadedRecipe.replace('@@', '1') myLoadedRecipe = "loadSuperClass('loaded2')\n" + myLoadedRecipe loadedSrc = self.addComponent('loaded:source', ':branch/1', [('loaded.recipe', myLoadedRecipe)]) self.addComponent('loaded:runtime', ':branch/1') loaded = self.addCollection('loaded', ':branch/1', ['loaded:runtime']) loaded2 = self.addComponent('loaded2:source', ':branch2/1', [('loaded2.recipe', loaded2Recipe)]) loadInstalled = self.addComponent('loadinstalled:source', '1', [('loadinstalled.recipe', loadInstalledRecipe)]) buildCfg = copy.deepcopy(self.buildCfg) buildCfg.resolveTroveTups = [[loaded.getNameVersionFlavor(), loaded2.getNameVersionFlavor()]] job = self.newJob(loadInstalled, buildConfig=buildCfg) b = builder.Builder(self.rmakeCfg, job) b.initializeBuild() buildTrove = job.iterTroves().next() assert(buildTrove.packages == set(['loadinstalled', 'loaded-1'])) assert(buildTrove.getLoadedSpecs() == dict(loaded=(loadedSrc.getNameVersionFlavor(), dict(loaded2=(loaded2.getNameVersionFlavor(), {}))))) # make sure that the correct version are loaded using loadRecipeClass # normally using loadRecipeClass we'd just load out of the repository self.addComponent('loaded:source', '1', [('loaded.recipe', myLoadedRecipe)]) n, v, f = loadInstalled.getNameVersionFlavor() repos = self.openRepository() repos = self.openRmakeRepository() loader, recipeClass = recipeutil.loadRecipeClass(repos, n, v, f, overrides = buildTrove.getLoadedSpecs())[0:2] if hasattr(loader, 'getLoadedSpecs'): assert(loader.getLoadedSpecs().values()[0][0] == loadedSrc.getNameVersionFlavor()) else: assert(recipeClass._loadedSpecs.values()[0][0] \ == loadedSrc.getNameVersionFlavor()) # test that again, except for this time, make sure that cook # gets the same info - cook would never find these troves # without having it passed in from the outside. job = self.newJob(loadInstalled, buildConfig=buildCfg) b = builder.Builder(self.rmakeCfg, job) txt = self.captureOutput(b.build)[1] assert(b.job.isBuilt()) buildTrove = b.job.iterTroves().next() builtTroves = repos.getTroves([ x for x in buildTrove.getBinaryTroves() if ':' not in x[0]]) builtTroves = dict((x.getName(), x) for x in builtTroves) assert(set(builtTroves['loadinstalled'].getLoadedTroves()) == set([loadedSrc.getNameVersionFlavor(), loaded2.getNameVersionFlavor()]))
def _cookTrove(cfg, repos, name, version, flavorList, targetLabel, loadSpecsList, csFile, buildReqs, crossReqs, failureFd, logger): baseFlavor = cfg.buildFlavor db = database.Database(cfg.root, cfg.dbPath) buildLabel = version.trailingLabel() buildBranch = version.branch() binaryBranch = version.getBinaryVersion().branch() if targetLabel: source = recipeutil.RemoveHostSource(db, targetLabel.getHost()) if version.trailingLabel() == targetLabel and version.depth() > 1: buildBranch = version.branch().parentBranch() buildLabel = buildBranch.label() revision = versions.Revision('1-1') binaryBranch = buildBranch.createVersion(revision)\ .getBinaryVersion().branch() else: source = db loaders = [] recipeClasses = [] if not isinstance(flavorList, (tuple, list)): flavorList = [flavorList] if not isinstance(loadSpecsList, (tuple, list)): loadSpecsList = [loadSpecsList] * len(flavorList) for flavor, loadSpecs in itertools.izip(flavorList, loadSpecsList): try: logger.debug('Cooking %s=%s[%s] to %s (stored in %s)' % \ (name, version, flavor, targetLabel, csFile)) cfg.buildFlavor = deps.overrideFlavor(baseFlavor, flavor) cfg.initializeFlavors() (loader, recipeClass, localFlags, usedFlags) = \ recipeutil.loadRecipeClass(repos, name, version, cfg.buildFlavor, ignoreInstalled=False, root=cfg.root, loadInstalledSource=source, overrides=loadSpecs, cfg=cfg) loaders.append(loader) recipeClasses.append(recipeClass) recipeClass.buildRequirementsOverride = buildReqs recipeClass.crossRequirementsOverride = crossReqs except Exception, msg: errMsg = 'Error loading recipe %s=%s[%s]: %s' % \ (name, version, flavor, str(msg)) _buildFailed(failureFd, errMsg, traceback.format_exc())