Merged from trunk 585{1,9}
authorFabian Groffen <grobian@gentoo.org>
Thu, 1 Feb 2007 08:34:00 +0000 (08:34 -0000)
committerFabian Groffen <grobian@gentoo.org>
Thu, 1 Feb 2007 08:34:00 +0000 (08:34 -0000)
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
pym/portage/__init__.py
pym/portage/dep.py
tests/portage/dep/test_dep_getcpv.py
tests/portage/dep/test_dep_getslot.py
tests/portage/dep/test_dep_getusedeps.py [new file with mode: 0644]
tests/portage/dep/test_get_operator.py
tests/portage/dep/test_isvalidatom.py

index b99a431d128307b030da537aeb01890bc5365e85..7194ea3d08e5adfe9230ec7bafe0e5cb0ead19d6 100755 (executable)
@@ -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(":")
index d5f9729e41c0410634091b1ebb33f4eaa1c04644..d4f7740ac1d14f641d9a279a9a16817a68f378ae 100644 (file)
@@ -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:
index 8a845e398cfba5f07f23995da6bec9bc80eca38b..e59715f1c6678c86deb212fe3e9de327a2ed4dbb 100644 (file)
@@ -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):
index 857a408a3c7e65e4695a7030309966f66e01664e..11fd1a72316715068cc7bbe2c872132aaaf72dfb 100644 (file)
@@ -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
index 7c3004d050831fc0f67c2daf299d1742082a1ec5..d3b38917a66ce11ea9ee4488b30d67467f684efd 100644 (file)
@@ -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 (file)
index 0000000..c16632c
--- /dev/null
@@ -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 + "]" ), [] )
index 28485e0f0bf618f3a95f39d1fbdc701cc4dd54fa..b41fab0d5120fe2613bd3c67ed224ec84aebc4f7 100644 (file)
@@ -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 , "=*" )
index d373a52f050e52324e8be3b130a98662a5fcf56e..88250e96cda601e41ab08f5e54736b90cb8d32f0 100644 (file)
@@ -20,6 +20,8 @@ class IsValidAtom(TestCase):
                          ( ">sys-apps/portage-2.1", True ),
                          ( "<sys-apps/portage-2.1", True ),
                          ( "~sys-apps/portage-2.1", True ),
+                         ( "sys-apps/portage-2.1:foo", True ),
+                         ( "sys-apps/portage-2.1:", False ),
                          ( ">~cate-gory/foo-1.0", False ),
                          ( ">~category/foo-1.0", False ),
                          ( "<~category/foo-1.0", False ),