Beispiel #1
0
def _convertLabelOrBranch(lblStr, template):
    try:
        if not lblStr:
            return None
        if lblStr[0] == '/':
            v = versions.VersionFromString(lblStr)
            if isinstance(v, versions.Branch):
                return v
            # Some day we could lift this restriction if its useful.
            raise errors.ParseError('Cannot specify version to promote'
                                    ' - must specify branch or label')
        if not template:
            return versions.Label(lblStr)

        hostName = template.getHost()
        nameSpace = template.getNamespace()
        tag = template.branch

        if lblStr[0] == ':':
            lblStr = '%s@%s%s' % (hostName, nameSpace, lblStr)
        elif lblStr[0] == '@':
            lblStr = '%s%s' % (hostName, lblStr)
        elif lblStr[-1] == '@':
            lblStr = '%s%s:%s' % (lblStr, nameSpace, tag)
        return versions.Label(lblStr)
    except Exception, msg:
        raise errors.ParseError('Error parsing %r: %s' % (lblStr, msg))
Beispiel #2
0
    def testFindTrovesPrefersBuiltTroves(self):
        self.openRmakeRepository()
        depStr = 'soname: ELF32/foo.so.1(SysV)'
        builtFooRun = self.addComponent('foo:runtime',
                    '/localhost@rpl:linux//branch//rmakehost@rpl:branch/1.0',
                    'is:x86')
        fooRun = self.addComponent('foo:runtime', '1.0', 'is:x86')
        trv = self.addComponent('bam:source')
        bt = self.newBuildTrove(1, *trv.getNameVersionFlavor())
        bt.setBuildRequirements(['foo:runtime'])
        self.buildCfg.installLabelPath = [
                                    versions.Label('localhost@rpl:branch'),
                                    versions.Label('localhost@rpl:linux') ]

        builtTroves = [builtFooRun.getNameVersionFlavor()]
        resolveTroves = [ fooRun.getNameVersionFlavor()]
        resolveJob = dephandler.ResolveJob(bt, self.buildCfg, builtTroves)
        self.logFilter.add()
        res = resolver.DependencyResolver(log, self.openRepository())
        self.buildCfg.resolveTroveTups = [resolveTroves]
        self.buildCfg.resolveTrovesOnly = False

        result = res.resolve(resolveJob)
        assert(result.success)
        buildReq, = result.getBuildReqs()
        assert(str(buildReq[2][0].trailingLabel())  == 'rmakehost@rpl:branch')
Beispiel #3
0
    def testChangedRecipeCook(self):
        repos = self.openRepository()
        self.openRmakeRepository()
        trv = self.addComponent(
            'test1:source=/localhost@rpl:linux//rmakehost@LOCAL:linux/1.2-0.1',
            [('test1.recipe', test1Recipe)])

        cookFlavor = deps.parseFlavor('readline,ssl,X')

        troveTup = trv.getNameVersionFlavor()
        troveTup = (troveTup[0], troveTup[1], cookFlavor)
        targetLabel = versions.Label('rmakehost@LOCAL:linux')
        newTargetLabel = versions.Label('rmakehost@LOCAL:linux')
        # adding an unknown flavor shouldn't matter with latest conary.
        self.cfg.buildFlavor = deps.overrideFlavor(self.cfg.buildFlavor,
                                                   deps.parseFlavor('foobar'))
        logger_ = logger.Logger()

        logPath, pid, buildInfo = self.discardOutput(cook.cookTrove,
                                                     self.cfg,
                                                     repos,
                                                     logger_,
                                                     targetLabel=targetLabel,
                                                     *troveTup)
        result = self._wait(buildInfo)
        assert (result.isBuildSuccess())
Beispiel #4
0
    def testCook(self):
        repos = self.openRepository()
        self.makeSourceTrove('test1', test1Recipe)

        cookFlavor = deps.parseFlavor('readline,ssl,X')

        troveTup = repos.findTrove(self.cfg.buildLabel,
                                   ('test1:source', None, None), None)[0]
        troveTup = (troveTup[0], troveTup[1], cookFlavor)
        targetLabel = versions.Label('localhost@LOCAL:linux')
        newTargetLabel = versions.Label('localhost@LOCAL:linux')
        # adding an unknown flavor shouldn't matter with latest conary.
        self.cfg.buildFlavor = deps.overrideFlavor(self.cfg.buildFlavor,
                                                   deps.parseFlavor('foobar'))
        logger_ = logger.Logger()

        logPath, pid, buildInfo = self.discardOutput(cook.cookTrove,
                                                     self.cfg,
                                                     repos,
                                                     logger_,
                                                     targetLabel=targetLabel,
                                                     *troveTup)
        result = self._wait(buildInfo)
        assert (result.isBuildSuccess())
        repos.commitChangeSetFile(result.getChangeSetFile())

        troveTup = repos.findTrove(
            newTargetLabel, ('test1', None, deps.parseFlavor('readline,ssl')),
            None)[0]
        assert (troveTup[1].branch().label() == newTargetLabel)
        assert (str(troveTup[2]) == 'readline,ssl')
        self.updatePkg('test1=%s[readline,ssl]' % newTargetLabel,
                       raiseError=True)
        self.verifyFile(self.rootDir + '/foo/bar',
                        str(self.cfg.buildLabel) + '\n')
