# Copyright 2012-2013 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"]
		test_repo_location = settings.repositories["test_repo"].location
		portdb = trees[eroot]["porttree"].dbapi
		vardb = trees[eroot]["vartree"].dbapi
		bindb = trees[eroot]["bintree"].dbapi

		updates_dir = os.path.join(test_repo_location, "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()
