Beispiel #1
0
    def testTags(self):
        # tags is a list. ensure nothing sloppy is done wrt class attributes
        foo = filetypes.RegularFile(tags=['1', '2', '3'])
        fileObj = foo.get(pathId)
        self.assertEquals(fileObj.tags(), ['1', '2', '3'])

        # test that each invocation is separate
        foo = filetypes.RegularFile(tags=['4', '5'])
        fileObj = foo.get(pathId)
        self.assertEquals(fileObj.tags(), ['4', '5'])

        # test that we didn't affect the default
        foo = filetypes.RegularFile()
        fileObj = foo.get(pathId)
        self.assertEquals(fileObj.tags(), [])
Beispiel #2
0
    def testModeAlias(self):
        foo = filetypes.RegularFile(mode=0777)
        bar = filetypes.RegularFile(perms=0777)
        self.assertEquals(
            foo.get(pathId).inode.perms(),
            bar.get(pathId).inode.perms())

        self.assertRaises(filetypes.ParameterError,
                          filetypes.RegularFile,
                          mode=0600,
                          perms=0600)

        self.assertRaises(filetypes.ParameterError,
                          filetypes.RegularFile,
                          mode=0600,
                          perms=0700)
Beispiel #3
0
    def testPackageRecipeDeps2(self):
        # ensure that we don't force any particular trovename to be associated
        # with a given recipe name.
        pkgRecipe = """class PackageRecipe(SourcePackageRecipe):
            name = 'differentname'
            version = '1.0.0'
            abstractBaseClass = 1

            clearBuildReqs()
            buildRequires = ['foo:devel']"""

        simpleRecipe = """class Simple(PackageRecipe):
            name = 'simple'
            version = '1'

            # don't clear the buildReqs. that's what we're trying to test
            def setup(r):
                r.Create('/opt/foo')"""

        self.addComponent('foo:devel')
        self.addComponent('differentname:recipe',
                fileContents = [('/differentname.recipe',
                    filetypes.RegularFile(contents = pkgRecipe))])
        self.addCollection('differentname',
                strongList = ['differentname:recipe'])
        self.cfg.autoLoadRecipes = ['differentname']
        err = self.assertRaises(errors.RecipeDependencyError, self.buildRecipe, simpleRecipe, "Simple")
        self.updatePkg('foo:devel')
        self.buildRecipe(simpleRecipe, 'Simple')
Beispiel #4
0
    def testRegularFileContents(self):
        foo = filetypes.RegularFile(contents=StringIO('foo1'))
        fileObj = foo.get(pathId)
        f = foo.getContents()
        self.assertEquals(f.read(), 'foo1')

        tmpDir = tempfile.mkdtemp()
        try:
            tmpPath = os.path.join(tmpDir, 'foo.txt')
            f = open(tmpPath, 'w')
            f.write('foo2')
            f.close()
            f = open(tmpPath)
            foo = filetypes.RegularFile(contents=f)
            f = foo.getContents()
            self.assertEquals(f.read(), 'foo2')
        finally:
            util.rmtree(tmpDir)