Beispiel #5
0
    def testLoadedTroves(self):
        # we don't check the output of this test.
        self.logFilter.add()
        repos = self.openRepository()

        header = '''
    if Use.%s:
        foo = '1.0-readline'
    else:
        foo = '1.0-noreadline'
'''
        self.addTestPkg(1, version='1.0', header=header % 'readline')
        self.addTestPkg(2, header='loadRecipe("test1")' + header % 'ssl')
        test3Recipe = self.addTestPkg(3,
                                      header='loadRecipe("test2")' +
                                      header % 'bootstrap')

        use.track()
        rldep = deps.parseFlavor('readline')
        ssldep = deps.parseFlavor('ssl')
        nobsdep = deps.parseFlavor('~!bootstrap')
        v1 = versions.VersionFromString('/localhost@rpl:linux/1.0-1')

        loader = self._testSubload(repos, "loadInstalled('test3')")
        FooLoaded = loader.getLoadedSpecs()
        assert (FooLoaded['test3'][0] == ('test3:source', v1, nobsdep))

        Test3Loaded = FooLoaded['test3'][1]
        assert (Test3Loaded['test2'][0] == ('test2:source', v1, ssldep))

        Test2Loaded = Test3Loaded['test2'][1]
        assert (Test2Loaded['test1'][0] == ('test1:source', v1, rldep))

        Test1Loaded = Test2Loaded['test1'][1]
        assert (Test1Loaded == {})

        loadedTroves = loader.getLoadedTroves()
        assert (len(loadedTroves) == 3)
        assert (loadedTroves[0] == ('test1:source', v1, rldep))
        assert (loadedTroves[1] == ('test2:source', v1, ssldep))
        assert (loadedTroves[2] == ('test3:source', v1, nobsdep))

        # Now reset and load again w/ overrides specified
        branch = versions.VersionFromString('/localhost@rpl:foo/')
        oldLoadedSpecs = loader.getLoadedSpecs()
        # move ILP and buildLabel over to another branch, and use overrides
        # to load exactly what we want anyway.
        cfg = copy.copy(self.cfg)
        cfg.installLabelPath = [versions.Label('localhost@rpl:foo')]
        cfg.buildLabel = versions.Label('localhost@rpl:foo')
        self.overrideBuildFlavor('!readline, !ssl')
        overrides = oldLoadedSpecs
        loader = self._testSubload(repos,
                                   "loadInstalled('test3')",
                                   cfg=cfg,
                                   overrides=overrides)
        assert (loadedTroves[0] == ('test1:source', v1, rldep))
        assert (loadedTroves[1] == ('test2:source', v1, ssldep))
        assert (loadedTroves[2] == ('test3:source', v1, nobsdep))
Beispiel #6
0
    def testIncludeConfigFileNoLoop(self):
        # CNY-914: including the same file in two contexts
        fd, configfile = tempfile.mkstemp()
        fd1, configfile1 = tempfile.mkstemp()
        fd2, configfile2 = tempfile.mkstemp()
        fd3, configfile3 = tempfile.mkstemp()

        f = os.fdopen(fd, "w+")
        f1 = os.fdopen(fd1, "w+")
        f2 = os.fdopen(fd2, "w+")
        f3 = os.fdopen(fd3, "w+")

        f.write("includeConfigFile %s\n" % configfile1)
        f.write("includeConfigFile %s\n" % configfile2)

        f1.write("[sect1]\n")
        f1.write("buildLabel c.example.com@foo:1\n")
        f1.write("includeConfigFile %s\n" % configfile3)

        f2.write("[sect2]\n")
        f2.write("buildLabel c.example.com@foo:2\n")
        f2.write("includeConfigFile %s\n" % configfile3)

        f3.write("lookaside /tmp/foobar\n")

        for fobj in (f, f1, f2, f3):
            fobj.close()

        cfg = conarycfg.ConaryConfiguration(readConfigFiles=False)
        cfg.read(configfile)

        expected = {
            'sect1': {
                'buildLabel': versions.Label('c.example.com@foo:1'),
                'lookaside': '/tmp/foobar',
            },
            'sect2': {
                'buildLabel': versions.Label('c.example.com@foo:2'),
                'lookaside': '/tmp/foobar',
            }
        }
        for sectName in cfg.iterSectionNames():
            self.assertTrue(sectName in expected)
            sect = cfg.getSection(sectName)
            expSect = expected[sectName]
            for k in ['buildLabel', 'lookaside']:
                self.assertEqual(sect[k], expSect[k])
            del expected[sectName]

        # More sections?
        self.assertFalse(expected)

        for cf in [configfile, configfile1, configfile2, configfile3]:
            os.unlink(cf)
