Ejemplo n.º 1
0
    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, '')
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
    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, '')
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
 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
Ejemplo n.º 12
0
 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
Ejemplo n.º 13
0
 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' ])
Ejemplo n.º 14
0
 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)
Ejemplo n.º 15
0
 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)
Ejemplo n.º 16
0
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)
Ejemplo n.º 17
0
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)