def promoteTroves(cfg, troveSpecs, targetList, skipBuildInfo=False, info=False, message=None, test=False, ignoreConflicts=False, cloneOnlyByDefaultTroves=False, cloneSources=False, allFlavors=False, client=None, targetFile=None, exactFlavors=None, excludeGroups=False): targetMap = {} searchPath = [] for fromLoc, toLoc in targetList: context = cfg.buildLabel fromLoc = _convertLabelOrBranch(fromLoc, context) if fromLoc is not None: if isinstance(fromLoc, versions.Branch): context = fromLoc.label() else: context = fromLoc searchPath.append(context) toLoc = _convertLabelOrBranch(toLoc, context) targetMap[fromLoc] = toLoc troveSpecs = [cmdline.parseTroveSpec(x, False) for x in troveSpecs] if exactFlavors: allFlavors = False elif allFlavors: cfg.flavor = [] troveSpecFlavors = {} for troveSpec in troveSpecs: troveSpecFlavors.setdefault((troveSpec[0], troveSpec[1], None), []).append(troveSpec[2]) troveSpecs = list(troveSpecFlavors) client = ConaryClient(cfg) if not searchPath: searchPath = cfg.buildLabel searchSource = client.getSearchSource(installLabelPath=searchPath) results = searchSource.findTroves(troveSpecs, bestFlavor=not allFlavors, exactFlavors=exactFlavors) if allFlavors: trovesToClone = [] for troveSpec, troveTups in results.items(): specFlavors = troveSpecFlavors[troveSpec] for specFlavor in specFlavors: if specFlavor is None: matchingTups = troveTups else: matchingTups = [ x for x in troveTups if x[2].stronglySatisfies(specFlavor) ] # we only clone the latest version for all troves. # bestFlavor=False resturns the leaves for all flavors, so # we may need to cut some out. latest = max([x[1] for x in matchingTups]) matchingTups = [x for x in matchingTups if x[1] == latest] trovesToClone.extend(matchingTups) else: trovesToClone = itertools.chain(*results.itervalues()) trovesToClone = list(set(trovesToClone)) if not client.cfg.quiet: callback = client_callbacks.CloneCallback(client.cfg, message) else: callback = callbacks.CloneCallback() okay, cs = client.createSiblingCloneChangeSet( targetMap, trovesToClone, updateBuildInfo=not skipBuildInfo, infoOnly=info, callback=callback, cloneOnlyByDefaultTroves=cloneOnlyByDefaultTroves, cloneSources=cloneSources, excludeGroups=excludeGroups) if not okay: return False return _finishClone(client, cfg, cs, callback, info=info, test=test, ignoreConflicts=ignoreConflicts, targetFile=targetFile)
def promoteTroves(cfg, troveSpecs, targetList, skipBuildInfo=False, info=False, message=None, test=False, ignoreConflicts=False, cloneOnlyByDefaultTroves=False, cloneSources = False, allFlavors = False, client=None, targetFile = None, exactFlavors = None, excludeGroups = False): targetMap = {} searchPath = [] for fromLoc, toLoc in targetList: context = cfg.buildLabel fromLoc = _convertLabelOrBranch(fromLoc, context) if fromLoc is not None: if isinstance(fromLoc, versions.Branch): context = fromLoc.label() else: context = fromLoc searchPath.append(context) toLoc = _convertLabelOrBranch(toLoc, context) targetMap[fromLoc] = toLoc troveSpecs = [ cmdline.parseTroveSpec(x, False) for x in troveSpecs ] if exactFlavors: allFlavors = False elif allFlavors: cfg.flavor = [] troveSpecFlavors = {} for troveSpec in troveSpecs: troveSpecFlavors.setdefault( (troveSpec[0], troveSpec[1], None), []).append(troveSpec[2]) troveSpecs = list(troveSpecFlavors) client = ConaryClient(cfg) if not searchPath: searchPath = cfg.buildLabel searchSource = client.getSearchSource(installLabelPath=searchPath) results = searchSource.findTroves(troveSpecs, bestFlavor=not allFlavors, exactFlavors=exactFlavors) if allFlavors: trovesToClone = [] for troveSpec, troveTups in results.items(): specFlavors = troveSpecFlavors[troveSpec] for specFlavor in specFlavors: if specFlavor is None: matchingTups = troveTups else: matchingTups = [ x for x in troveTups if x[2].stronglySatisfies(specFlavor)] # we only clone the latest version for all troves. # bestFlavor=False resturns the leaves for all flavors, so # we may need to cut some out. latest = max([x[1] for x in matchingTups]) matchingTups = [ x for x in matchingTups if x[1] == latest ] trovesToClone.extend(matchingTups) else: trovesToClone = itertools.chain(*results.itervalues()) trovesToClone = list(set(trovesToClone)) if not client.cfg.quiet: callback = client_callbacks.CloneCallback(client.cfg, message) else: callback = callbacks.CloneCallback() okay, cs = client.createSiblingCloneChangeSet( targetMap, trovesToClone, updateBuildInfo=not skipBuildInfo, infoOnly=info, callback=callback, cloneOnlyByDefaultTroves=cloneOnlyByDefaultTroves, cloneSources=cloneSources, excludeGroups=excludeGroups) if not okay: return False return _finishClone(client, cfg, cs, callback, info=info, test=test, ignoreConflicts=ignoreConflicts, targetFile=targetFile)