Exemple #1
0
    def testLocalLabelDeps(self):
        csPath = self.workDir + '/foo.ccs'
        csPath1 = self.workDir + '/foo1.ccs'
        csPath2 = self.workDir + '/foo2.ccs'

        self.addComponent('local:runtime',
                          'local@local:COOK',
                          changeSetFile=csPath)
        self.addComponent('local:debug',
                          'local@local:COOK',
                          changeSetFile=csPath1)
        pkg = self.addCollection('local=local@local:COOK',
                                 [':runtime', (':debug', False)],
                                 changeSetFile=csPath2)

        cs = changeset.ChangeSetFromFile(csPath)
        os.unlink(csPath)
        cs.merge(changeset.ChangeSetFromFile(csPath1))
        cs.merge(changeset.ChangeSetFromFile(csPath2))
        cs.setPrimaryTroveList([pkg.getNameVersionFlavor()])
        cs.writeToFile(csPath)

        self.updatePkg(self.rootDir, csPath)

        self.addComponent('foo:runtime=1.0', requires='trove: bar')
        self.addCollection('foo=1.0', [':foo'])
        self.assertRaises(update.DepResolutionFailure,
                          self._applyModel, [
                              'install local=%s' % pkg.getVersion(),
                              'install foo:runtime=%s' % self.cfg.buildLabel,
                          ],
                          addSearchLabel=True)
Exemple #2
0
    def testVerifyToFile(self):
        db = database.Database(self.rootDir, self.cfg.dbPath)
        os.chdir(self.workDir)

        user, group = self._getUserGroup()

        self.addComponent('foo:runtime',
                          '1.0',
                          fileContents=[('/foo',
                                         rephelp.RegularFile(owner=user,
                                                             group=group))])
        self.updatePkg('foo:runtime')

        s = verify.verify(['foo:runtime'],
                          db,
                          self.cfg,
                          changesetPath='foo.ccs')
        cs = changeset.ChangeSetFromFile('foo.ccs')
        assert (list(cs.iterNewTroveList()) == [])

        f = open(self.rootDir + '/foo', "a")
        f.write("mod")
        f.close()

        s = self.captureOutput(verify.verify, ['foo:runtime'],
                               db,
                               self.cfg,
                               changesetPath='foo.ccs')
        assert (not s[1])
        cs = changeset.ChangeSetFromFile('foo.ccs')
        assert (list(cs.iterNewTroveList())[0].getName() == 'foo:runtime')
Exemple #3
0
 def testTwoChangeSetsWithSameTroveAndDiffConfig(self):
     trv = self.addComponent('foo:run=1', [('/etc/config', 'v1\n')])
     trv2 = self.addComponent('foo:run=2', [('/etc/config', 'v2\n')])
     repos = self.openRepository()
     csPath = self.workDir + '/foo.ccs'
     csPath2 = self.workDir + '/foo.ccs'
     self.changeset(repos, 'foo:run=1--2', csPath)
     self.changeset(repos, 'foo:run=1--2', csPath2)
     cs1 = changeset.ChangeSetFromFile(csPath)
     cs2 = changeset.ChangeSetFromFile(csPath2)
     self.updatePkg('foo:run=1')
     db = self.openDatabase()
     source = ChangesetFilesTroveSource(db)
     source.addChangeSets([cs1, cs2], True)
     n, v, f = trv.getNameVersionFlavor()
     v2, f2 = trv2.getNameVersionFlavor()[1:]
     # this used to traceback when there were two changesets that both
     # provided the same trove in the same source, (if the changesets
     # were relative and involved a config file)
     newCs, remainder = source.createChangeSet([(n, (v, f),
                                                 (v2, f2), False)],
                                               withFiles=True,
                                               withFileContents=True,
                                               useDatabase=True)
     assert (not remainder)