Beispiel #5
0
    def testRegularFileBasics(self):
        foo = filetypes.RegularFile(contents='foo1')
        fileObj = foo.get(pathId)
        f = foo.getContents()
        self.assertEquals(f.read(), 'foo1')
        self.assertEquals(fileObj.flags(), 0)
        self.assertEquals(fileObj.flavor(), deps.Flavor())
        self.assertEquals(fileObj.provides(), deps.DependencySet())
        self.assertEquals(fileObj.requires(), deps.DependencySet())
        self.assertEquals(fileObj.inode.perms(), 0644)
        self.assertEquals(fileObj.inode.owner(), 'root')
        self.assertEquals(fileObj.inode.group(), 'root')
        self.assertEquals(fileObj.lsTag, '-')
        self.assertEquals(fileObj.linkGroup(), None)
        self.assertEquals(
            fileObj.fileId(),
            '(\x01\x9a\xcbz\xbb\x93\x15\x01c\xcf\xd5\x14\xef\xf7,S\xbb\xf8p')

        requires = deps.ThawDependencySet('4#foo::runtime')
        provides = deps.ThawDependencySet('11#foo')
        flv = deps.parseFlavor('xen,domU is: x86')
        bar = filetypes.RegularFile(contents=StringIO('bar'),
                                    config=True,
                                    provides=provides,
                                    requires=requires,
                                    flavor=flv,
                                    owner='foo',
                                    group='bar',
                                    perms=0700,
                                    mtime=12345,
                                    tags=['tag1', 'tag2'])
        fileObj = bar.get(pathId)
        self.assertEquals(bool(fileObj.flags.isInitialContents()), False)
        self.assertEquals(bool(fileObj.flags.isTransient()), False)
        self.assertEquals(bool(fileObj.flags.isConfig()), True)
        self.assertEquals(fileObj.requires(), requires)
        self.assertEquals(fileObj.provides(), provides)
        self.assertEquals(fileObj.flavor(), flv)
        self.assertEquals(fileObj.inode.perms(), 0700)
        self.assertEquals(fileObj.inode.owner(), 'foo')
        self.assertEquals(fileObj.inode.group(), 'bar')
        self.assertEquals(fileObj.inode.mtime(), 12345)
        self.assertEquals(fileObj.tags(), ['tag1', 'tag2'])
Beispiel #6
0
 def testRegularFileDeps(self):
     reqStr = 'trove: bar:lib'
     provStr = 'python: tarfile(2.4 lib64)'
     flavorStr = '~sse2 is: x86_64'
     foo = filetypes.RegularFile(requires=reqStr,
                                 provides=provStr,
                                 flavor=flavorStr)
     fileObj = foo.get(pathId)
     self.assertEquals(fileObj.flavor(), deps.parseFlavor(flavorStr))
     self.assertEquals(fileObj.requires(), deps.parseDep(reqStr))
     self.assertEquals(fileObj.provides(), deps.parseDep(provStr))
Beispiel #7
0
    def testPathIdParam(self):
        pathId1 = 16 * '1'
        pathId2 = 16 * '2'

        foo = filetypes.RegularFile(mode=0777, mtime=1)

        fileObj1 = foo.get(pathId1)
        fileObj2 = foo.get(pathId2)

        self.assertEquals(fileObj1.freeze(), fileObj2.freeze())
        self.assertNotEquals(fileObj1.pathId(), fileObj2.pathId())
Beispiel #8
0
    def testBaseRequiresRecipeDeps(self):
        baseReqRecipe = """class BaseRequiresRecipe(AbstractPackageRecipe):
            name = 'baserequires'
            version = '1.0.0'
            abstractBaseClass = 1

            buildRequires = ['foo:devel']"""

        pkgRecipe = defaultrecipes.PackageRecipe.replace( \
                'internalAbstractBaseClass', 'abstractBaseClass')
        pkgRecipe += "\n    version = '1'"

        simpleRecipe = """class Simple(PackageRecipe):
            name = 'simple'
            version = '1'

            # don't clear the buildReqs. that's what we're trying to test
            def setup(r):
                r.Create('/opt/foo')"""

        self.addComponent('baserequires:recipe',
                fileContents = [('/baserequires.recipe',
                    filetypes.RegularFile(contents = baseReqRecipe))])
        self.addCollection('baserequires',
                strongList = ['baserequires:recipe'])
        self.addComponent('package:recipe',
                fileContents = [('/package.recipe',
                    filetypes.RegularFile(contents = pkgRecipe))])
        self.addCollection('package',
                strongList = ['package:recipe'])

        self.cfg.autoLoadRecipes = ['baserequires', 'package']
        err = self.assertRaises(errors.RecipeDependencyError, self.buildRecipe, simpleRecipe, "Simple")
        for comp in ('foo:devel', 'bzip2:runtime', 'gzip:runtime',
                'tar:runtime', 'cpio:runtime', 'patch:runtime'):
            self.addComponent(comp)
            self.updatePkg(comp)
        self.buildRecipe(simpleRecipe, 'Simple')