Beispiel #7
0
 def _convertLabelPath(self, name, labelPath, versionStr):
     """
         Given a label path and a versionString that modifies it,
         return the modified labelPath.
     """
     newLabelPath = []
     if '/' in versionStr:
         labelPart, remainder = versionStr.split('/', 1)
     else:
         labelPart, remainder = versionStr, ''
     firstChar = labelPart[0]
     repoInfo = [(x.getHost(), x.getNamespace(), x.getLabel())
                 for x in labelPath]
     if firstChar == ':':
         for serverName, namespace, tag in repoInfo:
             newLabelPath.append(
                 versions.Label("%s@%s%s" %
                                (serverName, namespace, labelPart)))
     elif firstChar == '@':
         for serverName, namespace, tag in repoInfo:
             newLabelPath.append(
                 versions.Label("%s%s" % (serverName, labelPart)))
     elif labelPart[-1] == '@':
         for serverName, namespace, tag in repoInfo:
             newLabelPath.append(
                 versions.Label("%s%s:%s" % (labelPart, namespace, tag)))
     elif '@' in labelPart:
         try:
             label = versions.Label(labelPart)
             newLabelPath = [label]
         except errors.ParseError:
             raise errors.TroveNotFound, \
                                 "invalid version %s" % versionStr
     else:
         # no labelPath parts in versionStr, use the old one.
         newLabelPath = labelPath
         remainder = versionStr
         if not newLabelPath and not self.queryOptions.allowNoLabel and not self.queryOptions.allowMissing:
             raise errors.LabelPathNeeded(
                 "No search label path given and no label specified for trove %s=%s - set the installLabelPath"
                 % (name, versionStr))
     if not newLabelPath and not self.queryOptions.allowNoLabel and not self.queryOptions.allowMissing:
         raise errors.LabelPathNeeded(
             "No search label path given and partial label specified for trove %s=%s - set the installLabelPath"
             % (name, versionStr))
     if isinstance(labelPath, set):
         newLabelPath = set(newLabelPath)
     if '-' in remainder:
         # attempt to parse the versionStr
         try:
             versions.Revision(remainder)
         except errors.ParseError, err:
             raise errors.TroveNotFound(str(err))
Beispiel #8
0
    def testGetTrovesLeavesMultiRepos(self):
        v1 = self.addComponent('foo:foo', '1.0').getVersion()
        v2 = self.addComponent('foo:foo', ':branch/1.0').getVersion()
        installLabelPath = conarycfg.CfgLabelList(
            [versions.Label('localhost@rpl:branch'), self.cfg.buildLabel])

        repos = self.openRepository()
        tups = queryrep.getTrovesToDisplay(repos, [], [], [],
                                           VERSION_FILTER_LEAVES,
                                           FLAVOR_FILTER_ALL,
                                           installLabelPath,
                                           self.cfg.flavor,
                                           affinityDb=None)
        assert (set([x[1] for x in tups]) == set((v1, v2)))
        tups = queryrep.getTrovesToDisplay(repos, ['foo:foo'], [], [],
                                           VERSION_FILTER_LEAVES,
                                           FLAVOR_FILTER_ALL,
                                           installLabelPath,
                                           self.cfg.flavor,
                                           affinityDb=None)
        assert (set([x[1] for x in tups]) == set((v1, v2)))
        tups = queryrep.getTrovesToDisplay(repos, ['foo:foo'], [], [],
                                           VERSION_FILTER_LATEST,
                                           FLAVOR_FILTER_ALL,
                                           installLabelPath,
                                           self.cfg.flavor,
                                           affinityDb=None)
        assert (set([x[1] for x in tups]) == set((v1, v2)))
        tups = queryrep.getTrovesToDisplay(repos, [], [], [],
                                           VERSION_FILTER_LATEST,
                                           FLAVOR_FILTER_ALL,
                                           installLabelPath,
                                           self.cfg.flavor,
                                           affinityDb=None)
        assert (set([x[1] for x in tups]) == set((v1, v2)))