Exemple #4
0
    def getChangeSets(self,
                      repos,
                      jobList,
                      withFiles=True,
                      withFileContents=True,
                      callback=None):
        for job in jobList:
            if job[1][0]:
                raise CacheError('can only cache install,'
                                 ' not update changesets')
            if job[3]:
                raise CacheError('Cannot cache absolute changesets')

        changesets = [None for x in jobList]
        needed = []
        for idx, job in enumerate(jobList):
            csHash = str(
                self.hashTrove(job[0], job[2][0], job[2][1], withFiles,
                               withFileContents))
            if self.store.hasFile(csHash):
                outFile = self.fileCache.open(self.store.hashToPath(csHash))
                #outFile = self.store.openRawFile(csHash)
                changesets[idx] = changeset.ChangeSetFromFile(outFile)
            else:
                needed.append((job, csHash, idx))

        total = len(needed)
        for idx, (job, csHash, csIndex) in enumerate(needed):
            if callback:
                callback.setChangesetHunk(idx + 1, total)

            cs = repos.createChangeSet([job],
                                       recurse=False,
                                       callback=callback,
                                       withFiles=withFiles,
                                       withFileContents=withFileContents)
            if self.readOnly:
                changesets[csIndex] = cs
                continue

            hashPath = self.store.hashToPath(csHash)
            self.store.makeDir(hashPath)
            dirPath = os.path.dirname(hashPath)
            fileName = os.path.basename(hashPath)
            tmpFd, tmpName = tempfile.mkstemp(prefix=fileName, dir=dirPath)
            os.close(tmpFd)
            cs.writeToFile(tmpName)
            del cs
            # we could use this changeset, but
            # cs.reset() is not necessarily reliable,
            # so instead we re-read from disk
            self.store.addFileFromTemp(csHash, tmpName)

            outFile = self.fileCache.open(self.store.hashToPath(csHash))
            #outFile = self.store.openRawFile(csHash)
            changesets[csIndex] = changeset.ChangeSetFromFile(outFile)

        return changesets
Exemple #5
0
def doUpdate(cfg, changeSpecs, **kwargs):
    callback = kwargs.get('callback', None)
    if not callback:
        callback = callbacks.UpdateCallback(trustThreshold=cfg.trustThreshold)
        kwargs['callback'] = callback
    else:
        callback.setTrustThreshold(cfg.trustThreshold)

    syncChildren = kwargs.get('syncChildren', False)
    syncUpdate = kwargs.pop('syncUpdate', False)
    restartInfo = kwargs.get('restartInfo', None)

    if syncChildren or syncUpdate:
        installMissing = True
    else:
        installMissing = False

    kwargs['installMissing'] = installMissing

    fromChangesets = []
    for path in kwargs.pop('fromFiles', []):
        cs = changeset.ChangeSetFromFile(path)
        fromChangesets.append(cs)

    kwargs['fromChangesets'] = fromChangesets

    # Look for items which look like files in the applyList and convert
    # them into fromChangesets w/ the primary sets
    for item in changeSpecs[:]:
        if os.access(item, os.R_OK):
            try:
                cs = changeset.ChangeSetFromFile(item)
            except:
                continue

            fromChangesets.append(cs)
            changeSpecs.remove(item)
            for troveTuple in cs.getPrimaryTroveList():
                changeSpecs.append(trovetup.TroveTuple(*troveTuple).asString())

    if kwargs.get('restartInfo', None):
        # We don't care about applyList, we will set it later
        applyList = None
    else:
        keepExisting = kwargs.get('keepExisting')
        updateByDefault = kwargs.get('updateByDefault', True)
        applyList = cmdline.parseChangeList(changeSpecs,
                                            keepExisting,
                                            updateByDefault,
                                            allowChangeSets=True)

    _updateTroves(cfg, applyList, **kwargs)
    # Clean up after ourselves
    if restartInfo:
        util.rmtree(restartInfo, ignore_errors=True)
Exemple #6
0
 def commitChangeSetFile(self, fName, mirror = False, callback = None,
                         hidden = False):
     # this could be more efficient. it rewrites the trove every time,
     # but it doesn't seem to be heavily used
     cs = changeset.ChangeSetFromFile(fName)
     self.commitChangeSet(cs, callback = callback, mirror = mirror,
                          hidden = hidden)
