# Copyright 2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 import textwrap import portage from portage import os from portage.tests import TestCase from portage.tests.resolver.ResolverPlayground import ResolverPlayground from portage.util import ensure_dirs from portage._global_updates import _do_global_updates class MoveSlotEntTestCase(TestCase): def testMoveSlotEnt(self): ebuilds = { "dev-libs/A-2::dont_apply_updates" : { "EAPI": "4-slot-abi", "SLOT": "0/2.30", }, "dev-libs/B-2::dont_apply_updates" : { "SLOT": "0", }, "dev-libs/C-2.1::dont_apply_updates" : { "EAPI": "4-slot-abi", "SLOT": "0/2.1", }, } installed = { "dev-libs/A-1::test_repo" : { "EAPI": "4-slot-abi", "SLOT": "0/2.30", }, "dev-libs/B-1::test_repo" : { "SLOT": "0", }, "dev-libs/C-1::test_repo" : { "EAPI": "4-slot-abi", "SLOT": "0/1", }, } binpkgs = { "dev-libs/A-1::test_repo" : { "EAPI": "4-slot-abi", "SLOT": "0/2.30", }, "dev-libs/A-2::dont_apply_updates" : { "EAPI": "4-slot-abi", "SLOT": "0/2.30", }, "dev-libs/B-1::test_repo" : { "SLOT": "0", }, "dev-libs/B-2::dont_apply_updates" : { "SLOT": "0", }, "dev-libs/C-1::test_repo" : { "EAPI": "4-slot-abi", "SLOT": "0/1", }, "dev-libs/C-2.1::dont_apply_updates" : { "EAPI": "4-slot-abi", "SLOT": "0/2.1", }, } updates = textwrap.dedent(""" slotmove dev-libs/A 0 2 slotmove dev-libs/B 0 1 slotmove dev-libs/C 0 1 """) playground = ResolverPlayground(binpkgs=binpkgs, ebuilds=ebuilds, installed=installed) settings = playground.settings trees = playground.trees eroot = settings["EROOT"] portdir = settings["PORTDIR"] portdb = trees[eroot]["porttree"].dbapi vardb = trees[eroot]["vartree"].dbapi bindb = trees[eroot]["bintree"].dbapi updates_dir = os.path.join(portdir, "profiles", "updates") try: ensure_dirs(updates_dir) with open(os.path.join(updates_dir, "1Q-2010"), 'w') as f: f.write(updates) # Create an empty updates directory, so that this # repo doesn't inherit updates from the main repo. ensure_dirs(os.path.join( portdb.getRepositoryPath("dont_apply_updates"), "profiles", "updates")) global_noiselimit = portage.util.noiselimit portage.util.noiselimit = -2 try: _do_global_updates(trees, {}) finally: portage.util.noiselimit = global_noiselimit # Workaround for cache validation not working # correctly when filesystem has timestamp precision # of 1 second. vardb._clear_cache() # 0/2.30 -> 2/2.30 self.assertEqual("2/2.30", vardb.aux_get("dev-libs/A-1", ["SLOT"])[0]) self.assertEqual("2/2.30", bindb.aux_get("dev-libs/A-1", ["SLOT"])[0]) # 0 -> 1 self.assertEqual("1", vardb.aux_get("dev-libs/B-1", ["SLOT"])[0]) self.assertEqual("1", bindb.aux_get("dev-libs/B-1", ["SLOT"])[0]) # 0/1 -> 1 (equivalent to 1/1) self.assertEqual("1", vardb.aux_get("dev-libs/C-1", ["SLOT"])[0]) self.assertEqual("1", bindb.aux_get("dev-libs/C-1", ["SLOT"])[0]) # dont_apply_updates self.assertEqual("0/2.30", bindb.aux_get("dev-libs/A-2", ["SLOT"])[0]) self.assertEqual("0", bindb.aux_get("dev-libs/B-2", ["SLOT"])[0]) self.assertEqual("0/2.1", bindb.aux_get("dev-libs/C-2.1", ["SLOT"])[0]) finally: playground.cleanup()