示例#1
0
 def testTroveFilterFlavors2(self):
     recipe = self.getRecipe()
     filt1 = trovefilter.TroveFilter(recipe, flavor='xen,domU is: x86')
     filt2 = trovefilter.TroveFilter(recipe, flavor='xen,domU is: x86_64')
     filt3 = trovefilter.TroveFilter(recipe,
                                     flavor='xen,domU is: x86_64 x86')
     nvf1 = ('foo', versions.VersionFromString( \
             '/test.rpath.local@rpl:linux/1-1-1'),
             deps.parseFlavor('is: x86'))
     nvf2 = ('foo', versions.VersionFromString( \
             '/test.rpath.local@rpl:linux/1-1-1'),
             deps.parseFlavor('xen,domU is: x86'))
     nvf3 = ('foo', versions.VersionFromString( \
             '/test.rpath.local@rpl:linux/1-1-1'),
             deps.parseFlavor('xen,domU is: x86_64'))
     nvf4 = ('foo', versions.VersionFromString( \
             '/test.rpath.local@rpl:linux/1-1-1'),
             deps.parseFlavor('xen,domU is: x86 x86_64'))
     self.assertEquals(filt1.match((nvf1, )), False)
     self.assertEquals(filt1.match((nvf2, )), True)
     self.assertEquals(filt2.match((nvf2, )), False)
     self.assertEquals(filt2.match((nvf3, )), True)
     self.assertEquals(filt2.match((nvf4, )), False)
     self.assertEquals(filt3.match((nvf4, )), True)
     self.assertEquals(filt3.match((nvf1, )), False)
     self.assertEquals(filt3.match((nvf2, )), False)
     self.assertEquals(filt3.match((nvf3, )), False)
示例#2
0
 def testTroveFilterVersion(self):
     recipe = self.getRecipe()
     filt = trovefilter.TroveFilter(recipe,
                                    'foo',
                                    version='test.rpath.local@rpl:linux')
     filt2 = trovefilter.TroveFilter(recipe,
                                     'bar',
                                     version='test.rpath.local@rpl:linux')
     nvf = ('foo', versions.VersionFromString( \
             '/test.rpath.local@rpl:linux/1-1-1'), deps.parseFlavor(''))
     self.assertEquals(filt.match((nvf, )), True)
     self.assertEquals(filt2.match((nvf, )), False)
     filt = trovefilter.TroveFilter(recipe,
                                    'foo',
                                    version='/test.rpath.local@rpl:linux')
     self.assertEquals(filt.match((nvf, )), True)
     filt = trovefilter.TroveFilter(
         recipe, 'foo', version='/test.rpath.local@rpl:linux/1-1-1')
     self.assertEquals(filt.match((nvf, )), True)
     filt = trovefilter.TroveFilter(recipe,
                                    'foo',
                                    version='test.rpath.local@rpl:linux')
     nvf = ('foo', versions.VersionFromString( \
             '/test.rpath.local@rpl:devel/1-1-1'), deps.parseFlavor(''))
     self.assertEquals(filt.match((nvf, )), False)
     filt = trovefilter.TroveFilter(recipe,
                                    'foo',
                                    version='/test.rpath.local@rpl:linux')
     self.assertEquals(filt.match((nvf, )), False)
     filt = trovefilter.TroveFilter(
         recipe, 'foo', version='/test.rpath.local@rpl:linux/1-1-1')
     self.assertEquals(filt.match((nvf, )), False)
示例#3
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)
示例#4
0
 def findTroves(self,
                labelPath,
                troveSpecs,
                defaultFlavor=None,
                allowMissing=False):
     results = {}
     if labelPath:
         if not isinstance(labelPath, (tuple, list)):
             labelPath = labelPath,
         else:
             labelPath = tuple(labelPath)
     for troveSpec in troveSpecs:
         self.recordFindTroveArgs.append((labelPath, troveSpec))
         if troveSpec[2] is not None:
             flavor = troveSpec[2]
         else:
             flavor = deps.parseFlavor('')
         if labelPath:
             if troveSpec[1]:
                 verPart = troveSpec[1]
             else:
                 verPart = '1.0-1-1'
             troveTup = (troveSpec[0],
                         versions.VersionFromString(
                             '/%s/%s' % (labelPath[0], verPart)), flavor)
         else:
             troveTup = (troveSpec[0],
                         versions.VersionFromString(troveSpec[1]), flavor)
         results[troveSpec] = [troveTup]
     return results