Exemple #7
0
    def testGroupChangeSet(self):
        repos = self.openRepository()
        os.chdir(self.workDir)
        self.addQuickTestComponent('test:runtime',
                                   '1.0',
                                   fileContents=['/usr/run1'])
        self.addQuickTestComponent('test:doc',
                                   '1.0',
                                   fileContents=['/usr/doc1'])
        self.addQuickTestCollection('test', '1.0',
                                    ['test:runtime', 'test:doc'])
        self.addQuickTestCollection('group-test', '1.0', ['test'])
        self.changeset(repos, ['group-test'], 'group-test.ccs', recurse=False)
        cs = changeset.ChangeSetFromFile('group-test.ccs')
        rc, res = self.captureOutput(displayChangeSet, None, cs, [], self.cfg)
        assert (res == 'group-test=1.0-1-1\n')
        rc, res = self.captureOutput(displayChangeSet,
                                     None,
                                     cs, [],
                                     self.cfg,
                                     ls=True,
                                     alwaysDisplayHeaders=True,
                                     recurseRepos=True)
        assert (res == '''\
group-test=1.0-1-1
  test=1.0-1-1
    test:doc=1.0-1-1
      /usr/doc1
    test:runtime=1.0-1-1
      /usr/run1
''')
Exemple #8
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)
Exemple #9
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'])
Exemple #10
0
 def testBadChangeset(self):
     csFile = self.workDir + '/foo.ccs'
     try:
         changeset.ChangeSetFromFile(csFile)
     except errors.ConaryError, err:
         assert (str(err) ==
                 "Error opening changeset '%s': No such file or directory" %
                 csFile)
Exemple #11
0
 def testBadChangeSet(self):
     csPath = self.workDir + '/test.ccs'
     open(csPath, "w").write("some junk")
     try:
         changeset.ChangeSetFromFile(csPath)
     except errors.ConaryError, e:
         assert(str(e) == 'File %s is not a valid conary changeset.' %
                     csPath)
Exemple #12
0
    def testLocalFactoryWithLocalRecipe(self):
        os.chdir(self.workDir)
        self.newpkg("foo", factory="test")
        os.chdir("foo")
        self.writeFile(
            "factory-test.recipe", """
class TestFactory(Factory):

    name = "factory-test"
    version = "1.0"

    def getRecipeClass(self):
        class TestSubclass(PackageRecipe):
            name = "testsubclass"
            version = "1.0"
            internalAbstractBaseClass = True
            clearBuildReqs()

        return TestSubclass
""")

        self.writeFile(
            "foo.recipe", """
# CNY-2813. importing log inside a recipe used to reset the loglevel
from conary.lib import log
class FooRecipe(FactoryRecipeClass):

    name = "foo"
    version = "1.1"

    def setup(self):
        self.Create("/etc/foo", "foo")
""")

        self.addfile("foo.recipe")
        repos = self.openRepository()
        cstate = state.ConaryStateFromFile('CONARY')
        level = log.getVerbosity()
        try:
            log.setVerbosity(log.INFO)
            klass = logging.getLoggerClass()
            self.discardOutput(cook.cookCommand, self.cfg, [cstate], False, {})
            self.assertEquals(klass, logging.getLoggerClass())
        finally:
            log.setVerbosity(level)
        ccs = changeset.ChangeSetFromFile(
            os.path.join(self.workDir, 'foo', 'foo-1.1.ccs'))
        trvs = [trove.Trove(x) for x in ccs.iterNewTroveList()]
        trv = [x for x in trvs if x.getName() == 'foo:debuginfo'][0]
        files = [x for x in trv.iterFileList() if \
                x[1] == '/usr/src/debug/buildlogs/foo-1.1-log.bz2']
        fileId, path, pathId, ver = files[0]
        fileInfo, fileObj = ccs.getFileContents(fileId, pathId)
        decomp = bz2.BZ2Decompressor()
        data = decomp.decompress(fileObj.f.read())
        self.assertFalse("+ Processing" not in data,
                         "build log data appears to be incomplete")
Exemple #13
0
def doLocalCommit(db, changeSetFile):
    cs = changeset.ChangeSetFromFile(changeSetFile)
    if not cs.isLocal():
        log.error("repository changesets must be applied with update instead")
    else:
        db.commitChangeSet(cs,
                           database.UpdateJob(db),
                           rollbackPhase=db.ROLLBACK_PHASE_LOCAL,
                           updateDatabase=False)
