ResolverPlayground: support binary packages
authorZac Medico <zmedico@gentoo.org>
Wed, 20 Jun 2012 09:02:55 +0000 (02:02 -0700)
committerZac Medico <zmedico@gentoo.org>
Wed, 20 Jun 2012 09:02:55 +0000 (02:02 -0700)
pym/portage/tests/emerge/test_simple.py
pym/portage/tests/resolver/ResolverPlayground.py
pym/portage/tests/resolver/test_simple.py
pym/portage/xpak.py

index 28ac098430f7ee044bdbf103602f40859dd3c374..f87170a71f3599eb2915bf3498129c3906441be3 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright 2011 Gentoo Foundation
+# Copyright 2011-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
 import subprocess
@@ -259,8 +259,8 @@ pkg_preinst() {
                        emerge_cmd + ("-C", "--quiet", "dev-libs/B"),
                )
 
-               distdir = os.path.join(eprefix, "distdir")
-               pkgdir = os.path.join(eprefix, "pkgdir")
+               distdir = playground.distdir
+               pkgdir = playground.pkgdir
                fake_bin = os.path.join(eprefix, "bin")
                portage_tmpdir = os.path.join(eprefix, "var", "tmp", "portage")
                profile_path = settings.profile_path
index 140b25d6e4f66f3057e7e3c1906fcd47afa196a7..1e2d64d7ba8a3b7349c928f15aac2358a5245489 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright 2010-2011 Gentoo Foundation
+# Copyright 2010-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
 from itertools import permutations
@@ -9,9 +9,6 @@ from portage import os
 from portage import shutil
 from portage.const import (GLOBAL_CONFIG_PATH, PORTAGE_BASE_PATH,
        USER_CONFIG_PATH)
-from portage.dbapi.vartree import vartree
-from portage.dbapi.porttree import portagetree
-from portage.dbapi.bintree import binarytree
 from portage.dep import Atom, _repo_separator
 from portage.package.ebuild.config import config
 from portage.package.ebuild.digestgen import digestgen
@@ -56,7 +53,7 @@ class ResolverPlayground(object):
 </pkgmetadata>
 """
 
-       def __init__(self, ebuilds={}, installed={}, profile={}, repo_configs={}, \
+       def __init__(self, ebuilds={}, binpkgs={}, installed={}, profile={}, repo_configs={}, \
                user_config={}, sets={}, world=[], world_sets=[], distfiles={}, debug=False):
                """
                ebuilds: cpv -> metadata mapping simulating available ebuilds. 
@@ -68,6 +65,7 @@ class ResolverPlayground(object):
                self.eprefix = normalize_path(tempfile.mkdtemp())
                self.eroot = self.eprefix + os.sep
                self.distdir = os.path.join(self.eroot, "var", "portage", "distfiles")
+               self.pkgdir = os.path.join(self.eprefix, "pkgdir")
                self.portdir = os.path.join(self.eroot, "usr/portage")
                self.vdbdir = os.path.join(self.eroot, "var/db/pkg")
                os.makedirs(self.portdir)
@@ -82,6 +80,7 @@ class ResolverPlayground(object):
 
                self._create_distfiles(distfiles)
                self._create_ebuilds(ebuilds)
+               self._create_binpkgs(binpkgs)
                self._create_installed(installed)
                self._create_profile(ebuilds, installed, profile, repo_configs, user_config, sets)
                self._create_world(world, world_sets)
@@ -205,6 +204,27 @@ class ResolverPlayground(object):
                        if not digestgen(mysettings=tmpsettings, myportdb=portdb):
                                raise AssertionError('digest creation failed for %s' % ebuild_path)
 