Beispiel #9
0
    def testShadowed(self):
        self.repos = self.openRepository()
        self.addTestPkg(1, 
                        content='''r.Create("/etc/foo", 
                                            contents="old contents\\n")''')
        self.mkbranch(self.cfg.buildLabel, "@rpl:branch", "test1:source",
                      shadow=True)
        self.cfg.buildLabel = versions.Label('localhost@rpl:branch')
        self.cfg.installLabelPath = \
                    conarycfg.CfgLabelList([self.cfg.buildLabel])
        # modify the trove on the shadow
        self.addTestPkg(1, content='''r.Create("/etc/foo", 
                                            contents="new contents\\n")''')
        self.cookTestPkg(1)
        self.updatePkg(self.rootDir, 'test1', depCheck=False)
        self.writeFile(self.rootDir + "/etc/foo", 'newer contents\\n')

        (fd, path) = tempfile.mkstemp()
        os.close(fd)
        self.localChangeset(self.rootDir, 'test1', path)
        commit.doCommit(self.cfg, path,
                        'localhost@commit:branch')
        assert(self.repos.hasTrove('test1', versions.VersionFromString(
                '/localhost@rpl:linux//branch//commit:branch/1.0-1.1-1.0.1'),
                deps.Flavor()))

        # commit it again to make sure the version gets incremented
        commit.doCommit(self.cfg, path,
                        'localhost@commit:branch')
        assert(self.repos.hasTrove('test1', versions.VersionFromString(
                '/localhost@rpl:linux//branch//commit:branch/1.0-1.1-1.0.2'),
                deps.Flavor()))

        os.remove(path)
Beispiel #10
0
    def testNetworkSearchSource(self):
        repos = self.openRepository()
        trv1 = self.addComponent('foo:runtime', '1', 'ssl')
        trv2 = self.addComponent('foo:runtime', '2', '!ssl')

        s = searchsource.NetworkSearchSource(repos, self.cfg.installLabelPath,
                                             parseFlavor('ssl'))
        tup = s.findTrove(('foo:runtime', None, None))[0]
        assert(tup == trv1.getNameVersionFlavor())
        tup = s.findTrove(('foo:runtime', None, parseFlavor('!ssl')))[0]
        assert(tup == trv2.getNameVersionFlavor())
        trv = s.getTrove(*tup)
        assert(trv == trv2)
        cs = s.createChangeSet([(tup[0], (None, None), (tup[1], tup[2]), True)])
        trvCs = cs.getNewTroveVersion(*trv.getNameVersionFlavor())
        trv = trove.Trove(trvCs)
        assert(trv == trv2)
        assert(list(s.iterFilesInTrove(*trv.getNameVersionFlavor()))
               == list(repos.iterFilesInTrove(*trv.getNameVersionFlavor())))

        # test dep resolution - the resolve source for this should check
        # the right branch.
        self.cfg.installLabelPath = [versions.Label('localhost@rpl:branch')]
        self.addComponent('bar:runtime', ':branch/1', filePrimer=1, 
                          requires='trove:foo:runtime')
        self.checkUpdate('bar:runtime', ['bar:runtime', 'foo:runtime=1'],
                          resolveSource=s.getResolveMethod(), resolve=True)
Beispiel #11
0
    def testFakeChroot(self):
        groupRecipe = """
class SimpleGroup(GroupRecipe):
    name = 'group-foo'
    version = '1'
    clearBuildReqs()
    def setup(r):
        r.add('foo:lib')
"""
        trv = self.addComponent('group-foo:source=1',
                                 [('group-foo.recipe', groupRecipe)])
        self.addComponent('foo:lib')
        mgr = rootmanager.ChrootManager(self.rmakeCfg)
        trv = self.newBuildTrove(1, *trv.getNameVersionFlavor())
        factory = mgr.getRootFactory(self.buildCfg, [], [], [], trv)
        factory.create()
        logFile = logfile.LogFile(self.workDir + '/rmake.out')
        logFile.redirectOutput()
        chroot = factory.start()
        try:
            chroot.buildTrove(self.buildCfg, versions.Label('localhost@rpl:branch'),
                              *trv.getNameVersionFlavor())
            results = chroot.checkResults(wait=30, *trv.getNameVersionFlavor())
            assert(results.isBuildSuccess())
        finally:
            chroot.stop()
        factory.clean()
        assert(factory.root != '/tmp/rmake')
        assert(not os.path.exists('/tmp/rmake/builds/group-foo'))