示例#5
0
    def testRPMCapsuleDepCulling(self):
        """ Make sure that RPMRequires redundent rpm requires are culled"""
        recipestr1 = r"""
class TestDepCulling(CapsuleRecipe):
    name = 'test'
    version = '0'
    clearBuildReqs()

    def setup(r):
        r.addCapsule('gnome-main-menu-0.9.10-26.x86_64.rpm')
"""
        self.cfg.enableRPMVersionDeps = False
        self.overrideBuildFlavor('is: x86_64')
        built, d = self.buildRecipe(recipestr1, "TestDepCulling")

        nvf = built[0]
        nvf = nvf[0], versions.VersionFromString(nvf[1]), nvf[2]

        repos = self.openRepository()
        trv = repos.getTrove(*nvf)
        reqGot = list(trv.requires().iterDepsByClass(deps.RpmDependencies))
        reqExpected = "[Dependency('hal'), Dependency('gnome-main-menu-lang'), Dependency('gnome-panel'), Dependency('tango-icon-theme'), Dependency('coreutils'), Dependency('dbus-1-glib'), Dependency('libssui'), Dependency('eel'), Dependency('wireless-tools')]"
        self.assertEquals(str(reqGot), reqExpected)

        self.cfg.enableRPMVersionDeps = True
        built, d = self.buildRecipe(recipestr1, "TestDepCulling")

        nvf = built[0]
        nvf = nvf[0], versions.VersionFromString(nvf[1]), nvf[2]

        repos = self.openRepository()
        trv = repos.getTrove(*nvf)
        reqGot = list(trv.requires().iterDepsByClass(deps.RpmDependencies))
        reqExpected = "[Dependency('hal'), Dependency('gnome-main-menu-lang'), Dependency('gnome-main-menu-lang-0.9.10'), Dependency('gnome-panel'), Dependency('tango-icon-theme'), Dependency('coreutils'), Dependency('dbus-1-glib'), Dependency('libssui'), Dependency('eel'), Dependency('wireless-tools')]"
        self.assertEquals(str(reqGot), reqExpected)
示例#6
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))
示例#7
0
    def testLoadedTrovesWithAutoLoad(self):
        self.logFilter.add()
        repos = self.openRepository()
        if 'x86_64' not in str(self.cfg.buildFlavor):
            raise testhelp.SkipTestException('Skip test on x86 arch')

        self.cfg.autoLoadRecipes.append('other')

        self.overrideBuildFlavor('is: x86 x86_64')

        header = '''
    if Arch.x86: pass
'''
        self.addComponent(
            'other:recipe=2.0[is:x86 x86_64]',
            [('simplesuper.recipe', simpleSuperRecipe.replace('1.0', '2.0'))])
        self.addCollection('other=2.0[is:x86 x86_64]', [':recipe'])
        self.addTestPkg(1, version='1.0', header=header)
        self.addTestPkg(2, header='loadRecipe("test1")')

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

        loader = self._testSubload(repos, "loadInstalled('test2')")
        FooLoaded = loader.getLoadedSpecs()
        assertEq = self.assertEqual
        assertEq(FooLoaded['test2'][0], ('test2:source', v1, emptydep))

        Test2Loaded = FooLoaded['test2'][1]
        assertEq(Test2Loaded['test1'][0], ('test1:source', v1, x64dep))

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

        loadedTroves = loader.getLoadedTroves()
        assertEq(len(loadedTroves), 2)
        assertEq(loadedTroves[0], ('test1:source', v1, x64dep))
        assertEq(loadedTroves[1], ('test2:source', v1, emptydep))

        # 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)
        self.overrideBuildFlavor('!readline, !ssl')
        overrides = oldLoadedSpecs
        loader = self._testSubload(repos,
                                   "loadInstalled('test2')",
                                   cfg=cfg,
                                   overrides=overrides)
        assert (loadedTroves[0] == ('test1:source', v1, x64dep))
        assert (loadedTroves[1] == ('test2:source', v1, emptydep))