Beispiel #9
0
    def testUserInfoRecipeDeps(self):
        baseReqRecipe = """class BaseRequiresRecipe(AbstractPackageRecipe):
            name = 'baserequires'
            version = '1'
            abstractBaseClass = 1

            buildRequires = ['foo:devel']"""

        userInfoRecipe = defaultrecipes.UserInfoRecipe.replace( \
                'internalAbstractBaseClass', 'abstractBaseClass')
        userInfoRecipe += "\n    version = '1'"

        infoRecipe = """class InfoFoo(UserInfoRecipe):
            name = 'info-foo'
            version = '1'

            # don't clear the buildReqs. that's what we're trying to test
            def setup(r):
                r.User('foo', 2121)"""

        self.addComponent('foo:devel')
        self.addComponent('baserequires:recipe',
                fileContents = [('/baserequires.recipe',
                    filetypes.RegularFile(contents = baseReqRecipe))])
        self.addCollection('baserequires',
                strongList = ['baserequires:recipe'])

        self.addComponent('userinfo:recipe',
                fileContents = [('/userinfo.recipe',
                    filetypes.RegularFile(contents = userInfoRecipe))])
        self.addCollection('userinfo',
                strongList = ['userinfo:recipe'])

        self.cfg.autoLoadRecipes = ['baserequires', 'userinfo']
        err = self.assertRaises(errors.RecipeDependencyError, self.buildRecipe, infoRecipe, "InfoFoo")
        self.updatePkg('foo:devel')
        self.buildRecipe(infoRecipe, 'InfoFoo')
Beispiel #10
0
    def testGroupInfoRecipeCook2(self):
        groupInfoRecipe = """
class GroupInfoRecipe(UserGroupInfoRecipe, BaseRequiresRecipe):
    name = 'groupinfo'
    clearBuildReqs()
    version = '1'
    abstractBaseClass = 1
"""
        # if we don't re-direct this setting, we can't build
        self.cfg.baseClassDir = '/usr/share/conary/baseclasses'
        self.openRepository()
        client = self.getConaryClient()
        repos = client.getRepos()

        fileDict = {'groupinfo.recipe' : filetypes.RegularFile(contents = groupInfoRecipe, config = True)}
        chLog = changelog.ChangeLog(name = 'foo', contact = 'bar', message = 'test\n')
        cs = client.createSourceTrove('groupinfo:source', str(self.cfg.buildLabel), '1', fileDict, chLog)
        repos.commitChangeSet(cs)
        res = self.cookFromRepository('groupinfo:source', buildLabel = self.cfg.buildLabel, repos = repos, logBuild = True)
        self.assertEquals(res[0][0], 'groupinfo:recipe')