Beispiel #12
0
    def testCookTwoGroups(self):
        self.addComponent('test:run', '1', '!ssl,~test.foo')
        self.addComponent('test:run', '1', 'ssl,~test.foo')
        trv = self.addComponent('group-foo:source', '1', '',
                                [('group-foo.recipe', groupRecipeWithFlags)])
        flavorList = [deps.parseFlavor('!ssl'), deps.parseFlavor('ssl')]

        repos = self.openRepository()
        logger_ = logger.Logger()
        targetLabel = versions.Label('localhost@rpl:TARGET')
        self.cfg.shortenGroupFlavors = True

        logPath, pid, buildInfo = self.discardOutput(cook.cookTrove,
                                                     self.cfg,
                                                     repos,
                                                     logger_,
                                                     trv.getName(),
                                                     trv.getVersion(),
                                                     flavorList,
                                                     targetLabel=targetLabel)
        result = self._wait(buildInfo)
        assert (result.isBuildSuccess())
        cs = changeset.ChangeSetFromFile(result.getChangeSetFile())
        newTroves = [
            x.getNewNameVersionFlavor() for x in cs.iterNewTroveList()
        ]
        assert (len(set([x[1] for x in newTroves])))
        flavorList = set([x[2] for x in newTroves])
        self.assertEquals(sorted(str(x) for x in flavorList),
                          ['readline,!ssl', 'ssl'])
Beispiel #13
0
    def testDefaultBuildReqs(self):
        # add a defautl build req on foo:run and make sure that it shows
        # up in the build requirements for the finishehd trove.
        repos = self.openRepository()
        self.cfg.defaultBuildReqs = ['foo:run']
        foo = self.addComponent('foo:run', '1')
        self.updatePkg('foo:run')

        test1 = self.addComponent('test1:source', '1',
                                  [('test1.recipe', test1Recipe)])
        troveTup = test1.getNameVersionFlavor()
        targetLabel = versions.Label('localhost@LOCAL:linux')
        logger_ = logger.Logger()
        logPath, pid, buildInfo = self.discardOutput(
            cook.cookTrove,
            self.cfg,
            repos,
            logger_,
            targetLabel=self.cfg.buildLabel,
            *troveTup)
        result = self._wait(buildInfo)
        assert (result.isBuildSuccess())
        repos = self.openRepository()
        repos.commitChangeSetFile(result.getChangeSetFile())
        troveTup = repos.findTrove(self.cfg.buildLabel, ('test1', None, None),
                                   None)[0]
        test1 = repos.getTrove(*troveTup)
        assert (test1.getBuildRequirements() == [foo.getNameVersionFlavor()])
Beispiel #14
0
    def testDuplicateFileIds(self):
        # make sure that streams get filled in on branches when they were
        # originally None
        os.chdir(self.workDir)
        self.newpkg('branchedFileId')
        os.chdir('branchedFileId')
        self.writeFile('branchedFileId.recipe', recipes.branchedFileIdTest1)
        self.addfile('branchedFileId.recipe')
        self.commit()
        os.chdir("..")
        shutil.rmtree('branchedFileId')

        repos0 = self.openRepository(0)
        repos1 = self.openRepository(1)

        self.cookItem(repos0, self.cfg, 'branchedFileId')

        self.mkbranch("1.0-1-1", "localhost1@rpl:shadow", 
                      "branchedFileId", shadow = True)

        self.checkout("branchedFileId", "localhost1@rpl:shadow")
        os.chdir('branchedFileId')
        self.writeFile('branchedFileId.recipe', recipes.branchedFileIdTest2)
        self.commit()

        self.cfg.buildLabel = versions.Label("localhost1@rpl:shadow")
        self.cookItem(repos1, self.cfg, 'branchedFileId')

        self.updatePkg(self.cfg.root,
                       'branchedFileId', 'localhost1@rpl:shadow')
Beispiel #15
0
 def testUseOwnDb(self):
     # We can pass our own database to loadInstalled to cause its behavior
     # to differ from the original expected behavior a bit.
     # rMake uses this to fiddle w/ the troves that match a hostname/label
     # request.
     repos = self.openRepository()
     cfg = copy.copy(self.cfg)
     branch = versions.VersionFromString('/localhost@rpl:devel//shadow/')
     db = trovesource.SimpleTroveSource()
     self.addTestPkg(1, version='1.0')
     test2Recipe = recipes.createRecipe(2,
                                        version='1.0',
                                        header='loadInstalled("test1")')
     cfg.buildLabel = versions.Label('localhost@rpl:branch')
     cfg.installLabelPath = [cfg.buildLabel]
     self.addComponent('test2:source', '/localhost@rpl:branch/1.0',
                       [('test2.recipe', test2Recipe)])
     try:
         loader = self._testSubload(repos,
                                    "loadSuperClass('test2')",
                                    cfg=cfg,
                                    branch=branch)
         assert (0)
     except Exception, err:
         assert (str(err).find('cannot find source component test1:source:')
                 != -1)
         pass