示例#8
0
文件: sigtest.py 项目: tensor5/conary
    def testNonRecursiveGroupSigs(self):
        fingerprint = '95B457D16843B21EA3FC73BBC7C32FC1F94E405E'
        # supply the pass phrase for our private key
        keyCache = openpgpkey.getKeyCache()
        keyCache.getPrivateKey(fingerprint, '111111')
        # make all components before assigning a key, so all start out blank
        self.addQuickTestComponent("test:doc", "1.0-1-1")

        self.makeSourceTrove('testcase', testRecipe)

        repos = self.openRepository()
        built = self.cookItem(repos, self.cfg, 'testcase', ignoreDeps=True)
        group = self.build(testGroup, "GroupTest")
        group = self.build(outerGroup, "OuterGroup")

        signatureKey = self.cfg.signatureKey
        self.cfg.signatureKey = fingerprint
        self.cfg.quiet = True

        v = versions.VersionFromString('/localhost@rpl:linux/1.0-1-1')
        f = deps.parseFlavor('')

        try:
            # first sign the outer group trove
            #signtrove.signTroves(self.cfg, [ "group-outer" ])
            cvccmd.sourceCommand(self.cfg, ["sign", "group-outer"], {})

            try:
                t = repos.getTrove('group-outer', v, f)
                self._checkDigitalSig(t, fingerprint)
            except openpgpfile.KeyNotFound:
                self.fail('Group signing failed to cover %s' % t)

            # check the sig on each trove in the group, since group signing
            # should be recursive
            for trvName in ('group-test', 'test:doc', 'testcase',
                            'testcase:runtime'):
                try:
                    t = repos.getTrove(trvName, v, f)
                    t.getDigitalSignature(fingerprint)
                    self.fail('Group signing inadvenderntly signed %s' %
                              trvName)
                except openpgpfile.KeyNotFound:
                    pass
            # then check that the source trove wasn't signed... it wasn't
            # explicitly part of the group
            v = versions.VersionFromString('/localhost@rpl:linux/1.0-1')
            f = deps.parseFlavor('')
            t = repos.getTrove('testcase:source', v, f)
            try:
                signature = t.getDigitalSignature(fingerprint)
                self._checkDigitalSig(t, fingerprint)
                self.fail('signing group inadvendently signed source trove')
            except openpgpfile.KeyNotFound:
                pass

        finally:
            self.cfg.signatureKey = signatureKey
示例#9
0
 def testTroveFilterBlank(self):
     recipe = self.getRecipe()
     filt = trovefilter.TroveFilter(recipe)
     nvf = ('foo', versions.VersionFromString( \
             '/test.rpath.local@rpl:linux/1.1-2-1'), deps.parseFlavor(''))
     self.assertEquals(filt.match((nvf, )), True)
     nvf = ('bar', versions.VersionFromString( \
             '/test.rpath.local@rpl:devel/1.0-6-4'), deps.parseFlavor(''))
     self.assertEquals(filt.match((nvf, )), True)
示例#10
0
    def testRPMCapsuleDepPolicy(self):
        """ Make sure that RPMProvide and RPMProvide work"""
        recipestr1 = r"""
class TestEpoch(CapsuleRecipe):
    name = 'test'
    version = '0'
    clearBuildReqs()

    def setup(r):
        r.addCapsule('epoch-1.0-1.i386.rpm')
        r.RPMProvides('rpm: nonsenseProvision(FOO BAR)', 'epoch:rpm' )
        r.RPMRequires('rpm: nonsenseRequirement(BAZ QUX)', 'epoch' )
"""
        self.cfg.enableRPMVersionDeps = False
        built, d = self.buildRecipe(recipestr1, "TestEpoch")

        nvf = built[0]
        nvf = nvf[0], versions.VersionFromString(nvf[1]), nvf[2]

        repos = self.openRepository()
        trv = repos.getTrove(*nvf)

        self.assertEquals(
            str(trv.provides()), '\n'.join(
                ('trove: epoch:rpm', 'rpm: epoch', 'rpm: epoch[x86-32]',
                 'rpm: nonsenseProvision(BAR FOO)')))

        self.assertEquals(
            str(trv.requires), '\n'.join(('rpm: nonsenseRequirement(BAZ QUX)',
                                          'rpmlib: CompressedFileNames',
                                          'rpmlib: PayloadFilesHavePrefix')))

        self.cfg.enableRPMVersionDeps = True
        built, d = self.buildRecipe(recipestr1, "TestEpoch")

        nvf = built[0]
        nvf = nvf[0], versions.VersionFromString(nvf[1]), nvf[2]

        repos = self.openRepository()
        trv = repos.getTrove(*nvf)

        self.assertEquals(
            str(trv.provides()), '\n'.join(
                ('trove: epoch:rpm', 'rpm: epoch', 'rpm: epoch-17:1.0',
                 'rpm: epoch-17:1.0-1', 'rpm: epoch[x86-32]',
                 'rpm: epoch[x86-32]-17:1.0', 'rpm: epoch[x86-32]-17:1.0-1',
                 'rpm: nonsenseProvision(BAR FOO)')))

        self.assertEquals(
            str(trv.requires), '\n'.join(('rpm: nonsenseRequirement(BAZ QUX)',
                                          'rpmlib: CompressedFileNames',
                                          'rpmlib: PayloadFilesHavePrefix')))
