Esempio n. 1
0
def main(args):
    import time
    from conary import conarycfg
    from conary.conaryclient.cmdline import parseTroveSpec

    setupLogging(consoleLevel=logging.DEBUG, consoleFormat='file')

    if len(args) == 2:
        troveSpec, kernelSpec, workDir = args[0], args[1], '.'
    elif len(args) == 3:
        troveSpec, kernelSpec, workDir = args
    else:
        sys.exit("Usage: %s <troveSpec> <kernelSpec> [<workDir>]" % sys.argv[0])

    cfg = conarycfg.ConaryConfiguration(False)
    cfg.configLine('includeConfigFile http://localhost/conaryrc')
    cli = ConaryClient(cfg)
    repos = cli.getRepos()

    troveTup = sorted(repos.findTrove(None, parseTroveSpec(troveSpec)))[-1]
    kernelTup = sorted(repos.findTrove(None, parseTroveSpec(kernelSpec)))[-1]

    generator = TemplateGenerator(troveTup, kernelTup, cfg, workDir)
    generator.getTemplate(start=True)
    while True:
        status, path = generator.getTemplate(start=False)
        if status == generator.Status.NOT_FOUND:
            print 'Failed!'
            break
        elif status == generator.Status.DONE:
            print 'Done:', path
            break
        time.sleep(1)

    generator.wait()
Esempio n. 2
0
def CloneTrove(cfg,
               targetBranch,
               troveSpecList,
               updateBuildInfo=True,
               info=False,
               cloneSources=False,
               message=None,
               test=False,
               fullRecurse=False,
               ignoreConflicts=False,
               exactFlavors=False):
    client = ConaryClient(cfg)
    repos = client.getRepos()

    targetBranch = versions.VersionFromString(targetBranch)
    if not isinstance(targetBranch, versions.Branch):
        raise errors.ParseError(
            'Cannot specify full version "%s" to clone to - must specify target branch'
            % targetBranch)

    troveSpecs = [cmdline.parseTroveSpec(x) for x in troveSpecList]

    componentSpecs = [
        x[0] for x in troveSpecs
        if ':' in x[0] and x[0].split(':')[1] != 'source'
    ]
    if componentSpecs:
        raise errors.ParseError('Cannot clone components: %s' %
                                ', '.join(componentSpecs))

    trovesToClone = repos.findTroves(cfg.installLabelPath,
                                     troveSpecs,
                                     cfg.flavor,
                                     exactFlavors=exactFlavors)
    trovesToClone = list(set(itertools.chain(*trovesToClone.itervalues())))

    if not client.cfg.quiet:
        callback = client_callbacks.CloneCallback(client.cfg, message)
    else:
        callback = callbacks.CloneCallback()

    okay, cs = client.createCloneChangeSet(targetBranch,
                                           trovesToClone,
                                           updateBuildInfo=updateBuildInfo,
                                           infoOnly=info,
                                           callback=callback,
                                           fullRecurse=fullRecurse,
                                           cloneSources=cloneSources)
    if not okay:
        return
    return _finishClone(client,
                        cfg,
                        cs,
                        callback,
                        info=info,
                        test=test,
                        ignoreConflicts=ignoreConflicts)
Esempio n. 3
0
    def __init__(self):
        # get configs from /etc/conary
        cfg = conarycfg.ConaryConfiguration( readConfigFiles = True)
        # get if the machine its x86 or x86_64
        cfg.initializeFlavors()
        self.cfg = cfg

        # Don't use threaded mode
        self.cfg.configLine('threaded False')

        cli = ConaryClient(cfg)

        # labels enable on /etc/conary/config.d/
        self.default_label = self.cfg.installLabelPath

        # get if x86 or x86_64
        self.flavors = self.cfg.flavor
        self.flavor = self.cfg.flavor[0]
        # for client
        self.cli = cli
        # for query on system (database)
        self.db = cli.db
        # for request query on repository (repos)
        self.repos = cli.repos

        self.job_cache = UpdateJobCache()
Esempio n. 4
0
def CloneTrove(cfg, targetBranch, troveSpecList, updateBuildInfo = True,
               info = False, cloneSources = False, message = None,
               test = False, fullRecurse = False, ignoreConflicts = False,
               exactFlavors = False):
    client = ConaryClient(cfg)
    repos = client.getRepos()

    targetBranch = versions.VersionFromString(targetBranch)
    if not isinstance(targetBranch, versions.Branch):
        raise errors.ParseError('Cannot specify full version "%s" to clone to - must specify target branch' % targetBranch)

    troveSpecs = [ cmdline.parseTroveSpec(x) for x in troveSpecList]

    componentSpecs = [ x[0] for x in troveSpecs
                       if ':' in x[0] and x[0].split(':')[1] != 'source']
    if componentSpecs:
        raise errors.ParseError('Cannot clone components: %s' % ', '.join(componentSpecs))


    trovesToClone = repos.findTroves(cfg.installLabelPath,
                                    troveSpecs, cfg.flavor,
                                    exactFlavors = exactFlavors)
    trovesToClone = list(set(itertools.chain(*trovesToClone.itervalues())))

    if not client.cfg.quiet:
        callback = client_callbacks.CloneCallback(client.cfg, message)
    else:
        callback = callbacks.CloneCallback()

    okay, cs = client.createCloneChangeSet(targetBranch, trovesToClone,
                                           updateBuildInfo=updateBuildInfo,
                                           infoOnly=info, callback=callback,
                                           fullRecurse=fullRecurse,
                                           cloneSources=cloneSources)
    if not okay:
        return
    return _finishClone(client, cfg, cs, callback, info=info,
                        test=test, ignoreConflicts=ignoreConflicts)
