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()
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)
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()
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)
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()
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
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
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)