示例#11
0
    def testTroveFilterRegexps(self):
        recipe = self.getRecipe()
        recipe.macros.name = 'foo'
        # test a regexp in the name element
        filt = trovefilter.TroveFilter(recipe,
                                       '%(name)s1+',
                                       version='test.rpath.local@rpl:linux')
        nvf = ('foo11', versions.VersionFromString( \
                '/test.rpath.local@rpl:linux/1-1-1'), deps.parseFlavor(''))
        self.assertEquals(filt.match((nvf, )), True)

        # test that name regexp is anchored
        nvf = ('foo113', versions.VersionFromString( \
                '/test.rpath.local@rpl:linux/1-1-1'), deps.parseFlavor(''))
        self.assertEquals(filt.match((nvf, )), False)
示例#12
0
文件: sigtest.py 项目: tensor5/conary
    def testCookPackage(self):
        fingerprint = '95B457D16843B21EA3FC73BBC7C32FC1F94E405E'
        self.makeSourceTrove('testcase', testRecipe)

        v = versions.VersionFromString('/localhost@rpl:linux/1.0-1-1')
        f = deps.parseFlavor('')
        repos = self.openRepository()

        # excercise signatureKeyMap codepath
        signatureKeyMap = self.cfg.signatureKeyMap
        try:
            self.cfg.signatureKeyMap = [('localhost@rpl:linux', fingerprint)]

            built = self.cookItem(repos, self.cfg, 'testcase', ignoreDeps=True)
            trv = repos.getTrove('testcase', v, f)

            self.assertFalse(not trv.getSigs().digitalSigs.freeze(),
                             "Package was not signed when cooked")

            self.assertFalse(
                trv.verifyDigitalSignatures() !=
                (openpgpfile.TRUST_TRUSTED, [], set()),
                "Bad digital signature for cooked package")
        finally:
            self.cfg.signatureKeyMap = signatureKeyMap
示例#13
0
 def testTroveFilterFlavors3(self):
     recipe = self.getRecipe()
     filt1 = trovefilter.TroveFilter(recipe, flavor='xen,domU is: x86')
     filt2 = trovefilter.TroveFilter(
         recipe, flavor='xen,domU is: x86(sse, sse2, 486, 586, 686)')
     nvf1 = ('foo', versions.VersionFromString( \
             '/test.rpath.local@rpl:linux/1-1-1'),
             deps.parseFlavor('xen,domU is: x86'))
     nvf2 = ('foo', versions.VersionFromString( \
             '/test.rpath.local@rpl:linux/1-1-1'),
             deps.parseFlavor('xen,domU is: x86(sse, sse2, 486, 586, 686)'))
     self.assertEquals(filt1.match((nvf1, )), True)
     self.assertEquals(filt2.match((nvf2, )), True)
     # most important test. x86 filter matches x86(sse)
     self.assertEquals(filt1.match((nvf2, )), True)
     self.assertEquals(filt2.match((nvf1, )), False)