Beispiel #16
0
    def testFollowBranch(self):
        troveVersion = self.repo.findTrove(self.cfg.buildLabel,
                                           ("testcase:source", None, None),
                                           self.cfg.flavor)[0][1]
        branch = troveVersion.branch()

        self.mkbranch(self.cfg.buildLabel, "@rpl:branch1", "testcase:source")

        self.repo.updateMetadataFromXML('testcase:source', branch, testXML)

        newLabel = versions.Label("localhost@rpl:branch1")
        troveVersion = self.repo.findTrove(newLabel,
                                           ("testcase:source", None, None),
                                           self.cfg.flavor)[0][1]
        branch1 = troveVersion.branch()

        metadata = self.repo.getMetadata(["testcase:source", branch1],
                                         newLabel)
        metadata = metadata["testcase:source"]

        assert (metadata.getShortDesc() == "A metadata testcase.")
        assert (metadata.getLongDesc() == "Just a testcase for the metadata.")
        assert (metadata.getSource() == "testsource")
        assert (metadata.getLanguage() == "C")
        assert (metadata.getUrls() == ["http://url1/"])
        assert (metadata.getLicenses() == ["GPL"])
        assert (metadata.getCategories() == [
            "Test Category", "Test Category 2"
        ])
Beispiel #17
0
    def testConfigLabelList(self):
        defaultLabel = versions.Label('conary.rpath.com@rpl:devel')
        localLabel = versions.Label('localhost@rpl:devel')

        class TestCfgFile(ConfigFile):
            foo = (CfgList(CfgLabel), [defaultLabel])

        cfg = TestCfgFile()
        assert(cfg.foo == [defaultLabel])
        cfg.configLine('foo localhost@rpl:devel')
        assert(cfg.foo == [localLabel])
        cfg.configLine('foo conary.rpath.com@rpl:devel')
        assert(cfg.foo == [localLabel, defaultLabel])
        lines = self._getDisplayLines(cfg)
        assert(lines == ['foo localhost@rpl:devel', 
                         'foo conary.rpath.com@rpl:devel'])
Beispiel #18
0
    def testRedirectSwitchesBranchNotName(self):
        # when a redirect switches branches but not name, we don't
        # need to remove it from the job as an erase
        self.addComponent('redirect:runtime', '1.0')  # target of redirect
        self.addCollection('redirect', '1.0', [':runtime'])
        # target of redirect

        # source of redirect
        redirectBranch = '/localhost@rpl:branch' % self.cfg.buildLabel
        self.addComponent('redirect:runtime', '%s/1.0' % redirectBranch)
        self.addCollection('redirect', '%s/1.0' % redirectBranch, [':runtime'])

        # actual redirect = redirect=:branch -> redirect=:linux
        oldBuildLabel = self.cfg.buildLabel
        self.cfg.buildLabel = versions.Label('localhost@rpl:branch')
        tst = self.buildRecipe(redirectBranchRecipe, "testRedirect")
        self.cfg.buildLabel = oldBuildLabel

        self.updatePkg('redirect=:branch/1.0')
        self.checkUpdate(
            ['redirect'],
            ['redirect=:branch--:linux', 'redirect:runtime=:branch--:linux'])

        self.addCollection('group-redirect', '1.0', ['redirect'])
        self.updatePkg('group-redirect', recurse=False)
        self.checkUpdate(
            ['redirect'],
            ['redirect=:branch--:linux', 'redirect:runtime=:branch--:linux'])
Beispiel #19
0
    def testLoadInstalledInRoot(self):
        # make sure that we find this autoconf213 trove even though it's
        # been built.  (RMK-371)
        self.openRepository()
        repos = self.openRmakeRepository()

        sourceV = VFS('/localhost@rpl:1//autoconf213/2.13-1.1')
        binV = sourceV.createShadow(versions.Label('rmakehost@rpl:1'))
        binV.incrementBuildCount()

        loadInstalledRecipe = fixtures.loadInstalledRecipe.replace(
                                "loadInstalled('loaded')",
                                "loadInstalled('loaded=:autoconf213')")
        self.addComponent('loaded:runtime', str(binV))
        trv = self.addCollection('loaded', str(binV), [':runtime'])
        self.updatePkg('loaded=rmakehost@rpl:1')
        self.addComponent('loaded:source', str(sourceV),
                          [('loaded.recipe',
                            fixtures.loadedRecipe.replace('@@', '2.13'))])
        trv = self.addComponent('loadinstalled:source', '1',
                          [('loadinstalled.recipe', loadInstalledRecipe)])
        n,v,f = trv.getNameVersionFlavor()

        db = self.openDatabase()
        source = recipeutil.RemoveHostSource(db, 'rmakehost')
        (loader, recipeClass, localFlags, usedFlags) = \
            recipeutil.loadRecipeClass(repos, n, v, f,
                                       ignoreInstalled=False, 
                                       root=self.cfg.root,
                                       loadInstalledSource=source)
        assert(recipeClass.loadedVersion == '2.13')