Exemple #14
0
    def testChangeSetFromFile(self):
        # ensure that absolute changesets that are read from disk
        # that contain config files write out changesets to a file
        # that do not change the file type to a diff.
        # set up a file with some contents
        cont = self.workDir + '/contents'
        f = open(cont, 'w')
        f.write('hello, world!\n')
        f.close()
        pathId = sha1helper.md5FromString('0' * 32)
        f = files.FileFromFilesystem(cont, pathId)
        f.flags.isConfig(1)

        # create an absolute changeset
        cs = changeset.ChangeSet()

        # add a pkg diff
        v = versions.VersionFromString('/localhost@rpl:devel/1.0-1-1',
                                       timeStamps=[1.000])
        flavor = deps.parseFlavor('')
        t = trove.Trove('test', v, flavor, None)
        t.addFile(pathId, '/contents', v, f.fileId())
        diff = t.diff(None, absolute=1)[0]
        cs.newTrove(diff)

        # add the file and file contents
        cs.addFile(None, f.fileId(), f.freeze())
        cs.addFileContents(pathId, f.fileId(), changeset.ChangedFileTypes.file,
                           filecontents.FromFilesystem(cont),
                           f.flags.isConfig())

        # write out the changeset
        cs.writeToFile(self.workDir + '/foo.ccs')
        # read it back in
        cs2 = changeset.ChangeSetFromFile(self.workDir + '/foo.ccs')
        # write it out again (there was a bug where all config files
        # became diffs)
        cs2.writeToFile(self.workDir + '/bar.ccs')
        # read it again
        cs3 = changeset.ChangeSetFromFile(self.workDir + '/bar.ccs')
        # verify that the file is a file, not a diff
        ctype, contents = cs3.getFileContents(pathId, f.fileId())
        assert (ctype == changeset.ChangedFileTypes.file)
Exemple #15
0
 def testEraseChangeSet(self):
     db = database.Database(self.rootDir, self.cfg.dbPath)
     self.repos = self.openRepository()
     self.addTestPkg(1, content='r.Create("%(thisdocdir)s/README")')
     self.cookTestPkg(1)
     os.chdir(self.workDir)
     cscmd.ChangeSetCommand(self.cfg, ['test1=1.0--'], 'test.ccs')
     cs = changeset.ChangeSetFromFile('test.ccs')
     rc, res = self.captureOutput(displayChangeSet, db, cs, ['test1=1.0'],
                                  self.cfg)
     assert (res == 'Erase   test1=1.0-1-1\n')
Exemple #16
0
    def testChangeSetFromFileSetsFilename(self):
        repos = self.openRepository()
        self.addComponent('foo:run', '1')
        self.addCollection('foo', '1', [':run'])
        csname = os.path.join(self.workDir, "changeset-lazyFileCache.ccs")
        self.changeset(repos, 'foo', csname)

        self.assertTrue(os.path.exists(csname))
        lfc = util.LazyFileCache()
        cs = changeset.ChangeSetFromFile(lfc.open(csname))
        self.assertEqual(cs.fileName, csname)
Exemple #17
0
    def testPerlReqs(self):
        self.openRmakeRepository()
        repos = self.openRepository()

        trvname = "perl-dummy"

        perl = self.addComponent('perl:lib', provides='perl: CGI perl: strict')
        trv = self.makeSourceTrove(trvname, testPerlRecipe)

        troveTup = repos.findTrove(self.cfg.buildLabel,
                                   (trvname + ':source', None, None), None)[0]

        cookFlavor = deps.parseFlavor('readline,ssl,X')
        troveTup = (troveTup[0], troveTup[1], cookFlavor)

        db = self.openRmakeDatabase()
        job = self.newJob(troveTup)
        buildTrove = buildtrove.BuildTrove(job.jobId, *troveTup)
        buildTrove.setPublisher(job.getPublisher())

        logFile = logfile.LogFile(self.workDir + '/chrootlog')
        logFile.redirectOutput()
        mgr, factory, cfg, client = self._createRoot([perl],
                                                     buildTrove,
                                                     start=True)
        logPath = client.buildTrove(cfg, cfg.getTargetLabel(troveTup[1]),
                                    *troveTup)
        result = client.checkResults(wait=20, *troveTup)
        client.stop()
        logFile.restoreOutput()

        assert (result)
        assert (result.isBuildSuccess())
        cs = changeset.ChangeSetFromFile(result.getChangeSetFile())

        trvHash = {}
        for trv in cs.iterNewTroveList():
            trvHash[trv.getName()] = trv

        # this also checks to make sure build logging is turned on
        if len(trvHash) < 3:
            raise RuntimeError('logging turned off!')
        self.failUnless(trvname in trvHash)
        self.failUnless(trvname + ':data' in trvHash)
        self.failUnless(trvname + ':debuginfo' in trvHash)

        trv = trvHash[trvname + ':data']

        dps = [(d[0].tagName, d[1].getName())
               for d in trv.getRequires().iterDeps()]

        dps.sort()
        self.failUnlessEqual(dps, [('perl', ('CGI', )),
                                   ('perl', ('strict', ))])