示例#14
0
    def testFileObjMissing(self):
        # create an absolute changeset
        cs = changeset.ChangeSet()

        # add a pkg diff
        flavor = deps.deps.parseFlavor('')
        v = versions.VersionFromString('/%s/1.0-1-1'
                                       %self.cfg.buildLabel.asString()).copy()
        v.resetTimeStamps()
        t = trove.Trove('test:test', v, flavor, None)
        path = self.workDir + '/blah'
        f = open(path, 'w')
        f.write('hello, world!\n')
        f.close()
        pathId = sha1helper.md5String('/blah')
        f = files.FileFromFilesystem(path, pathId)
        # add the file, and SKIP including
        # the filestream by using cs.addFile().  This creates an
        # incomplete changeset
        t.addFile(pathId, '/blah', v, f.fileId())
        cs.addFileContents(pathId, f.fileId(), changeset.ChangedFileTypes.file,
                           filecontents.FromFilesystem(path),
                           f.flags.isConfig())

        t.computeDigests()
        diff = t.diff(None, absolute = 1)[0]
        cs.newTrove(diff)

        repos = self.openRepository()
        try:
            repos.commitChangeSet(cs)
            assert 0, "Did not raise IntegrityError"
        except errors.IntegrityError, e:
            assert(str(e).startswith("Incomplete changeset specified: missing pathId e806729b6a2b568fa7e77c3efa3a9684 fileId"))
示例#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
示例#16
0
        def _createCs(version):
            # create an absolute changeset
            flavor = deps.parseFlavor('')
            cs = changeset.ChangeSet()
            # add a pkg diff
            v = versions.VersionFromString(version, timeStamps=[1.000])
            old = trove.Trove('test', v, flavor, None)
            old.setIsCollection(True)
            old.addTrove('test:foo', v, flavor, byDefault=True)
            old.addTrove('test:bar', v, flavor, byDefault=False)
            old.computeDigests()

            # add the 'test' package
            diff = old.diff(None)[0]
            cs.newTrove(diff)
            cs.addPrimaryTrove('test', v, flavor)

            # add the test:foo component
            oldfoo = trove.Trove('test:foo', v, flavor, None)
            oldfoo.computeDigests()
            diff = oldfoo.diff(None)[0]
            cs.newTrove(diff)

            # add the test:bar component
            oldbar = trove.Trove('test:bar', v, flavor, None)
            oldbar.computeDigests()
            diff = oldbar.diff(None)[0]
            cs.newTrove(diff)

            return cs
示例#17
0
    def testFileContentsMissing(self):
        # currently causes a 500 error
        #raise testhelp.SkipTestException
        # create an absolute changeset
        cs = changeset.ChangeSet()

        # add a pkg diff
        flavor = deps.deps.parseFlavor('')
        v = versions.VersionFromString('/%s/1.0-1-1'
                                       %self.cfg.buildLabel.asString()).copy()
        v.resetTimeStamps()
        t = trove.Trove('test:test', v, flavor, None)
        path = self.workDir + '/blah'
        f = open(path, 'w')
        f.write('hello, world!\n')
        f.close()
        pathId = sha1helper.md5String('/blah')
        f = files.FileFromFilesystem(path, pathId)
        # add the file, but munge the fileid
        fileId = f.fileId()
        cs.addFile(None, fileId, f.freeze())
        t.addFile(pathId, '/blah', v, fileId)
        # skip adding the file contents
        t.computeDigests()

        diff = t.diff(None, absolute = 1)[0]
        cs.newTrove(diff)

        repos = self.openRepository()
        try:
            repos.commitChangeSet(cs)
            assert 0, "Did not raise integrity error"
        except errors.IntegrityError, e:
            assert(str(e).startswith("Missing file contents for pathId e806729b6a2b568fa7e77c3efa3a9684, fileId"))