Beispiel #20
0
def doCommit(cfg, changeSetFile, targetLabel):
    client = conaryclient.ConaryClient(cfg)
    repos = client.getRepos()
    callback = CheckinCallback()

    try:
        cs = changeset.ChangeSetFromFile(changeSetFile)
    except filecontainer.BadContainer:
        log.error("invalid changeset %s", changeSetFile)
        return 1

    if cs.isLocal():
        if not targetLabel:
            log.error("committing local changesets requires a targetLabel")
        label = versions.Label(targetLabel)
        cs.setTargetShadow(repos, label)
        commitCs = cs.makeAbsolute(repos)

        (fd, changeSetFile) = tempfile.mkstemp()

        os.close(fd)
        commitCs.writeToFile(changeSetFile)

    try:
        # hopefully the file hasn't changed underneath us since we
        # did the check at the top of doCommit().  We should probably
        # add commitChangeSet method that takes a fd.
        try:
            repos.commitChangeSetFile(changeSetFile, callback=callback)
        except errors.CommitError, e:
            print e
    finally:
        if targetLabel:
            os.unlink(changeSetFile)
Beispiel #21
0
    def testRedirectFromTrove(self):
        self.addComponent('test:runtime', '1.0')
        self.addComponent('test-foo:runtime', '1.0')
        self.addCollection('test', '1.0', [':runtime'])
        self.addCollection('test-foo', '1.0', [':runtime'])

        redirectBranch = '/%s//branch' % self.cfg.buildLabel

        self.addComponent('redirect:runtime', '%s/0.1' % redirectBranch)
        self.addComponent('redirect-foo:runtime', '%s/0.1' % redirectBranch)
        self.addCollection('redirect', '%s/0.1' % redirectBranch, [':runtime'])
        self.addCollection('redirect-foo', '%s/0.1' % redirectBranch,
                           [':runtime'])

        v1 = versions.VersionFromString('/%s//branch/1.0-1' %
                                        self.cfg.buildLabel)
        built, d = self.buildRecipe(redirectWithPkgRecipe,
                                    "testRedirectWithPkg",
                                    sourceVersion=v1)
        self.checkUpdate(['redirect=:branch', 'redirect-foo=:branch'], [
            'test=--1.0', 'test:runtime=--1.0', 'test-foo=--1.0',
            'test-foo:runtime=--1.0'
        ])

        # make sure you can't shadow a redirect
        try:
            self.mkbranch("/localhost@rpl:linux//branch/1.0-1-0.1",
                          versions.Label("localhost@foo:bar"),
                          "redirect",
                          shadow=True)
        except conary.errors.ShadowRedirect, e:
            assert (
                str(e) ==
                'cannot create a shadow of redirect=/localhost@rpl:linux//branch/1.0-1-0.1[] because it is a redirect'
            )
Beispiel #22
0
 def __init__(self, cfg):
     self.name = 'group-dummy'
     self.version = '1.0'
     repos = DummyRepos()
     grouprecipe.GroupRecipe.__init__(self, repos, cfg,
                                      versions.Label('a@b:c'), None, None)
     self.loadPolicy()
Beispiel #23
0
def getPackagesFromLabel(cfg, cli, label):
    '''
    Return a set of (name, version, flavor) triples representing each
    package on the specified I{label}.
    '''
    repos = cli.getRepos()
    label = versions.Label(label)
    #searchFlavor =  (CfgFlavor, deps.parseFlavor('is: x86(~i486,~i586,~i686,~sse,~sse2)'))
    searchFlavor = deps.parseFlavor('is: x86(~i486,~i586,~i686,~sse,~sse2)')
    mapping = repos.getTroveLatestByLabel({'': {label: None}})

    # Get a list of troves on that label
    # {name: {version: [flavor, ...], ...}, ...}
    ret = set()
    for name, trove_versions in mapping.iteritems():
        if ':' in name:
            # Skip components
            continue
        latestVersion = max(trove_versions.iterkeys())
        flavors = trove_versions[latestVersion]
        for flavor in flavors:
            #if flavor.satisfies(searchFlavor):
            ret.add((name, latestVersion, flavor))
            break
    return ret
Beispiel #24
0
 def __init__(self, cfg):
     self.name = 'fileset'
     self.version = '1.0'
     repos = DummyRepos()
     filesetrecipe.FilesetRecipe.__init__(self, repos, cfg,
                                          versions.Label('a@b:c'), None, {})
     self._policyMap = {}
