Пример #1
0
    def refreshFromDatabase(self, userTagDir=None):
        """
        load product information directly from the database files on disk,
        overwriting any previous information.  If userTagDir is provided,
        user tag assignments will be explicitly loaded into the stack 
        (otherwise, the stack may not have user tags in it).
        """
        db = Database(self.dbpath, userTagDir)

        # forget!
        self.lookup = {}

        for prodname in db.findProductNames():
            for product in db.findProducts(prodname):
                self.addProduct(product)
Пример #2
0
    def refreshFromDatabase(self, userTagDir=None):
        """
        load product information directly from the database files on disk,
        overwriting any previous information.  If userTagDir is provided,
        user tag assignments will be explicitly loaded into the stack
        (otherwise, the stack may not have user tags in it).
        """
        db = Database(self.dbpath, userTagDir)

        # forget!
        self.lookup = {}

        for prodname in db.findProductNames():
            for product in db.findProducts(prodname):
                self.addProduct(product)
Пример #3
0
class DatabaseTestCase(unittest.TestCase):
    def setUp(self):
        self.dbpath = os.path.join(testEupsStack, "ups_db")
        self.userdb = os.path.join(testEupsStack, "user_ups_db")
        if not os.path.exists(self.userdb):
            os.makedirs(self.userdb)

        self.db = Database(self.dbpath, self.userdb)

        self.pycur = os.path.join(self.dbpath, "python", "current.chain")
        if os.path.isfile(self.pycur + ".bak"):
            os.rename(self.pycur + ".bak", self.pycur)

    def tearDown(self):
        if os.path.isfile(self.pycur + ".bak"):
            os.rename(self.pycur + ".bak", self.pycur)

        if os.path.exists(self.userdb) and self.userdb.endswith("user_ups_db"):

            os.system("rm -rf " + self.userdb)

    def testFindProductNames(self):
        prods = self.db.findProductNames()
        self.assertEquals(len(prods), 6)
        expected = "cfitsio tcltk eigen mpich2 python doxygen".split()
        for p in expected:
            self.assert_(p in prods)

    def testFindVersions(self):
        vers = self.db.findVersions("goober")
        self.assertEquals(len(vers), 0)

        vers = self.db.findVersions("doxygen")
        self.assertEquals(len(vers), 2)
        expected = "1.5.7.1 1.5.9".split()
        for v in expected:
            self.assert_(v in vers)

    def testFindFlavors(self):
        flavs = self.db.findFlavors("doxygen")
        self.assertEquals(len(flavs), 2)
        expected = "Linux Linux64".split()
        for f in expected:
            self.assert_(f in flavs)

        flavs = self.db.findFlavors("doxygen", "1.5.9")
        self.assertEquals(len(flavs), 1)
        expected = "Linux64".split()
        for f in expected:
            self.assert_(f in flavs)

        flavs = self.db.findFlavors("doxygen", "1.5.10")
        self.assertEquals(len(flavs), 0)

    def testFindTags(self):
        self.assertRaises(ProductNotFound, self.db.findTags, "goober", "1.5.9",
                          "Linux64")

        tags = self.db.findTags("doxygen", "1.5.10", "Linux64")
        self.assertEquals(len(tags), 0)

        tags = self.db.findTags("doxygen", "1.5.9", "Linux64")
        self.assertEquals(len(tags), 0)

        tags = self.db.findTags("doxygen", "1.5.7.1", "Linux")
        self.assertEquals(len(tags), 1)
        self.assertEquals(tags[0], "current")

    def testFindProduct(self):
        prod = self.db.findProduct("doxygen", "1.5.9", "Linux")
        self.assert_(prod is None)

        prod = self.db.findProduct("doxygen", "1.5.10", "Linux")
        self.assert_(prod is None)

        prod = self.db.findProduct("goober", "1.5.10", "Linux")
        self.assert_(prod is None)

        prod = self.db.findProduct("doxygen", "1.5.9", "Linux64")
        self.assert_(prod is not None)
        self.assertEquals(prod.name, "doxygen")
        self.assertEquals(prod.version, "1.5.9")
        self.assertEquals(prod.flavor, "Linux64")
        self.assertEquals(prod.db, os.path.join(testEupsStack, "ups_db"))
        self.assertEquals(
            prod.dir,
            "/lsst/DC3/stacks/gcc433/04jun/Linux64/external/doxygen/1.5.9")
        self.assertEquals(
            prod.tablefile,
            "/lsst/DC3/stacks/gcc433/04jun/Linux64/external/doxygen/1.5.9/ups/doxygen.table"
        )
        self.assertEquals(len(prod.tags), 0)

        prod = self.db.findProduct("doxygen", "1.5.7.1", "Linux")
        self.assert_(prod is not None)
        self.assertEquals(prod.name, "doxygen")
        self.assertEquals(prod.version, "1.5.7.1")
        self.assertEquals(prod.flavor, "Linux")
        self.assertEquals(prod.db, os.path.join(testEupsStack, "ups_db"))
        self.assertEquals(
            prod.dir,
            "/home/rplante/wrk/NCSA/LSST/devlp/stacks/21mar/Linux/external/doxygen/1.5.7.1"
        )
        self.assertEquals(prod.tablefile, "none")
        self.assertEquals(len(prod.tags), 1)
        self.assertEquals(prod.tags[0], "current")

        # test correct formation of table file path
        prod = self.db.findProduct("python", "2.5.2", "Linux")
        self.assertEquals(prod.name, "python")
        self.assertEquals(prod.version, "2.5.2")
        self.assertEquals(prod.flavor, "Linux")
        self.assertEquals(prod.db, os.path.join(testEupsStack, "ups_db"))
        self.assert_(
            prod.tablefile.endswith("Linux/python/2.5.2/ups/python.table"))
        self.assert_(os.path.exists(prod.tablefile))

        # test autonormalization of product install directories.
        # The install directory (PROD_DIR) for this python is given
        # as a relative directory
        prod = self.db.findProduct("python", "2.5.2", "Linux")
        self.assert_(prod is not None)
        self.assertEquals(prod.name, "python")
        self.assertEquals(prod.version, "2.5.2")
        self.assertEquals(prod.flavor, "Linux")
        self.assertEquals(prod.db, os.path.join(testEupsStack, "ups_db"))
        expect_pdir = os.path.join(testEupsStack, "Linux/python/2.5.2")
        self.assertEquals(prod.dir, expect_pdir)
        expect_tfile = os.path.join(expect_pdir, "ups", "python.table")
        self.assertEquals(prod.tablefile, expect_tfile)

    def testFindProducts(self):
        prods = self.db.findProducts("doxygen")
        self.assertEquals(len(prods), 2)
        prod = filter(lambda d: d.version == "1.5.7.1", prods)[0]
        self.assertEquals(len(prod.tags), 1)
        self.assertEquals(prod.tags[0], "current")

        prods = self.db.findProducts("cfitsio")
        self.assertEquals(len(prods), 1)

        prods = self.db.findProducts("doxygen", flavors="Linux64")
        self.assertEquals(len(prods), 1)
        self.assertEquals(prods[0].version, "1.5.9")

        prods = self.db.findProducts("doxygen", "1.5.7.1")
        self.assertEquals(len(prods), 1)

    def testIsDeclared(self):
        self.assert_(self.db.isDeclared("doxygen"))
        self.assert_(self.db.isDeclared("doxygen", "1.5.9"))
        self.assert_(self.db.isDeclared("doxygen", "1.5.7.1"))
        self.assert_(self.db.isDeclared("doxygen", "1.5.9", "Linux64"))
        self.assert_(self.db.isDeclared("doxygen", flavor="Linux64"))
        self.assert_(self.db.isDeclared("doxygen", flavor="Linux"))
        self.assert_(not self.db.isDeclared("goober"))
        self.assert_(not self.db.isDeclared("goober", "1.0"))
        self.assert_(not self.db.isDeclared("doxygen", "1.5.10"))
        self.assert_(not self.db.isDeclared("doxygen", "1.5.9", "Linux"))

    def testUserTag(self):
        vers = self.db.getTaggedVersion("user:my", "python", "Linux")
        self.assert_(vers is None)

        self.db.assignTag("user:my", "python", "2.5.2")
        vers = self.db.getTaggedVersion("user:my", "python", "Linux")
        self.assertEquals(vers, "2.5.2")
        self.assert_(
            os.path.exists(os.path.join(self.userdb, "python", "my.chain")))

        tags = self.db.findTags("python", "2.5.2", "Linux")
        ntag = 2
        self.assertEquals(len(tags), ntag)
        self.assertEquals(tags.count("current"), 1)
        self.assertEquals(tags.count("user:my"), 1)

        prods = self.db.findProducts("python", "2.5.2")
        self.assertEquals(len(prods), 1)
        self.assertEquals(len(prods[0].tags), 2)
        self.assertEquals(tags[0], "current")
        self.assertEquals(tags[1], "user:my")

        self.db.unassignTag("user:my", "python")
        vers = self.db.getTaggedVersion("user:my", "python", "Linux")
        self.assert_(vers is None)
        self.assert_(not os.path.exists(
            os.path.join(self.userdb, "python", "my.chain")))

    def testAssignTag(self):
        if not os.path.exists(self.pycur + ".bak"):
            shutil.copyfile(self.pycur, self.pycur + ".bak")

        vers = self.db.getTaggedVersion("current", "python", "Linux")
        self.assertEquals(vers, "2.5.2")
        self.assertRaises(ProductNotFound, self.db.assignTag, "current",
                          "python", "2.7")

        self.db.assignTag("current", "python", "2.6")
        self.assertEquals(
            self.db.getTaggedVersion("current", "python", "Linux"), "2.6")
        self.db.assignTag("current", "python", "2.5.2")
        self.assertEquals(
            self.db.getTaggedVersion("current", "python", "Linux"), "2.5.2")

        tfile = self.db._tagFile("python", "stable")
        if os.path.exists(tfile): os.remove(tfile)
        try:
            self.db.assignTag("stable", "python", "2.6")
            self.assertEquals(
                self.db.getTaggedVersion("stable", "python", "Linux"), "2.6")
            self.db.unassignTag("stable", "python", "Linux")
            self.assert_(not os.path.exists(tfile))
        except:
            if os.path.exists(tfile): os.remove(file)
            raise

        tfile = self.db._tagFile("doxygen", "beta")
        if os.path.exists(tfile): os.remove(tfile)
        try:
            self.db.assignTag("beta", "doxygen", "1.5.9")
            self.db.assignTag("beta", "doxygen", "1.5.7.1")
            self.assertEquals(
                self.db.getTaggedVersion("beta", "doxygen", "Linux64"),
                "1.5.9")
            self.assertEquals(
                self.db.getTaggedVersion("beta", "doxygen", "Linux"),
                "1.5.7.1")
            self.db.unassignTag("beta", "doxygen", "Linux64")
            self.assertEquals(
                self.db.getTaggedVersion("beta", "doxygen", "Linux"),
                "1.5.7.1")
            self.assertEquals(
                self.db.getTaggedVersion("beta", "doxygen", "Linux64"), None)
            self.db.assignTag("beta", "doxygen", "1.5.9")
            self.db.unassignTag("beta", "doxygen", "Linux")
            self.assertEquals(
                self.db.getTaggedVersion("beta", "doxygen", "Linux64"),
                "1.5.9")
            self.assertEquals(
                self.db.getTaggedVersion("beta", "doxygen", "Linux"), None)
            self.db.assignTag("beta", "doxygen", "1.5.7.1")
            self.db.unassignTag("beta", "doxygen")
            self.assert_(not os.path.exists(tfile))
        except:
            if os.path.exists(tfile): os.remove(tfile)
            raise

        os.rename(self.pycur + ".bak", self.pycur)

    def testDeclare(self):
        pdir = self.db._productDir("base")
        if os.path.isdir(pdir):
            map(
                lambda r: os.remove(r),
                filter(lambda f: os.path.isfile(f),
                       map(lambda p: os.path.join(pdir, p), os.listdir(pdir))))
            os.removedirs(pdir)
        try:
            self.assert_(not os.path.exists(pdir))
            baseidir = os.path.join(testEupsStack, "Linux/base/1.0")
            base = Product("base",
                           "1.0",
                           "Linux",
                           baseidir,
                           os.path.join(baseidir, "ups/base.table"),
                           tags=["current"])
            self.db.declare(base)
            self.assert_(os.path.isdir(pdir))
            self.assert_(os.path.isfile(os.path.join(pdir, "1.0.version")))
            self.assert_(os.path.isfile(os.path.join(pdir, "current.chain")))
            prods = self.db.findProducts("base")
            self.assertEquals(len(prods), 1)
            self.assertEquals(prods[0].name, "base")
            self.assertEquals(prods[0].version, "1.0")
            self.assertEquals(prods[0].flavor, "Linux")
            self.assertEquals(prods[0].dir, baseidir)
            self.assertEquals(prods[0].tablefile,
                              os.path.join(baseidir, "ups/base.table"))
            self.assertEquals(len(prods[0].tags), 1)
            self.assertEquals(prods[0].tags[0], "current")

            base2 = prods[0].clone()
            base2.version = "2.0"
            base2.tags = []
            self.db.declare(base2)
            self.assertEquals(
                self.db.getTaggedVersion("current", "base", "Linux"), "1.0")
            base3 = prods[0].clone()
            base3.version = "3.0"
            self.db.declare(base3)
            self.assertEquals(
                self.db.getTaggedVersion("current", "base", "Linux"), "3.0")

            self.assertEquals(len(self.db.findProducts("base")), 3)

            self.db.undeclare(base)
            self.assertEquals(self.db.findProduct("base", "1.0", "Linux"),
                              None)
            self.assertEquals(len(self.db.findProducts("base")), 2)
            self.assert_(not os.path.exists(os.path.join(pdir, "1.0.version")))

            self.db.undeclare(base3)
            self.assertEquals(self.db.findProduct("base", "3.0", "Linux"),
                              None)
            self.assertEquals(len(self.db.findProducts("base")), 1)
            self.assert_(not os.path.exists(os.path.join(pdir, "3.0.version")))
            self.assertEquals(
                self.db.getTaggedVersion("current", "base", "Linux"), None)
            self.assert_(
                not os.path.exists(os.path.join(pdir, "current.chain")))
            self.db.undeclare(base2)
            self.assertEquals(len(self.db.findProducts("base")), 0)
            self.assert_(not os.path.exists(pdir))

        except:
            if False:
                if os.path.isdir(pdir):
                    map(
                        lambda r: os.remove(r),
                        filter(
                            lambda f: os.path.isfile(f),
                            map(lambda p: os.path.join(pdir, p),
                                os.listdir(pdir))))
                    os.removedirs(pdir)
            raise