示例#18
0
 def fixTroveSig(self, repos, instanceId):
     cu = self.db.cursor()
     cu.execute(
         """
     select Items.item as name, Versions.version, Flavors.flavor
     from Instances
     join Items using (itemId)
     join Versions on
         Instances.versionId = Versions.versionId
     join Flavors on
         Instances.flavorId = Flavors.flavorId
     where Instances.instanceId = ?""", instanceId)
     (name, version, flavor) = cu.fetchall()[0]
     # check the signature
     trv = repos.getTrove(name, versions.VersionFromString(version),
                          deps.ThawFlavor(flavor))
     if trv.verifyDigests():
         return
     logMe(3, "updating trove sigs: %s %s %s" % (name, version, flavor))
     trv.computeDigests()
     cu.execute(
         "delete from TroveInfo where instanceId = ? "
         "and infoType = ?", (instanceId, trove._TROVEINFO_TAG_SIGS))
     cu.execute(
         "insert into TroveInfo (instanceId, infoType, data) "
         "values (?, ?, ?)", (instanceId, trove._TROVEINFO_TAG_SIGS,
                              cu.binary(trv.troveInfo.sigs.freeze())))
示例#19
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
示例#20
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'
            )
示例#21
0
文件: sigtest.py 项目: tensor5/conary
    def testCookPackageCascade(self):
        fingerprint = '95B457D16843B21EA3FC73BBC7C32FC1F94E405E'
        self.makeSourceTrove('testcase', testRecipe)

        v = versions.VersionFromString('/localhost@rpl:linux/1.0-1-1')
        f = deps.parseFlavor('')
        repos = self.openRepository()

        signatureKey = self.cfg.signatureKey
        try:
            self.cfg.signatureKey = fingerprint

            built = self.cookItem(repos, self.cfg, 'testcase', ignoreDeps=True)

            # ensure components of cooked trove are also signed.
            trv = repos.getTrove('testcase:runtime', v, f)

            self.assertFalse(
                not trv.getSigs().digitalSigs.freeze(),
                "Component was not signed when package was cooked")

            self.assertFalse(
                trv.verifyDigitalSignatures() !=
                (openpgpfile.TRUST_TRUSTED, [], set()),
                "Bad digital signature for coponent of cooked package")
        finally:
            self.cfg.signatureKey = signatureKey
示例#22
0
    def testFileIdWrong(self):
        # create an absolute changeset
        cs = changeset.ChangeSet()

        # add a pkg diff
        flavor = deps.deps.parseFlavor('')
        v = versions.VersionFromString('/%s/1.0-1-1'
                                       %self.cfg.buildLabel.asString()).copy()
        v.resetTimeStamps()
        t = trove.Trove('test:test', v, flavor, None)
        path = self.workDir + '/blah'
        f = open(path, 'w')
        f.write('hello, world!\n')
        f.close()
        pathId = sha1helper.md5String('/blah')
        f = files.FileFromFilesystem(path, pathId)
        # add the file, but munge the fileid
        brokenFileId = ''.join(reversed(f.fileId()))
        cs.addFile(None, brokenFileId, f.freeze())
        t.addFile(pathId, '/blah', v, brokenFileId)
        t.computeDigests()

        diff = t.diff(None, absolute = 1)[0]
        cs.newTrove(diff)

        repos = self.openRepository()
        try:
            repos.commitChangeSet(cs)
            assert 0, "Integrity Error not raised"
        except errors.TroveIntegrityError, e:
            assert(str(e) == 'fileObj.fileId() != fileId in changeset for '
                             'pathId %s' % sha1helper.md5ToString(pathId))
示例#23
0
    def testInstances(self):
        cx = self.getDB()
        schema.createSchema(cx)
        cx.commit()
        v = versiontable.VersionTable(cx)
        f = flavors.Flavors(cx)
        it = items.Items(cx)
        item = it.addId('foo')
        version = v.addId(versions.VersionFromString('/c@r:d/1.0-1-1'))
        d = deps.parseDep('')
        flavor = f.get(d, None)

        idb = instances.InstanceTable(cx)
        idb.addId(item, version, flavor, clonedFromId=None, troveType=0)
        self.assertEqual(idb[(item, version, flavor)], 1)
        self.assertEqual(idb.getId(1), (item, version, flavor, 1))
        del idb

        idb = instances.InstanceTable(cx)
        self.assertEqual(idb[(item, version, flavor)], 1)
        cu = cx.cursor()
        cu.execute(
            "select isPresent, clonedFromId from instances where instanceid = 1"
        )
        row = cu.fetchall()[0]
        self.assertEqual(row[0], 1)
        self.assertEqual(row[1], None)
        idb.update(1, isPresent=0, clonedFromId=1)
        cu.execute(
            "select isPresent, clonedFromId from instances where instanceid = 1"
        )
        row = cu.fetchall()[0]
        self.assertEqual(row[0], 0)
        self.assertEqual(row[1], 1)