Exemple #18
0
def _getChangeSet(path):
    try:
        cs = changeset.ChangeSetFromFile(path)
    except BadContainer, msg:
        # ensure that it is obvious that a file is being referenced
        if path[0] not in './':
            path = './' + path
        log.error("'%s' is not a valid conary changeset: %s" % (path, msg))
        # XXX sys.exit is gross
        import sys
        sys.exit(1)
Exemple #19
0
    def testUpdateNonRecursedCollectionFromChangeset(self):
        self.addQuickTestComponent("test:runtime", '1.0')
        self.addQuickTestCollection("test", '1.0', [':runtime'])

        repos = self.openRepository()
        path = self.workDir + '/test.ccs'
        self.changeset(repos, ['test'], path, recurse=False)
        cs = changeset.ChangeSetFromFile(path)
        self.checkUpdate(['test'], 
                         ['test', 'test:runtime'], 
                         fromChangesets=[cs])
Exemple #20
0
 def testRedirectToFile(self):
     repos = self.openRepository()
     os.chdir(self.workDir)
     self.addComponent('redirect:runtime', '1.0')
     self.addCollection('redirect', '1.0', [':runtime'])
     self.addComponent('test:runtime', '1.0')
     self.addCollection('test', '1.0', [':runtime'])
     self.writeFile('redirect.recipe', redirectRecipe)
     built, str = self.captureOutput(self.cookItem, repos, self.cfg,
                                     'redirect.recipe')
     cs = changeset.ChangeSetFromFile('redirect-1.0.ccs')
     assert (len(cs.getPrimaryTroveList()) == 1)
Exemple #21
0
 def testCommitToFile(self):
     self.openRepository()
     self.openRmakeRepository()
     jobId = fixtures.addBuiltJob1(self)
     client = self.startRmakeServer()
     helper = self.getRmakeHelper(client.uri)
     changesetPath = self.workDir + '/commit.ccs'
     rc, txt = self.captureOutput(helper.commitJob,
                                  jobId,
                                  writeToFile=changesetPath)
     cs = changeset.ChangeSetFromFile(changesetPath)
     for trvCs in cs.iterNewTroveList():
         assert (trvCs.getNewVersion().getHost() == 'localhost')
Exemple #22
0
    def testVerifyAll(self):
        os.chdir(self.workDir)
        self.addComponent('foo:runtime', '1.0', fileContents=['/bin/b'])
        self.addComponent('bar:lib', '1.0', fileContents=['/lib/l'])
        self.addCollection('foo', [':runtime'])
        self.addCollection('bar', [':lib'])
        db = database.Database(self.rootDir, self.cfg.dbPath)
        self.updatePkg('foo')
        self.updatePkg('bar')

        verify.verify([], db, self.cfg, all=True, changesetPath='foo.ccs')
        cs = changeset.ChangeSetFromFile('foo.ccs')
        assert (sorted([x.getName() for x in cs.iterNewTroveList()
                        ]) == ['bar:lib', 'foo:runtime'])
Exemple #23
0
    def _cookPkgs(self,
                  recipestr,
                  filename,
                  pkgname,
                  builtpkgnames=None,
                  macros={},
                  updatePackage=False):
        repos = self.openRepository()
        recipename = pkgname + '.recipe'
        ccsname = pkgname + '.ccs'

        if builtpkgnames is None:
            builtpkgnames = [pkgname]

        origDir = os.getcwd()
        try:
            os.chdir(self.workDir)
            if updatePackage:
                self.checkout(pkgname)
            else:
                self.newpkg(pkgname)
            os.chdir(pkgname)
            self.writeFile(recipename, recipestr)
            if not updatePackage:
                self.addfile(recipename)

            if isinstance(filename, types.StringType):
                filenames = [filename]
            else:
                filenames = filename

            for filename in filenames:
                shutil.copyfile(resources.get_archive() + '/' + filename,
                                filename)
                self.addfile(filename)

            self.commit()

            built, out = self.cookItem(repos, self.cfg, pkgname, macros=macros)

            self.changeset(repos, builtpkgnames, ccsname)
            cs = changeset.ChangeSetFromFile(ccsname)
        finally:
            os.chdir(origDir)

        return (sorted([x.getName()
                        for x in cs.iterNewTroveList()]), built, cs)