Beispiel #25
0
    def findAvailableTargetFlavors(self, repos):
        if self.branchStr is None:
            # redirect to nothing
            return set()

        if self.branchStr[0] == '/':
            branch = versions.VersionFromString(self.branchStr)
            if not isinstance(branch, versions.Branch):
                raise builderrors.RecipeFileError, \
                    "Redirects must specify branches or labels, " \
                    "not versions"

            log.info('redirecting to branches is deprecated; redirects must '
                     'be to labels')

            matches = repos.getTroveLeavesByBranch(
                {self.destName: {
                    branch: None
                }})
        else:
            label = versions.Label(self.branchStr)
            matches = repos.getTroveLatestByLabel(
                {self.destName: {
                    label: None
                }})

        targetFlavors = set()
        # Get the flavors and branch available on the target
        for version, flavorList in matches.get(self.destName, {}).iteritems():
            targetFlavors.update((version, x) for x in flavorList)

        return targetFlavors
Beispiel #26
0
 def createMirrorUser(self, repos, serverName="localhost"):
     label = versions.Label("%s@foo:bar" % serverName)
     self.addUserAndRole(repos, label, "mirror", "mirror")
     repos.addAcl(label, "mirror", None, None, write=True, remove=True)
     repos.setRoleIsAdmin(label, "mirror", True)
     repos.setRoleCanMirror(label, "mirror", True)
     # add a user without mirroring or admin access
     self.addUserAndRole(repos, label, "nomirror", "nomirror")
     repos.addAcl(label, "nomirror", None, None, write=True)
Beispiel #27
0
 def _openRepository(self, idx, serverName="localhost"):
     # this could be left open from a previoius testsuite running
     label = versions.Label("%s@foo:bar" % serverName)
     self.servers.stopServer(idx)
     repo = self.openRepository(idx, serverName=[serverName])
     self.resetRepository(idx)
     self.addUserAndRole(repo, label, "user", "pass")
     repo.addAcl(label, "user", None, None, write=True, remove=True)
     return repo
Beispiel #28
0
def addTestCase2(self):
    trv = self.addComponent('testcase2:source', '1', '',
                            [('testcase2.recipe', workingRecipe2 % {
                                'name': 'testcase2'
                            })])
    v = trv.getVersion().copy()
    v = v.createShadow(versions.Label('rmakehost@local:linux'))
    v.incrementBuildCount()

    builtComp = self.addComponent('testcase2:runtime', v, filePrimer=3)
    builtColl = self.addCollection('testcase2', v, [':runtime'])
    return trv, builtComp, builtColl
Beispiel #29
0
    def testDerivePackage(self):
        self.addComponent('simple:source=1-1',
                          [('simple.recipe', recipes.simpleRecipe)])
        self.addComponent('simple:runtime=1-1-1', [('/foo', 'contents\n')])
        self.addCollection('simple=1-1-1', [':runtime'])
        self.addComponent('simple:source=1-2',
                          [('simple.recipe', recipes.simpleRecipe + '\n')])

        derive.derive(self.openRepository(),
                      self.cfg,
                      versions.Label('localhost@rpl:branch'),
                      'simple=localhost@rpl:linux',
                      checkoutDir=self.workDir + '/foo',
                      extract=True)

        recipe = open(self.workDir + '/foo/simple.recipe').read()
        self.assertEquals(
            recipe, """
class SimpleRecipe(DerivedPackageRecipe):
    name = 'simple'
    version = '1'

    def setup(r):
        '''
        In this recipe, you can make modifications to the package.

        Examples:

        # This appliance has high-memory-use PHP scripts
        r.Replace('memory_limit = 8M', 'memory_limit = 32M', '/etc/php.ini')

        # This appliance uses PHP as a command interpreter but does
        # not include a web server, so remove the file that creates
        # a dependency on the web server
        r.Remove('/etc/httpd/conf.d/php.conf')

        # This appliance requires that a few binaries be replaced
        # with binaries built from a custom archive that includes
        # a Makefile that honors the DESTDIR variable for its
        # install target.
        r.addArchive('foo.tar.gz')
        r.Make()
        r.MakeInstall()

        # This appliance requires an extra configuration file
        r.Create('/etc/myconfigfile', contents='some data')
        '''
""")
        self.verifyFile(self.workDir + '/foo/_ROOT_/foo', 'contents\n')
        self.verifyFile(self.workDir + '/foo/_OLD_ROOT_/foo', 'contents\n')
        self.assertEquals(
            sorted(os.listdir(os.path.join(self.workDir, 'foo'))),
            sorted(['CONARY', '_ROOT_', 'simple.recipe', '_OLD_ROOT_']))
Beispiel #30
0
    def testGetLabel(self):
        _, facade = self.prep()
        labelString = 'a@b:c'
        labelObject = versions.Label(labelString)
        assert facade._getLabel(labelString) == labelObject
        assert facade._getLabel(labelObject) == labelObject

        v1 = '/a@b:c'
        v2 = '/b@c:d/%s' % v1
        v3 = '%s/1.2.3-1-1' % v1
        assert facade._getLabel(v1) == labelObject
        assert facade._getLabel(v2) == labelObject
        assert facade._getLabel(v3) == labelObject