Esempio n. 5
0
    def _installContents(self, root, troves):
        cfg = copy.deepcopy(self._cfg)
        cfg.root = root
        cfg.autoResolve = False
        cfg.updateThreshold = 0

        cli = ConaryClient(cfg)
        try:
            self._log.debug("Preparing update job")
            job = cli.newUpdateJob()
            jobList = [(x[0], (None, None), (x[1], x[2]), True)
                    for x in troves]
            cli.prepareUpdateJob(job, jobList, resolveDeps=False)

            self._log.debug("Applying update job")
            cli.applyUpdateJob(job, noScripts = True)

        finally:
            job = None
            cli.close()
Esempio n. 6
0
    def __init__(self):
        """ Init the configurations """
        # get configs from /etc/conary
        cfg = conarycfg.ConaryConfiguration(readConfigFiles=True)
        # get if the machine its x86 or x86_64
        cfg.initializeFlavors()
        self.cfg = cfg

        cli = ConaryClient(cfg)

        # labels enable on /etc/conary/config.d/
        self.default_label = self.cfg.installLabelPath

        # get if x86 or x86_64
        self.flavor = self.cfg.flavor[0]
        # for client
        self.cli = cli
        # for query on system (database)
        self.db = cli.db
        # for request query on repository (repos)
        self.repos = cli.repos
Esempio n. 7
0
def main(argv):
    if not len(argv) > 1:
        usage()

    sys.excepthook = util.genExcepthook(prefix='commitaction-stack-')

    argDef = {
        'module': options.MULT_PARAM,
        'config-file': options.ONE_PARAM,
        'config': options.MULT_PARAM,
        'username': options.OPT_PARAM,
        'password': options.OPT_PARAM,
        'repmap': options.OPT_PARAM,
    }

    cfgMap = {
        'build-label': 'buildLabel',
    }

    cfg = conarycfg.ConaryConfiguration()
    cfg.root = ":memory:"
    cfg.dbPath = ":memory:"
    argSet, otherArgs = options.processArgs(argDef,
                                            cfgMap,
                                            cfg,
                                            usageMessage,
                                            argv=argv)

    # remove argv[0]
    otherArgs = otherArgs[1:]

    if 'module' not in argSet:
        usage()

    for line in argSet.pop('config', []):
        cfg.configLine(line)

    if 'repmap' in argSet:
        # this is ONLY for accessing the committing repository
        host, url = argSet['repmap'].split(" ")
        cfg.repositoryMap.update({host: url})

        if 'username' in argSet and 'password' in argSet:
            cfg.user.addServerGlob(host, argSet['username'],
                                   argSet['password'])

    repos = ConaryClient(cfg).getRepos()

    data = [x[:-1] for x in sys.stdin.readlines()]

    # { 'pkg:source': [(version, shortversion), ...] }
    srcMap = {}
    # { 'pkg' { version: { flavor: [ component, ...] } } }
    pkgMap = {}
    # { 'group-foo' { version: set(flavor, ...) } }
    grpMap = {}

    # [1,2,3,4,5,6,...] -> [(1,2,3), (4,5,6), ...]
    commitList = zip(data, data[1:], data[2:])[::3]

    for name, version, flavor in commitList:
        if name[-7:] == ':source':
            # get full trailing version
            trailingVersion = versions.VersionFromString(
                version).trailingRevision().asString()
            # sources are not flavored
            l = srcMap.setdefault(name, [])
            l.append((version, trailingVersion))
        elif ':' in name:
            package, component = name.split(':')
            d = pkgMap.setdefault(package, {})
            d = d.setdefault(version, {})
            l = d.setdefault(flavor, [])
            l.append(component)
        elif name.startswith('group-'):
            d = grpMap.setdefault(name, {})
            s = d.setdefault(version, set())
            s.add(flavor)

    ret = 0
    for module in argSet['module']:
        argv = shlex.split(module)
        path = argv[0]
        dirname, name = os.path.split(path)
        if name.endswith('.py'):
            name = name[:-3]
        if dirname:
            searchPath = [dirname]
            try:
                f, pathName, description = imp.find_module(name, searchPath)
            except:
                break
            try:
                mod = imp.load_module(name, f, pathName, description)
            finally:
                f.close()
        else:
            try:
                mod = __import__(name)
                names = name.split('.')[1:]
                for subname in names:
                    mod = getattr(mod, subname)
            except:
                break

        # pass repos, cfg, and all otherArgs to all modules
        if 'process' in mod.__dict__:
            ret |= mod.process(repos, cfg, commitList, srcMap, pkgMap, grpMap,
                               argv[1:], otherArgs)

    return ret
Esempio n. 8
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)
Esempio n. 9
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)