Beispiel #11
0
def _makeSourceTrove(package, helper):
    cs = ChangeSet()
    filesToAdd = {}
    ver = macro.expand(package.getBaseVersion(), package)
    version = _createVersion(package, helper, ver)
    latestSpec = (package.getName(), str(version.trailingLabel()), None)
    results = helper.getRepos().findTroves(None,[latestSpec],allowMissing=True,
                        getLeaves=False,troveTypes=trovesource.TROVE_QUERY_ALL)
    if results:
        existingVersions = [x[1] for x in results.get(latestSpec, ())]
        while version in existingVersions:
            version.incrementSourceCount()

    new = Trove(package.name, version, deps.Flavor())
    new.setFactory(package.targetConfig.factory)
    message = "Temporary Source for %s" % version
    message = message.rstrip() + "\n"
    new.changeChangeLog(ChangeLog(name=helper.cfg.name,
                contact=helper.cfg.contact, message=message))
    for path, contents in package.recipeFiles.iteritems():
        isText = path == package.getRecipeName()
        pathId = hashlib.md5(path).digest()
        fileHelper = filetypes.RegularFile(contents=contents,
                    config=isText)
        fileStream = fileHelper.get(pathId)
        fileStream.flags.isSource(set=True)
        fileId = fileStream.fileId()
        fileVersion = new.getVersion()
        key = pathId + fileId
        filesToAdd[key] = (fileStream, fileHelper.contents, isText)
        new.addFile(pathId, path, fileVersion, fileId)
    new.invalidateDigests()
    new.computeDigests()
    for key, (fileObj, fileContents, cfgFile) in filesToAdd.items():
        cs.addFileContents(fileObj.pathId(), fileObj.fileId(),
                    ChangedFileTypes.file, fileContents, cfgFile)
        cs.addFile(None, fileObj.fileId(), fileObj.freeze())
    cs.newTrove(new.diff(None, absolute=True)[0])
    return new.getNameVersionFlavor(), cs
Beispiel #12
0
        def _addFile(path, contents, isText):
            if path in oldFiles:
                # Always recycle pathId if available.
                pathId, _, oldFileId, oldFileVersion = oldFiles[path]
            else:
                pathId = hashlib.md5(path).digest()
                oldFileId = oldFileVersion = None

            fileHelper = filetypes.RegularFile(contents=contents,
                    config=isText)
            fileStream = fileHelper.get(pathId)
            fileStream.flags.isSource(set=True)
            fileId = fileStream.fileId()

            # If the fileId matches, recycle the fileVersion too.
            if fileId == oldFileId:
                fileVersion = oldFileVersion
            else:
                fileVersion = newTrove.getVersion()

            filesToAdd[fileId] = (fileStream, fileHelper.contents, isText)
            newTrove.addFile(pathId, path, fileVersion, fileId)
Beispiel #13
0
    def _addPhantomTrove(self, changeSet, rpmlibHeader, callback, num, total):
        header = rpmhelper.headerFromBlob(rpmlibHeader.unload())
        callback.capsuleSyncCreate(self.kind, str(header.getNevra()), num,
                                   total)
        name, version, flavor = self._getPhantomNVF(header)
        # Fake trove
        trv = trove.Trove(name, version, flavor)
        provides = header.getProvides()
        provides.addDep(deps.TroveDependencies, deps.Dependency(name))
        trv.setProvides(provides)
        trv.setRequires(header.getRequires(enableRPMVersionDeps=False))
        # Fake capsule file
        path = str(header.getNevra()) + '.rpm'
        fileHelper = filetypes.RegularFile(contents='')
        fileStream = fileHelper.get(pathId=trove.CAPSULE_PATHID)
        trv.addRpmCapsule(path, version, fileStream.fileId(), header)
        changeSet.addFile(None, fileStream.fileId(), fileStream.freeze())
        # Fake encapsulated files
        self._addPhantomContents(changeSet, trv, header)
        trv.computeDigests()
        changeSet.newTrove(trv.diff(None)[0])

        # Make a fake package to contain the fake component
        pkgName = name.split(':')[0]
        if self.db.hasTrove(pkgName, version, flavor):
            # It's possible to erase just the component and leave the package,
            # so don't try to create it again.
            return
        pkg = trove.Trove(pkgName, version, flavor)
        provides = deps.DependencySet()
        provides.addDep(deps.TroveDependencies, deps.Dependency(pkgName))
        pkg.setProvides(provides)
        pkg.setIsCollection(True)
        pkg.addTrove(name, version, flavor, byDefault=True)
        pkg.computeDigests()
        changeSet.newTrove(pkg.diff(None)[0])
Beispiel #14
0
 def testLinkGroup(self):
     foo = filetypes.RegularFile(linkGroup='12345')
     fileObj = foo.get(pathId)
     self.assertEquals(fileObj.linkGroup(), '12345')