+       def _create_binpkgs(self, binpkgs):
+               for cpv, metadata in binpkgs.items():
+                       a = Atom("=" + cpv, allow_repo=True)
+                       repo = a.repo
+                       if repo is None:
+                               repo = "test_repo"
+
+                       cat, pf = catsplit(a.cpv)
+                       metadata = metadata.copy()
+                       metadata.setdefault("SLOT", "0")
+                       metadata.setdefault("KEYWORDS", "x86")
+                       metadata["CATEGORY"] = cat
+                       metadata["PF"] = pf
+
+                       repo_dir = self.pkgdir
+                       category_dir = os.path.join(repo_dir, cat)
+                       binpkg_path = os.path.join(category_dir, pf + ".tbz2")
+                       ensure_dirs(category_dir)
+                       t = portage.xpak.tbz2(binpkg_path)
+                       t.recompose_mem(portage.xpak.xpak_mem(metadata))
+
        def _create_installed(self, installed):
                for cpv in installed:
                        a = Atom("=" + cpv, allow_repo=True)
@@ -473,7 +493,7 @@ class ResolverPlayground(object):
                env = {
                        "ACCEPT_KEYWORDS": "x86",
                        "DISTDIR" : self.distdir,
-                       "PKGDIR": os.path.join(self.eroot, "usr/portage/packages"),
+                       "PKGDIR": self.pkgdir,
                        "PORTDIR": self.portdir,
                        "PORTDIR_OVERLAY": " ".join(portdir_overlay),
                        'PORTAGE_TMPDIR'       : os.path.join(self.eroot, 'var/tmp'),
@@ -511,6 +531,9 @@ class ResolverPlayground(object):
                        elif options.get("--prune"):
                                action = "prune"
 
+               if "--usepkgonly" in options:
+                       options["--usepkg"] = True
+
                global_noiselimit = portage.util.noiselimit
                global_emergelog_disable = _emerge.emergelog._disable
                try:
index 4c2e97ef273b84b2366d568946f2e3e11e139e68..62a589259dbb11f700d043e02f782c04eab0dd9c 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright 2010-2011 Gentoo Foundation
+# Copyright 2010-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
 from portage.tests import TestCase
@@ -17,6 +17,9 @@ class SimpleResolverTestCase(TestCase):
                        "app-misc/X-1": {},
                        "app-misc/W-1": {},
                        }
+               binpkgs = {
+                       "dev-libs/B-1.2": {},
+               }
                installed = {
                        "dev-libs/A-1": {},
                        "dev-libs/B-1.1": {},
@@ -42,6 +45,18 @@ class SimpleResolverTestCase(TestCase):
                                success = True,
                                mergelist = ["dev-libs/B-1.2"]),
 
+                       ResolverPlaygroundTestCase(
+                               ["dev-libs/B"],
+                               options = {"--update": True, "--usepkg": True},
+                               success = True,
+                               mergelist = ["dev-libs/B-1.2"]),
+
+                       ResolverPlaygroundTestCase(
+                               ["dev-libs/B"],
+                               options = {"--update": True, "--usepkgonly": True},
+                               success = True,
+                               mergelist = ["dev-libs/B-1.2"]),
+
                        ResolverPlaygroundTestCase(
                                ["app-misc/Z"],
                                success = True,
@@ -49,7 +64,8 @@ class SimpleResolverTestCase(TestCase):
                                mergelist = [("app-misc/W-1", "app-misc/X-1"), "app-misc/Z-1"]),
                        )
 
-               playground = ResolverPlayground(ebuilds=ebuilds, installed=installed)
+               playground = ResolverPlayground(ebuilds=ebuilds,
+                       binpkgs=binpkgs, installed=installed)
                try:
                        for test_case in test_cases:
                                playground.run_TestCase(test_case)
index 32623263eabc693f81cccdf7d99fded80f7e3f46..73f84ab75ca9cfd3f8f7328495b2f018a4843e7a 100644 (file)
@@ -324,7 +324,7 @@ class tbz2(object):
                """
                self.scan() # Don't care about condition... We'll rewrite the data anyway.
 
-               if break_hardlinks and self.filestat.st_nlink > 1:
+               if break_hardlinks and self.filestat and self.filestat.st_nlink > 1:
                        tmp_fname = "%s.%d" % (self.file, os.getpid())
                        shutil.copyfile(self.file, tmp_fname)
                        try: