def testRdiff8(self): # CNY-1753 # Different files living on different branches raise testhelp.SkipTestException( "Unable to reproduce CNY-1753 in a test case") # Manifested in running conary rdiff # mkinitrd=conary.rpath.com@rpl:1--usplash.rb.rpath.com@rpl:1 rf1 = rephelp.RegularFile( contents='\000\001\002\003', perms=0644, mtime=1176921017, ) rf2 = rephelp.RegularFile( contents='\000\001\003\005', perms=0644, mtime=1176921317, ) v1 = versions.ThawVersion('/localhost@rpl:1/1:1-1-1') v2 = versions.ThawVersion('/localhost1@rpl:2/2:2-2-2') self.openRepository() self.openRepository(1) self.addComponent('foo:run', v1, [('/bin/foo', rf1)]) self.addCollection('foo', v1, [':run']) self.addComponent('foo:run', v2, [('/bin/foo', rf2)]) self.addCollection('foo', v2, [':run']) troveSpec = cmdline.parseChangeList('foo=%s--%s' % (v1, v2))[0] ret, outs = self.captureOutput(queryrep.diffTroves, self.cfg, troveSpec) self.assertEqual(outs, '')
def rdiffCommand(cfg, client, db, diffSpec, **kw): troveSpec = cmdline.parseChangeList(diffSpec)[0] if troveSpec[1][0] is None: # Most likely, syntax did not specify <old>--<new> return -1 kw.setdefault('recurse', None) kw.setdefault('asDiff', False) if kw['recurse'] is None: kw['recurse'] = (trove.troveIsCollection(troveSpec[0][0]) and not trove.troveIsGroup(troveSpec[0][0])) primaryCsList = cscmd.computeTroveList(client, [troveSpec]) if (primaryCsList[0][1] == primaryCsList[0][2]): # Diffing against ourselves print "Identical troves" return 1 cs = client.createChangeSet(primaryCsList, withFiles=True, withFileContents=kw['asDiff'], recurse=kw['recurse']) showchangeset.displayChangeSet(db, cs, None, cfg, **kw)
def testRdiff8(self): # CNY-1753 # Different files living on different branches raise testhelp.SkipTestException("Unable to reproduce CNY-1753 in a test case") # Manifested in running conary rdiff # mkinitrd=conary.rpath.com@rpl:1--usplash.rb.rpath.com@rpl:1 rf1 = rephelp.RegularFile(contents='\000\001\002\003', perms = 0644, mtime = 1176921017,) rf2 = rephelp.RegularFile(contents='\000\001\003\005', perms = 0644, mtime = 1176921317,) v1 = versions.ThawVersion('/localhost@rpl:1/1:1-1-1') v2 = versions.ThawVersion('/localhost1@rpl:2/2:2-2-2') self.openRepository() self.openRepository(1) self.addComponent('foo:run', v1, [('/bin/foo', rf1)]) self.addCollection('foo', v1, [':run']) self.addComponent('foo:run', v2, [('/bin/foo', rf2)]) self.addCollection('foo', v2, [':run']) troveSpec = cmdline.parseChangeList('foo=%s--%s' % (v1, v2))[0] ret, outs = self.captureOutput(queryrep.diffTroves, self.cfg, troveSpec) self.assertEqual(outs, '')
def _classic_get_package_update(self, pkg_list, callback, dry_run=False): self.cli.setUpdateCallback(callback) applyList = cmdline.parseChangeList(pkg_list, keepExisting=False, updateByDefault=True, allowChangeSets=False) ret = self._classic_build_update_job(applyList) if not dry_run: self.cli.applyUpdateJob(ret[0]) return ret
def ChangeSetCommand(cfg, troveSpecs, outFileName, recurse = True, callback = None): client = conaryclient.ConaryClient(cfg) applyList = cmdline.parseChangeList(troveSpecs, allowChangeSets=False) primaryCsList = computeTroveList(client, applyList) client.createChangeSetFile(outFileName, primaryCsList, recurse = recurse, callback = callback, excludeList = cfg.excludeTroves)
def doUpdate(cfg, changeSpecs, **kwargs): callback = kwargs.get('callback', None) if not callback: callback = callbacks.UpdateCallback(trustThreshold=cfg.trustThreshold) kwargs['callback'] = callback else: callback.setTrustThreshold(cfg.trustThreshold) syncChildren = kwargs.get('syncChildren', False) syncUpdate = kwargs.pop('syncUpdate', False) restartInfo = kwargs.get('restartInfo', None) if syncChildren or syncUpdate: installMissing = True else: installMissing = False kwargs['installMissing'] = installMissing fromChangesets = [] for path in kwargs.pop('fromFiles', []): cs = changeset.ChangeSetFromFile(path) fromChangesets.append(cs) kwargs['fromChangesets'] = fromChangesets # Look for items which look like files in the applyList and convert # them into fromChangesets w/ the primary sets for item in changeSpecs[:]: if os.access(item, os.R_OK): try: cs = changeset.ChangeSetFromFile(item) except: continue fromChangesets.append(cs) changeSpecs.remove(item) for troveTuple in cs.getPrimaryTroveList(): changeSpecs.append(trovetup.TroveTuple(*troveTuple).asString()) if kwargs.get('restartInfo', None): # We don't care about applyList, we will set it later applyList = None else: keepExisting = kwargs.get('keepExisting') updateByDefault = kwargs.get('updateByDefault', True) applyList = cmdline.parseChangeList(changeSpecs, keepExisting, updateByDefault, allowChangeSets=True) _updateTroves(cfg, applyList, **kwargs) # Clean up after ourselves if restartInfo: util.rmtree(restartInfo, ignore_errors=True)
def getJobsToDisplay(jobSource, jobSpecs): if jobSpecs: jobSpecs = cmdline.parseChangeList(jobSpecs, allowChangeSets=False) else: jobSpecs = [] if jobSpecs: results = jobSource.findJobs(jobSpecs) jobs = list(itertools.chain(*results.itervalues())) else: jobs = list(jobSource.iterAllJobs()) return jobs
def ChangeSetCommand(cfg, troveSpecs, outFileName, recurse=True, callback=None): client = conaryclient.ConaryClient(cfg) applyList = cmdline.parseChangeList(troveSpecs, allowChangeSets=False) primaryCsList = computeTroveList(client, applyList) client.createChangeSetFile(outFileName, primaryCsList, recurse=recurse, callback=callback, excludeList=cfg.excludeTroves)
def update(self, name, installLabel= None, remove = False ): cli = self.cli #get a trove troves = self.request_query(name, installLabel) for trove in troves: trovespec = self.trove_to_spec( trove, remove ) try: # create a Job job = cli.newUpdateJob() # Add Update task to Job cli.prepareUpdateJob(job, cmdline.parseChangeList(trovespec)) # Apply the Job cli.applyUpdateJob(job) # im rulz return "Update Success of %s" % trovespec except NoNewTrovesError: return "no new Troves Found by %s " % trovespec
def update(self, name, installLabel=None, remove=False): cli = self.cli #get a trove troves = self.request_query(name, installLabel) for trove in troves: trovespec = self.trove_to_spec(trove, remove) try: # create a Job job = cli.newUpdateJob() # Add Update task to Job cli.prepareUpdateJob(job, cmdline.parseChangeList(trovespec)) # Apply the Job cli.applyUpdateJob(job) # im rulz return "Update Success of %s" % trovespec except NoNewTrovesError: return "no new Troves Found by %s " % trovespec
def testInfoSplitting(self): # info packages must be in their own job, not combined with # random other packages, because we expect their tag scripts # to have been run before other troves are installed. self.addComponent('info-foo:user', '1.0', filePrimer=1) self.addComponent('foo:runtime', '1.0', filePrimer=2) self.addComponent('info-foo:group', '1.0', filePrimer=3) self.addComponent('info-zoo:group', '1.0', filePrimer=4) client = conaryclient.ConaryClient(self.cfg) items = cmdline.parseChangeList(['info-foo:user', 'foo:runtime', 'info-foo:group', 'info-zoo:group']) uJob = client.updateChangeSet(items, split=True)[0] # grab the name of each job while keeping the job groups the same jobs = [[y[0] for y in x] for x in uJob.getJobs() ] assert(set(jobs[0]) == set([ 'info-foo:user', 'info-foo:group' ])) assert(jobs[1] == [ 'info-zoo:group' ]) assert(jobs[2] == [ 'foo:runtime' ])
def _parseMeta(cls, lines): ret = {} for line in lines: arr = line.split(': ', 1) if len(arr) != 2: continue if arr[0] not in cls._KEYS: continue ret[arr[0]] = arr[1] if cls._KEYS.difference(ret.keys()): # Missing key return None job = cmdline.parseChangeList([ret[cls._KEY_JOB]])[0] oldCompatClass = cls._toInt(ret[cls._KEY_OLD_COMPAT_CLASS]) newCompatClass = cls._toInt(ret[cls._KEY_NEW_COMPAT_CLASS]) try: idx = int(ret[cls._KEY_INDEX]) except ValueError: return None return idx, (job, oldCompatClass, newCompatClass)
def rdiffCommand(cfg, client, db, diffSpec, **kw): troveSpec = cmdline.parseChangeList(diffSpec)[0] if troveSpec[1][0] is None: # Most likely, syntax did not specify <old>--<new> return -1 kw.setdefault('recurse', None) kw.setdefault('asDiff', False) if kw['recurse'] is None: kw['recurse'] = (trove.troveIsCollection(troveSpec[0][0]) and not trove.troveIsGroup(troveSpec[0][0])) primaryCsList = cscmd.computeTroveList(client, [ troveSpec ]) if (primaryCsList[0][1] == primaryCsList[0][2]): # Diffing against ourselves print "Identical troves" return 1 cs = client.createChangeSet(primaryCsList, withFiles=True, withFileContents=kw['asDiff'], recurse=kw['recurse']) showchangeset.displayChangeSet(db, cs, None, cfg, **kw)
def doModelUpdate(cfg, sysmodel, modelFile, otherArgs, **kwargs): kwargs['systemModel'] = sysmodel kwargs['systemModelFile'] = modelFile kwargs['loadTroveCache'] = True kwargs.setdefault('updateByDefault', True) # erase is not default case kwargs.setdefault('model', False) kwargs.setdefault('keepExisting', True) # prefer "install" to "update" restartInfo = kwargs.get('restartInfo', None) patchArgs = kwargs.pop('patchSpec', None) fromChangesets = [] applyList = [] callback = kwargs.get('callback', None) if not callback: callback = callbacks.UpdateCallback(trustThreshold=cfg.trustThreshold) kwargs['callback'] = callback else: callback.setTrustThreshold(cfg.trustThreshold) if restartInfo is None: addArgs = [x[1:] for x in otherArgs if x.startswith('+')] rmArgs = [x[1:] for x in otherArgs if x.startswith('-')] defArgs = [x for x in otherArgs if not (x.startswith('+') or x.startswith('-'))] # find any default arguments that represent changesets to # install/update for defArg in list(defArgs): if kwargs['updateByDefault'] and os.path.isfile(defArg): try: cs = changeset.ChangeSetFromFile(defArg) fromChangesets.append((cs, defArg)) defArgs.remove(defArg) except filecontainer.BadContainer: # not a changeset, must be a trove name pass if kwargs['updateByDefault']: addArgs += defArgs else: rmArgs += defArgs if rmArgs: sysmodel.appendOpByName('erase', text=rmArgs) updateName = { False: 'update', True: 'install' }[kwargs['keepExisting']] branchArgs = {} for index, spec in enumerate(addArgs): try: troveSpec = trovetup.TroveSpec(spec) version = versions.Label(troveSpec.version) branchArgs[troveSpec] = index except: # Any exception is a parse failure in one of the # two steps, and so we do not convert that argument pass if branchArgs: client = conaryclient.ConaryClient(cfg) repos = client.getRepos() foundTroves = repos.findTroves(cfg.installLabelPath, branchArgs.keys(), defaultFlavor = cfg.flavor) for troveSpec in foundTroves: index = branchArgs[troveSpec] foundTrove = foundTroves[troveSpec][0] addArgs[index] = addArgs[index].replace( troveSpec.version, '%s/%s' %(foundTrove[1].trailingLabel(), foundTrove[1].trailingRevision())) disallowedChangesets = [] for cs, argName in fromChangesets: for troveTuple in cs.getPrimaryTroveList(): # group and redirect changesets will break the model the # next time it is run, so prevent them from getting in # the model in the first place if troveTuple[1].isOnLocalHost(): if troveTuple[0].startswith('group-'): disallowedChangesets.append((argName, 'group', trovetup.TroveTuple(*troveTuple).asString())) continue trvCs = cs.getNewTroveVersion(*troveTuple) if trvCs.getType() == trove.TROVE_TYPE_REDIRECT: disallowedChangesets.append((argName, 'redirect', trovetup.TroveTuple(*troveTuple).asString())) continue addArgs.append( trovetup.TroveTuple(*troveTuple).asString()) if disallowedChangesets: raise errors.ConaryError( 'group and redirect changesets on a local label' ' cannot be installed:\n ' + '\n '.join( '%s contains local %s: %s' % x for x in disallowedChangesets)) if addArgs: sysmodel.appendOpByName(updateName, text=addArgs) if patchArgs: sysmodel.appendOpByName('patch', text=patchArgs) kwargs['fromChangesets'] = [x[0] for x in fromChangesets] if kwargs.pop('model'): sysmodel.write(sys.stdout) sys.stdout.flush() return None keepExisting = kwargs.get('keepExisting') updateByDefault = kwargs.get('updateByDefault', True) applyList = cmdline.parseChangeList([], keepExisting, updateByDefault, allowChangeSets=True) else: # In the restart case, applyList == [] which says "sync to model" pass _updateTroves(cfg, applyList, **kwargs) # Clean up after ourselves if restartInfo: util.rmtree(restartInfo, ignore_errors=True)