示例#24
0
    def getFactory(self, troveSpec, affinityTroves):
        """
        Return a string that describes this troveSpec's versionStr
        The string returned corresponds to a function name for sorting on
        that versionStr type.
        """
        name = troveSpec[0]
        versionStr = troveSpec[1]
        if not versionStr:
            labelPath = self._getLabelPath(troveSpec, self.queryOptions,
                                           affinityTroves, versionStr)
            if (not labelPath and not self.queryOptions.allowNoLabel
                    and not self.queryOptions.allowMissing):
                message = ("No search label path given and no label specified"
                           " for trove %s - set the installLabelPath" % name)
                raise errors.LabelPathNeeded(message)

            return QueryByLabelPathSetFactory, labelPath
        if isinstance(versionStr, versions.Version):
            return QueryByVersionSetFactory, versionStr
        elif isinstance(versionStr, versions.Branch):
            return QueryByBranchSetFactory, versionStr

        firstChar = versionStr[0]
        if firstChar == '/':
            try:
                version = versions.VersionFromString(versionStr)
            except errors.ParseError, e:
                raise errors.TroveNotFound, str(e)
            if isinstance(version, versions.Branch):
                return QueryByBranchSetFactory, version
            else:
                return QueryByVersionSetFactory, version
示例#25
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))
示例#26
0
 def _commitIdList(commitList):
     for n, vStr, fStr in commitList:
         v = versions.VersionFromString(vStr)
         f = deps.parseFlavor(fStr)
         yield (commitId, Items.getOrAddId(n),
                Versions.getOrAddId(v.asString()),
                Flavors.getOrAddId(f.freeze()))
示例#27
0
    def testSearchSourceStackSearchesOtherLabelsFirst(self):
        ss = self.getSearchSource()
        self.addComponent('foo:runtime=:branch/1-1-1')
        self.addComponent('foo:runtime=:branch/1-1-2')
        self.addComponent('foo:runtime=:branch/2-1-1')
        self.addComponent('foo:runtime=:linux/3-1-1')
        self.addComponent('foo:runtime=:linux/3-1-2')
        self.addComponent('foo:runtime=:linux/4-1-1')
        stack = searchsource.createSearchSourceStackFromStrings(ss,
                    ['localhost@rpl:1', 'foo:runtime=:branch/1-1-1'],
                    self.cfg.flavor)
        def _find(verStr):
            troveSpec = ('foo:runtime', verStr, None)
            results = stack.findTroves([troveSpec])
            assert(len(results[troveSpec]) == 1)
            return str(results[troveSpec][0][1].trailingRevision())

        assert(_find('localhost@rpl:branch') == '1-1-1')
        assert(_find('localhost@rpl:branch/1') == '1-1-1')
        assert(_find('localhost@rpl:branch/2') == '2-1-1')
        assert(_find('localhost@rpl:branch/1-1-2') == '1-1-2')
        assert(_find('@rpl:branch') == '1-1-1')
        assert(_find('@rpl:branch/1') == '1-1-1')
        assert(_find('@rpl:branch/1-1-1') == '1-1-1')
        assert(_find('@rpl:branch/1-1-2') == '1-1-2')
        assert(_find('@rpl:branch/2') == '2-1-1')
        assert(_find(':branch') == '1-1-1')
        assert(_find(':branch/1') == '1-1-1')
        assert(_find(':branch/2') == '2-1-1')
        assert(_find(':branch/1-1-1') == '1-1-1')
        assert(_find(':branch/1-1-2') == '1-1-2')
        assert(_find('localhost@') == '1-1-1')
        assert(_find('/localhost@rpl:branch') == '1-1-1')
        assert(_find('/localhost@rpl:branch/1-1-1') == '1-1-1')
        assert(_find('/localhost@rpl:branch/1-1-2') == '1-1-2')
        assert(_find('/localhost@rpl:branch/2-1-1') == '2-1-1')
        assert(_find(versions.VersionFromString('/localhost@rpl:branch')) == '1-1-1')
        assert(_find(versions.VersionFromString('/localhost@rpl:branch/1-1-1')) == '1-1-1')
        assert(_find(versions.VersionFromString('/localhost@rpl:linux')) == '4-1-1')
        assert(_find(versions.VersionFromString('/localhost@rpl:linux/4-1-1')) == '4-1-1')
        assert(_find('localhost@rpl:linux') == '4-1-1')

        try:
            _find('/localhost@rpl:branch//')
            assert(0)
        except errors.TroveNotFound, msg:
            assert(str(msg) == 'Error parsing version "/localhost@rpl:branch//": branch tag may not be empty')