Exemple #24
0
    def testNewFileOwnership(self):
        # make sure files found with --new-files get assigned to the right
        # troves
        user, group = self._getUserGroup()

        self.addComponent('foo:bin=0',
                          fileContents=[('/bin',
                                         rephelp.Directory(
                                             owner=user,
                                             group=group,
                                         ))])
        self.addComponent('foo:lib=1',
                          fileContents=[('/lib',
                                         rephelp.Directory(
                                             owner=user,
                                             group=group,
                                         ))])

        self.updatePkg(['foo:bin', 'foo:lib'])
        db = self.openDatabase()
        self.writeFile(self.rootDir + '/bin/new', 'newtext\n')
        self.writeFile(self.rootDir + '/lib/new', 'newtext\n')
        self.writeFile(self.rootDir + '/rootfile', 'newtext\n')

        os.chdir(self.workDir)
        verify.verify([],
                      db,
                      self.cfg,
                      all=True,
                      newFiles=True,
                      changesetPath='foo.ccs')
        cs = changeset.ChangeSetFromFile('foo.ccs')

        trvCsByName = dict((x.getName(), x) for x in cs.iterNewTroveList())
        self.assertEquals(
            [x[1] for x in trvCsByName['foo:bin'].getNewFileList()],
            ['/bin/new'])
        self.assertEquals(
            [x[1] for x in trvCsByName['foo:lib'].getNewFileList()],
            ['/lib/new'])
        self.assertEquals(
            [x[1] for x in trvCsByName['@new:files'].getNewFileList()],
            ['/rootfile'])
Exemple #25
0
    def testPartialChangeSet(self):
        db = database.Database(self.rootDir, self.cfg.dbPath)
        self.repos = self.openRepository()
        self.addTestPkg(1, content='r.Create("%(thisdocdir)s/README")')
        self.cookTestPkg(1)
        self.cfg.configLine('excludeTroves .*:runtime')
        os.chdir(self.workDir)
        cscmd.ChangeSetCommand(self.cfg, ['test1'], 'test.ccs')
        cs = changeset.ChangeSetFromFile('test.ccs')
        rc, res = self.captureOutput(displayChangeSet,
                                     None,
                                     cs, ['test1=1.0-1-1'],
                                     self.cfg,
                                     showTroves=True)

        assert (res == '''\
test1=1.0-1-1
  test1:runtime=1.0-1-1
''')
Exemple #26
0
    def testReset(self):

        class UncloseableFile(StringIO.StringIO):

            def close(self):
                assert(0)

        # Make sure writing a changeset doesn't close the filecontent objects
        # inside of it.
        otherCs = changeset.ChangeSet()
        otherCs.addFileContents("0pathId", "0fileId",
                                changeset.ChangedFileTypes.file,
                                filecontents.FromFile(UncloseableFile("foo")),
                                1)
        otherCs.addFileContents("1pathId", "1fileId",
                                changeset.ChangedFileTypes.file,
                                filecontents.FromFile(UncloseableFile("foo")),
                                0)
        otherCs.writeToFile(self.workDir + "/test1.ccs")

        cs = changeset.ReadOnlyChangeSet()
        cs.merge(otherCs)
        cs.writeToFile(self.workDir + "/test2.ccs")
        assert(open(self.workDir + "/test1.ccs").read() ==
              (open(self.workDir + "/test2.ccs").read()))

        cs.reset()
        cs.writeToFile(self.workDir + "/test3.ccs")
        assert(open(self.workDir + "/test1.ccs").read() ==
              (open(self.workDir + "/test3.ccs").read()))

        otherCs = changeset.ChangeSetFromFile(self.workDir + "/test1.ccs")
        cs1 = changeset.ReadOnlyChangeSet()
        cs1.merge(otherCs)

        otherCs.reset()
        cs2 = changeset.ReadOnlyChangeSet()
        cs2.merge(otherCs)

        assert([ x[0] for x in cs1.fileQueue ] ==
                    [ x[0] for x in cs2.fileQueue ])
        assert(cs1.configCache == cs2.configCache)