Пример #4
0
class DatabaseTestCase(unittest.TestCase):

    def setUp(self):
        self.dbpath = os.path.join(testEupsStack, "ups_db")
        self.userdb = os.path.join(testEupsStack, "user_ups_db")
        if not os.path.exists(self.userdb):
            os.makedirs(self.userdb)

        self.db = Database(self.dbpath, self.userdb)

        self.pycur = os.path.join(self.dbpath,"python","current.chain")
        if os.path.isfile(self.pycur+".bak"):
            os.rename(self.pycur+".bak", self.pycur)

    def tearDown(self):
        if os.path.isfile(self.pycur+".bak"):
            os.rename(self.pycur+".bak", self.pycur)

        if os.path.exists(self.userdb) and self.userdb.endswith("user_ups_db"):

            os.system("rm -rf " + self.userdb)

    def testFindProductNames(self):
        prods = self.db.findProductNames()
        self.assertEqual(len(prods), 6)
        expected = "cfitsio tcltk eigen mpich2 python doxygen".split()
        for p in expected:
            self.assertIn(p, prods)

    def testFindVersions(self):
        vers = self.db.findVersions("goober")
        self.assertEqual(len(vers), 0)

        vers = self.db.findVersions("doxygen")
        self.assertEqual(len(vers), 2)
        expected = "1.5.7.1 1.5.9".split()
        for v in expected:
            self.assertIn(v, vers)

    def testFindFlavors(self):
        flavs = self.db.findFlavors("doxygen")
        self.assertEqual(len(flavs), 2)
        expected = "Linux Linux64".split()
        for f in expected:
            self.assertIn(f, flavs)

        flavs = self.db.findFlavors("doxygen", "1.5.9")
        self.assertEqual(len(flavs), 1)
        expected = "Linux64".split()
        for f in expected:
            self.assertIn(f, flavs)

        flavs = self.db.findFlavors("doxygen", "1.5.10")
        self.assertEqual(len(flavs), 0)

    def testFindTags(self):
        self.assertRaises(ProductNotFound, self.db.findTags,
                          "goober", "1.5.9", "Linux64")

        tags = self.db.findTags("doxygen", "1.5.10", "Linux64")
        self.assertEqual(len(tags), 0)

        tags = self.db.findTags("doxygen", "1.5.9", "Linux64")
        self.assertEqual(len(tags), 0)

        tags = self.db.findTags("doxygen", "1.5.7.1", "Linux")
        self.assertEqual(len(tags), 1)
        self.assertEqual(tags[0], "current")

    def testFindProduct(self):
        prod = self.db.findProduct("doxygen", "1.5.9", "Linux")
        self.assert_(prod is None)

        prod = self.db.findProduct("doxygen", "1.5.10", "Linux")
        self.assert_(prod is None)

        prod = self.db.findProduct("goober", "1.5.10", "Linux")
        self.assert_(prod is None)

        prod = self.db.findProduct("doxygen", "1.5.9", "Linux64")
        self.assert_(prod is not None)
        self.assertEqual(prod.name, "doxygen")
        self.assertEqual(prod.version, "1.5.9")
        self.assertEqual(prod.flavor, "Linux64")
        self.assertEqual(prod.db, os.path.join(testEupsStack, "ups_db"))
        self.assertEqual(prod.dir,
                "/lsst/DC3/stacks/gcc433/04jun/Linux64/external/doxygen/1.5.9")
        self.assertEqual(prod.tablefile, "/lsst/DC3/stacks/gcc433/04jun/Linux64/external/doxygen/1.5.9/ups/doxygen.table")
        self.assertEqual(len(prod.tags), 0)

        prod = self.db.findProduct("doxygen", "1.5.7.1", "Linux")
        self.assert_(prod is not None)
        self.assertEqual(prod.name, "doxygen")
        self.assertEqual(prod.version, "1.5.7.1")
        self.assertEqual(prod.flavor, "Linux")
        self.assertEqual(prod.db, os.path.join(testEupsStack, "ups_db"))
        self.assertEqual(prod.dir,
                "/home/rplante/wrk/NCSA/LSST/devlp/stacks/21mar/Linux/external/doxygen/1.5.7.1")
        self.assertEqual(prod.tablefile, "none")
        self.assertEqual(len(prod.tags), 1)
        self.assertEqual(prod.tags[0], "current")

        # test correct formation of table file path
        prod = self.db.findProduct("python", "2.5.2", "Linux")
        self.assertEqual(prod.name, "python")
        self.assertEqual(prod.version, "2.5.2")
        self.assertEqual(prod.flavor, "Linux")
        self.assertEqual(prod.db, os.path.join(testEupsStack, "ups_db"))
        self.assert_(prod.tablefile.endswith("Linux/python/2.5.2/ups/python.table"))
        self.assert_(os.path.exists(prod.tablefile))

        # test autonormalization of product install directories.
        # The install directory (PROD_DIR) for this python is given
        # as a relative directory
        prod = self.db.findProduct("python", "2.5.2", "Linux")
        self.assert_(prod is not None)
        self.assertEqual(prod.name, "python")
        self.assertEqual(prod.version, "2.5.2")
        self.assertEqual(prod.flavor, "Linux")
        self.assertEqual(prod.db, os.path.join(testEupsStack, "ups_db"))
        expect_pdir = os.path.join(testEupsStack, "Linux/python/2.5.2")
        self.assertEqual(prod.dir, expect_pdir)
        expect_tfile = os.path.join(expect_pdir, "ups", "python.table")
        self.assertEqual(prod.tablefile, expect_tfile)

    def testFindProducts(self):
        prods = self.db.findProducts("doxygen")
        self.assertEqual(len(prods), 2)
        prod = next(d for d in prods if d.version == "1.5.7.1") # this idiom efficiently returns the first element in a sequence
        self.assertEqual(len(prod.tags), 1)
        self.assertEqual(prod.tags[0], "current")

        prods = self.db.findProducts("cfitsio")
        self.assertEqual(len(prods), 1)

        prods = self.db.findProducts("doxygen", flavors="Linux64")
        self.assertEqual(len(prods), 1)
        self.assertEqual(prods[0].version, "1.5.9")

        prods = self.db.findProducts("doxygen", "1.5.7.1")
        self.assertEqual(len(prods), 1)

    def testIsDeclared(self):
        self.assert_(self.db.isDeclared("doxygen"))
        self.assert_(self.db.isDeclared("doxygen", "1.5.9"))
        self.assert_(self.db.isDeclared("doxygen", "1.5.7.1"))
        self.assert_(self.db.isDeclared("doxygen", "1.5.9", "Linux64"))
        self.assert_(self.db.isDeclared("doxygen", flavor="Linux64"))
        self.assert_(self.db.isDeclared("doxygen", flavor="Linux"))
        self.assert_(not self.db.isDeclared("goober"))
        self.assert_(not self.db.isDeclared("goober", "1.0"))
        self.assert_(not self.db.isDeclared("doxygen", "1.5.10"))
        self.assert_(not self.db.isDeclared("doxygen", "1.5.9", "Linux"))

    def testUserTag(self):
        vers = self.db.getTaggedVersion("user:my", "python", "Linux")[1]
        self.assert_(vers is None)

        self.db.assignTag("user:my", "python", "2.5.2")
        vers = self.db.getTaggedVersion("user:my", "python", "Linux")[1]
        self.assertEqual(vers, "2.5.2")
        self.assert_(os.path.exists(os.path.join(self.userdb,
                                                 "python","my.chain")))

        tags = self.db.findTags("python", "2.5.2", "Linux")
        ntag = 2
        self.assertEqual(len(tags), ntag)
        self.assertEqual(tags.count("current"), 1)
        self.assertEqual(tags.count("user:my"), 1)

        prods = self.db.findProducts("python", "2.5.2")
        self.assertEqual(len(prods), 1)
        self.assertEqual(len(prods[0].tags), 2)
        self.assertEqual(tags[0], "current")
        self.assertEqual(tags[1], "user:my")

        self.db.unassignTag("user:my", "python")
        vers = self.db.getTaggedVersion("user:my", "python", "Linux")[1]
        self.assert_(vers is None)
        self.assert_(not os.path.exists(os.path.join(self.userdb,
                                                     "python","my.chain")))

    def testAssignTag(self):
        if not os.path.exists(self.pycur+".bak"):
            shutil.copyfile(self.pycur, self.pycur+".bak")

        vers = self.db.getTaggedVersion("current", "python", "Linux")[1]
        self.assertEqual(vers, "2.5.2")
        self.assertRaises(ProductNotFound,
                          self.db.assignTag, "current", "python", "2.7")

        self.db.assignTag("current", "python", "2.6")
        self.assertEqual(self.db.getTaggedVersion("current","python","Linux"),
                          ("python", "2.6"))
        self.db.assignTag("current", "python", "2.5.2")
        self.assertEqual(self.db.getTaggedVersion("current","python","Linux"),
                          ("python", "2.5.2"))

        tfile = self.db._tagFile("python", "stable")
        if os.path.exists(tfile):  os.remove(tfile)
        try:
            self.db.assignTag("stable", "python", "2.6")
            self.assertEqual(self.db.getTaggedVersion("stable","python",
                                                       "Linux"),
                              ("python", "2.6"))
            self.db.unassignTag("stable", "python", "Linux")
            self.assert_(not os.path.exists(tfile))
        except:
            if os.path.exists(tfile): os.remove(file)
            raise

        tfile = self.db._tagFile("doxygen", "beta")
        if os.path.exists(tfile):  os.remove(tfile)
        try:
            self.db.assignTag("beta", "doxygen", "1.5.9")
            self.db.assignTag("beta", "doxygen", "1.5.7.1")
            self.assertEqual(self.db.getTaggedVersion("beta","doxygen",
                                                       "Linux64")[1],
                              "1.5.9")
            self.assertEqual(self.db.getTaggedVersion("beta","doxygen",
                                                       "Linux")[1],
                              "1.5.7.1")
            self.db.unassignTag("beta", "doxygen", "Linux64")
            self.assertEqual(self.db.getTaggedVersion("beta","doxygen",
                                                       "Linux")[1],
                              "1.5.7.1")
            self.assertEqual(self.db.getTaggedVersion("beta","doxygen",
                                                       "Linux64")[1],
                              None)
            self.db.assignTag("beta", "doxygen", "1.5.9")
            self.db.unassignTag("beta", "doxygen", "Linux")
            self.assertEqual(self.db.getTaggedVersion("beta","doxygen",
                                                       "Linux64")[1],
                              "1.5.9")
            self.assertEqual(self.db.getTaggedVersion("beta","doxygen",
                                                       "Linux")[1],
                              None)
            self.db.assignTag("beta", "doxygen", "1.5.7.1")
            self.db.unassignTag("beta", "doxygen")
            self.assert_(not os.path.exists(tfile))
        except:
            if os.path.exists(tfile):  os.remove(tfile)
            raise

        os.rename(self.pycur+".bak", self.pycur)

    def testDeclare(self):
        pdir = self.db._productDir("base")
        if os.path.isdir(pdir):
            for p in os.listdir(pdir):
                f = os.path.join(pdir, p)
                if os.path.isfile(f):
                    os.remove(f)
            os.removedirs(pdir)
        try:
            self.assert_(not os.path.exists(pdir))
            baseidir = os.path.join(testEupsStack,"Linux/base/1.0")
            base = Product("base", "1.0", "Linux", baseidir,
                           os.path.join(baseidir, "ups/base.table"),
                           tags=["current"])
            self.db.declare(base)
            self.assert_(os.path.isdir(pdir))
            self.assert_(os.path.isfile(os.path.join(pdir,"1.0.version")))
            self.assert_(os.path.isfile(os.path.join(pdir,"current.chain")))
            prods = self.db.findProducts("base")
            self.assertEqual(len(prods), 1)
            self.assertEqual(prods[0].name, "base")
            self.assertEqual(prods[0].version, "1.0")
            self.assertEqual(prods[0].flavor, "Linux")
            self.assertEqual(prods[0].dir, baseidir)
            self.assertEqual(prods[0].tablefile,
                              os.path.join(baseidir, "ups/base.table"))
            self.assertEqual(len(prods[0].tags), 1)
            self.assertEqual(prods[0].tags[0], "current")

            base2 = prods[0].clone()
            base2.version = "2.0"
            base2.tags = []
            self.db.declare(base2)
            self.assertEqual(self.db.getTaggedVersion("current", "base",
                                                       "Linux"),
                              ("base", "1.0"))
            base3 = prods[0].clone()
            base3.version = "3.0"
            self.db.declare(base3)
            self.assertEqual(self.db.getTaggedVersion("current", "base",
                                                       "Linux"),
                              ("base", "3.0"))

            self.assertEqual(len(self.db.findProducts("base")), 3)

            self.db.undeclare(base)
            self.assertEqual(self.db.findProduct("base","1.0","Linux"), None)
            self.assertEqual(len(self.db.findProducts("base")), 2)
            self.assert_(not os.path.exists(os.path.join(pdir,"1.0.version")))

            self.db.undeclare(base3)
            self.assertEqual(self.db.findProduct("base","3.0","Linux"), None)
            self.assertEqual(len(self.db.findProducts("base")), 1)
            self.assert_(not os.path.exists(os.path.join(pdir,"3.0.version")))
            self.assertEqual(self.db.getTaggedVersion("current", "base",
                                                       "Linux")[1],
                              None)
            self.assert_(not os.path.exists(os.path.join(pdir,"current.chain")))
            self.db.undeclare(base2)
            self.assertEqual(len(self.db.findProducts("base")), 0)
            self.assert_(not os.path.exists(pdir))

        except:
            if False:
              if os.path.isdir(pdir):
                  for p in os.listdir(pdir):
                      f = os.path.join(pdir, p)
                      if os.path.isfile(f):
                          os.remove(f)
                  os.removedirs(pdir)
            raise