From 3cb6ec5fa2702b3524fdfa7f6903a8765499ab41 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Thu, 1 Feb 2007 08:34:00 +0000 Subject: [PATCH] Merged from trunk 585{1,9} Don't use os.path.isdir() because it can swallow errors related to filesystem/disk corruption. add some new tests (WarnerBro) rename file (WarnerBro) Round one of dep_getusedeps() (WarnerBro) increase test coverage to cover slots, uncovering a few corner cases that need fixing (WarnerBro) fix regression in test changes (WarnerBro) Load the most current variables from /etc/profile.env for post_emerge stuff. Fix --newuse so that it works correctly with --usepkg. svn path=/main/branches/prefix/; revision=5861 --- bin/emerge | 9 ++++-- pym/portage/__init__.py | 10 ++++-- pym/portage/dep.py | 32 ++++++++++++++++++- tests/portage/dep/test_dep_getcpv.py | 30 ++++++++++++------ tests/portage/dep/test_dep_getslot.py | 18 ++++++----- tests/portage/dep/test_dep_getusedeps.py | 39 ++++++++++++++++++++++++ tests/portage/dep/test_get_operator.py | 15 ++++++--- tests/portage/dep/test_isvalidatom.py | 2 ++ 8 files changed, 128 insertions(+), 27 deletions(-) create mode 100644 tests/portage/dep/test_dep_getusedeps.py diff --git a/bin/emerge b/bin/emerge index b99a431d1..7194ea3d0 100755 --- a/bin/emerge +++ b/bin/emerge @@ -1131,9 +1131,8 @@ class depgraph: If the package has new iuse flags or different use flags then if --newuse is specified, we need to merge the package. """ if merging==0 and "--newuse" in self.myopts and \ - mytype == "ebuild" and \ vardbapi.cpv_exists(mykey): - pkgsettings.setcpv(mykey, mydb=portdb) + pkgsettings.setcpv(mykey, mydb=mydbapi) forced_flags = set() forced_flags.update(pkgsettings.useforce) forced_flags.update(pkgsettings.usemask) @@ -3537,6 +3536,12 @@ def post_emerge(settings, mtimedb, retval): """ target_root = settings["ROOT"] info_mtimes = mtimedb["info"] + + # Load the most current variables from ${ROOT}/etc/profile.env + settings.unlock() + settings.regenerate() + settings.lock() + config_protect = settings.get("CONFIG_PROTECT","").split() infodirs = settings.get("INFOPATH","").split(":") + \ settings.get("INFODIR","").split(":") diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index d5f9729e4..d4f7740ac 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -5317,8 +5317,14 @@ class vardbapi(dbapi): def _aux_get(self, mycpv, wants): mydir = os.path.join(self.root, VDB_PATH, mycpv) - if not os.path.isdir(mydir): - raise KeyError(mycpv) + try: + if not stat.S_ISDIR(os.stat(mydir).st_mode): + raise KeyError(mycpv) + except OSError, e: + if e.errno == errno.ENOENT: + raise KeyError(mycpv) + del e + raise results = [] for x in wants: try: diff --git a/pym/portage/dep.py b/pym/portage/dep.py index 8a845e398..e59715f1c 100644 --- a/pym/portage/dep.py +++ b/pym/portage/dep.py @@ -20,7 +20,7 @@ import re, sys, types import portage.exception -from portage.exception import InvalidData +from portage.exception import InvalidData, InvalidAtom from portage.versions import catpkgsplit, catsplit, pkgcmp, pkgsplit, ververify def cpvequal(cpv1, cpv2): @@ -336,6 +336,36 @@ def dep_getslot(mydep): return mydep[colon+1:] return None +def dep_getusedeps( depend ): + """ + Pull a listing of USE Dependencies out of a dep atom. + + Example usage: + >>> dep_getusedeps('app-misc/test:3[foo][-bar] + ['foo','-bar'] + + @param depend: The depstring to process + @type depend: String + @rtype: List + @return: List of use flags ( or [] if no flags exist ) + """ + use_list = [] + open_bracket = depend.find('[') + # -1 = failure (think c++ string::npos) + while( open_bracket != -1 ): + close_bracket = depend.find(']', open_bracket ) + if close_bracket == -1: + raise InvalidAtom("USE Dependency with no closing bracket: %s" % depend ) + use = depend[open_bracket + 1: close_bracket] + # foo[1:1] may return '' instead of None, we don't want '' in the result + if len(use): + use_list.append(use) + else: + raise InvalidAtom("USE Dependency with no use flag ([]): %s" % depend ) + # Find next use flag + open_bracket = depend.find( '[', open_bracket+1 ) + return use_list + _invalid_atom_chars_regexp = re.compile("[()|?]") def isvalidatom(atom, allow_blockers=False): diff --git a/tests/portage/dep/test_dep_getcpv.py b/tests/portage/dep/test_dep_getcpv.py index 857a408a3..11fd1a723 100644 --- a/tests/portage/dep/test_dep_getcpv.py +++ b/tests/portage/dep/test_dep_getcpv.py @@ -18,14 +18,24 @@ class DepGetCPV(TestCase): bad_prefix_ops = [ ">~", "<~", "~>", "~<" ] postfix_ops = [ "*", "" ] - cpvs = ["sys-apps/portage"] - + cpvs = ["sys-apps/portage", "sys-apps/portage-2.1", "sys-apps/portage-2.1", + "sys-apps/portage-2.1"] + slots = [None,":",":2"] for cpv in cpvs: - for prefix in prefix_ops: - for postfix in postfix_ops: - self.assertEqual( dep_getcpv( - prefix + cpv + postfix ), cpv ) - for prefix in bad_prefix_ops: - for postfix in postfix_ops: - self.assertNotEqual( dep_getcpv( - prefix + cpv + postfix ), cpv ) + for slot in slots: + for prefix in prefix_ops: + for postfix in postfix_ops: + if slot: + self.assertEqual( dep_getcpv( + prefix + cpv + slot + postfix ), cpv ) + else: + self.assertEqual( dep_getcpv( + prefix + cpv + postfix ), cpv ) + for prefix in bad_prefix_ops: + for postfix in postfix_ops: + if slot: + self.assertNotEqual( dep_getcpv( + prefix + cpv + slot + postfix ), cpv ) + else: + self.assertNotEqual( dep_getcpv( + prefix + cpv + postfix ), cpv ) \ No newline at end of file diff --git a/tests/portage/dep/test_dep_getslot.py b/tests/portage/dep/test_dep_getslot.py index 7c3004d05..d3b38917a 100644 --- a/tests/portage/dep/test_dep_getslot.py +++ b/tests/portage/dep/test_dep_getslot.py @@ -15,13 +15,17 @@ class DepGetSlot(TestCase): slot_char = ":" slots = ( "a", "1.2", "1", "IloveVapier", None ) cpvs = ["sys-apps/portage"] - + versions = ["2.1.1","2.1-r1"] for cpv in cpvs: - for slot in slots: - if slot: - self.assertEqual( dep_getslot( - cpv + slot_char + slot ), slot ) - else: - self.assertEqual( dep_getslot( cpv ), slot ) + for version in versions: + for slot in slots: + mycpv = cpv[:] + if version: + cpv += version + if slot: + self.assertEqual( dep_getslot( + cpv + slot_char + slot ), slot ) + else: + self.assertEqual( dep_getslot( cpv ), slot ) self.assertEqual( dep_getslot( "sys-apps/portage:"), "" ) diff --git a/tests/portage/dep/test_dep_getusedeps.py b/tests/portage/dep/test_dep_getusedeps.py new file mode 100644 index 000000000..c16632c94 --- /dev/null +++ b/tests/portage/dep/test_dep_getusedeps.py @@ -0,0 +1,39 @@ +# test_dep_getusedeps.py -- Portage Unit Testing Functionality +# Copyright 2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id: test_dep_getslot.py 5794 2007-01-27 18:16:08Z antarus $ + +from unittest import TestCase +from portage.dep import dep_getusedeps + +class DepGetUseDeps(TestCase): + """ A simple testcase for dep_getusedeps + """ + + def testDepGetUseDeps(self): + + useflags = [ '', 'foo', '-bar', ['baz','bar'], ['baz','-bar'] ] + cpvs = [ "sys-apps/portage" ] + slots = [ None, "0","1","linux-sources-2.5.7","randomstring" ] + versions = [ None, "2.1.1", "2.1.1-r2"] + for mycpv in cpvs: + for version in versions: + for slot in slots: + for use in useflags: + cpv = mycpv[:] + if version: + cpv += version + if slot: + cpv += ":" + slot + if isinstance( use, list ): + for u in use: + cpv = cpv + "[" + u + "]" + self.assertEqual( dep_getusedeps( + cpv ), use ) + else: + if len(use): + self.assertEqual( dep_getusedeps( + cpv + "[" + use + "]" ), [use] ) + else: + self.assertEqual( dep_getusedeps( + cpv + "[" + use + "]" ), [] ) diff --git a/tests/portage/dep/test_get_operator.py b/tests/portage/dep/test_get_operator.py index 28485e0f0..b41fab0d5 100644 --- a/tests/portage/dep/test_get_operator.py +++ b/tests/portage/dep/test_get_operator.py @@ -16,11 +16,16 @@ class GetOperator(TestCase): ( ">~", ">" ), ("~<", "~"), ( "=~", "=" ), ( "=>", "=" ), ("=<", "=") ] - testCP = "sys-apps/portage" - - for test in tests: - result = get_operator( test[0] + testCP ) - self.assertEqual( result, test[1] ) + test_cpvs = ["sys-apps/portage","sys-apps/portage-2.1"] + slots = [ None,"1","linux-2.5.6" ] + for cpv in test_cpvs: + for test in tests: + for slot in slots: + atom = cpv[:] + if slot: + atom += ":" + slot + result = get_operator( test[0] + atom ) + self.assertEqual( result, test[1] ) result = get_operator( "=sys-apps/portage*" ) self.assertEqual( result , "=*" ) diff --git a/tests/portage/dep/test_isvalidatom.py b/tests/portage/dep/test_isvalidatom.py index d373a52f0..88250e96c 100644 --- a/tests/portage/dep/test_isvalidatom.py +++ b/tests/portage/dep/test_isvalidatom.py @@ -20,6 +20,8 @@ class IsValidAtom(TestCase): ( ">sys-apps/portage-2.1", True ), ( "~cate-gory/foo-1.0", False ), ( ">~category/foo-1.0", False ), ( "<~category/foo-1.0", False ), -- 2.26.2