示例#28
0
文件: cook.py 项目: pombreda/rmake
 def __thaw__(d):
     d = d.copy()
     new = CookResults(d.pop('name'),
                       versions.VersionFromString(d.pop('version')),
                       [ThawFlavor(x) for x in d.pop('flavorList')])
     new.__dict__.update(d)
     new.failureReason = thaw('FailureReason', new.failureReason)
     return new
示例#29
0
    def testTroveFilterNot(self):
        recipe = self.getRecipe()
        filt = -trovefilter.TroveFilter(recipe, name='foo')
        nvf = ('foo', versions.VersionFromString( \
                '/test.rpath.local@rpl:linux/1.1-2-1'), deps.parseFlavor(''))
        self.assertEquals(filt.match((nvf, )), False)
        nvf = ('bar', versions.VersionFromString( \
                '/test.rpath.local@rpl:linux/1.1-2-1'), deps.parseFlavor(''))
        self.assertEquals(filt.match((nvf, )), True)

        filt = ~trovefilter.TroveFilter(recipe, name='foo')
        nvf = ('foo', versions.VersionFromString( \
                '/test.rpath.local@rpl:linux/1.1-2-1'), deps.parseFlavor(''))
        self.assertEquals(filt.match((nvf, )), False)
        nvf = ('bar', versions.VersionFromString( \
                '/test.rpath.local@rpl:linux/1.1-2-1'), deps.parseFlavor(''))
        self.assertEquals(filt.match((nvf, )), True)
示例#30
0
    def testFindTrove(self):
        _, facade = self.prep()
        r = MockRepositoryClient()
        self.mock(
            conaryfacade.ConaryFacade, '_getRepositoryClient',
            lambda *args: mockedMethod(args[0], None, None, r, *args[1:]))
        # pointless to mock _getVersion and _getFlavor
        versionString = '/a@b:c/1.2.3-1'
        returnedTroveTup = facade._findTrove('foo:source', versionString)
        assert len(r.recordFindTroveArgs) == 1
        labelPath, troveTup = r.recordFindTroveArgs[0]
        name, versionObject, flavorObject = returnedTroveTup
        assert troveTup[1] == str(returnedTroveTup[1])
        assert labelPath is None
        assert name == 'foo:source'
        assert versionObject == versions.VersionFromString(versionString)
        assert flavorObject == deps.Flavor()

        r.recordFindTroveArgs = []
        returnedTroveTup = facade._findTrove('foo',
                                             '1.2.3-1-1',
                                             labelPath='a@b:c',
                                             flavor='bootstrap')
        assert len(r.recordFindTroveArgs) == 1
        labelPath, troveTup = r.recordFindTroveArgs[0]
        name, versionObject, flavorObject = returnedTroveTup
        # transformed due to labelPath:
        assert troveTup[1] != str(returnedTroveTup[1])
        assert labelPath == ('a@b:c', )
        assert name == 'foo'
        assert versionObject == versions.VersionFromString('/a@b:c/1.2.3-1-1')
        assert flavorObject == deps.parseFlavor('bootstrap')

        r.findTroves = lambda *args, **kw: {}
        returnedTroveTup = facade._findTrove('foo',
                                             '1.2.3-1-1',
                                             labelPath='a@b:c',
                                             flavor='bootstrap')
        assert (returnedTroveTup is None)

        def findTroves(*args, **kw):
            raise conaryerrors.LabelPathNeeded

        r.findTroves = findTroves
        self.assertRaises(errors.RbuildError, facade._findTrove, 'foo',
                          '1.2.3-1-1')