Exemple #27
0
    def testCreateChangeSet(self):
        self.addQuickTestComponent('test:runtime', '1.0-1-1')
        self.addQuickTestCollection('test', '1.0-1-1', ['test:runtime'])
        self.addQuickTestCollection('group-test', '1.0-1-1',
                                    # byDefault = False
                                    [('test', None, None, False)])
        repos = self.openRepository()
        csPath = self.workDir + '/group-test.ccs'
        self.changeset(repos, ['group-test'], csPath)

        # make sure x bit isn't set
        assert(os.stat(csPath).st_mode & 0111 == 0)

        cs = changeset.ChangeSetFromFile(csPath)

        # make sure the byDefault False troves are not in the changeset.
        assert(set([x.getName() for x in cs.iterNewTroveList()])
                                                    == set(['group-test']))

        # make sure this changeset is installable
        self.updatePkg(self.rootDir, [csPath])
Exemple #28
0
    def load(self, path):
        assert (not self.cache and not self.depCache)
        try:
            cs = changeset.ChangeSetFromFile(path)
        except filecontainer.BadContainer:
            log.warning('trove cache %s was corrupt, ignoring' % path)
            return
        except (IOError, errors.ConaryError):
            return

        for trvCs in cs.iterNewTroveList():
            trv = trove.Trove(trvCs, skipIntegrityChecks=True)
            self.cache[trv.getNameVersionFlavor()] = trv

        self._cached(self.cache.keys(), [x[1] for x in self.cache.values()])

        try:
            # NB: "fileid" and pathid got reversed here by mistake, try not to
            # think too hard about it.
            contType, depContents = cs.getFileContents(
                self._fileId, self._troveCacheVersionPathId)
        except KeyError:
            self.version = (0, 0)
        else:
            versionList = depContents.get().read().split(' ')
            self.version = (int(versionList[0]), int(versionList[1]))

        if self.version[0] > self.VERSION[0]:
            # major number is too big for us; we can't load this
            return

        # Timestamps must come first because some other caches use it to
        # construct versions.
        self._cs = cs
        self._loadTimestamps()
        self._loadDeps()
        self._loadDepSolutions()
        self._loadFileCache()
        self._startingSizes = self._getSizeTuple()
        self._cs = None
Exemple #29
0
    def testHashCheck(self):
        # by default, we trust the size/date timestamps
        repos = self.openRepository()
        db = database.Database(self.rootDir, self.cfg.dbPath)
        os.chdir(self.workDir)

        user, group = self._getUserGroup()
        trv = self.addComponent('foo:runtime',
                                fileContents=[
                                    ('/a',
                                     rephelp.RegularFile(contents='1234',
                                                         owner=user,
                                                         group=group))
                                ])
        fileInfo = trv.iterFileList().next()
        self.updatePkg('foo:runtime')

        f = open(self.rootDir + '/a', "w")
        f.write('abcd')
        f.close()

        f = repos.getFileVersions([(fileInfo[0], fileInfo[2], fileInfo[3])])[0]
        st = os.stat(self.rootDir + '/a')
        os.utime(self.rootDir + '/a', (f.inode.mtime(), f.inode.mtime()))

        s = self.captureOutput(verify.verify, ['foo:runtime'],
                               db,
                               self.cfg,
                               changesetPath='foo.ccs')
        assert (not s[1])

        verify.verify(['foo:runtime'],
                      db,
                      self.cfg,
                      forceHashCheck=True,
                      changesetPath='foo.ccs')
        cs = changeset.ChangeSetFromFile('foo.ccs')
        assert (cs.files)
Exemple #30
0
 def testExactFlavor(self):
     self.addComponent('foo:run[~ssl]')
     repos = self.openRepository()
     csPath = self.workDir + '/foo.ccs'
     self.changeset(repos, ['foo:run'], csPath)
     cs = changeset.ChangeSetFromFile(csPath)
     self.assertRaises(errors.TroveNotFound,
                       displayChangeSet,
                       None,
                       cs, ['foo:run[ssl]'],
                       self.cfg,
                       exactFlavors=True)
     self.assertRaises(errors.TroveNotFound,
                       displayChangeSet,
                       None,
                       cs, ['foo:run'],
                       self.cfg,
                       exactFlavors=True)
     self.captureOutput(displayChangeSet,
                        None,
                        cs, ['foo:run[~ssl]'],
                        self.cfg,
                        exactFlavors=True)