예제 #1
0
파일: clone.py 프로젝트: pombreda/conary-1
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)
예제 #2
0
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)