Merge doebuild *DEPEND validation from trunk r5652:5655.
authorZac Medico <zmedico@gentoo.org>
Wed, 17 Jan 2007 08:48:32 +0000 (08:48 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 17 Jan 2007 08:48:32 +0000 (08:48 -0000)
svn path=/main/branches/2.1.2/; revision=5686

pym/portage.py

index 2e6b571cfb72e8342d70f74c17628aac76d7b19f..13014ef6a4b48b32fef954e03ef7fdb6bf02e721 100644 (file)
@@ -3352,6 +3352,30 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0,
 
                        return spawn(EBUILD_SH_BINARY + " depend", mysettings)
 
+               # Validate dependency metadata here to ensure that ebuilds with invalid
+               # data are never installed (even via the ebuild command).
+               invalid_dep_exempt_phases = \
+                       set(["clean", "cleanrm", "help", "prerm", "postrm"])
+               mycpv = mysettings["CATEGORY"] + "/" + mysettings["PF"]
+               dep_keys = ["DEPEND", "RDEPEND", "PDEPEND"]
+               metadata = dict(izip(dep_keys, mydbapi.aux_get(mycpv, dep_keys)))
+               class FakeTree(object):
+                       def __init__(self, mydb):
+                               self.dbapi = mydb
+               dep_check_trees = {myroot:{}}
+               dep_check_trees[myroot]["porttree"] = \
+                       FakeTree(fakedbapi(settings=mysettings))
+               for dep_type in dep_keys:
+                       mycheck = dep_check(metadata[dep_type], None, mysettings,
+                               myuse="all", myroot=myroot, trees=dep_check_trees)
+                       if not mycheck[0]:
+                               writemsg("%s: %s\n%s\n" % (
+                                       dep_type, metadata[dep_type], mycheck[1]), noiselevel=-1)
+                               if mydo not in invalid_dep_exempt_phases:
+                                       return 1
+                       del dep_type, mycheck
+               del mycpv, dep_keys, metadata, FakeTree, dep_check_trees
+
                if "PORTAGE_TMPDIR" not in mysettings or \
                        not os.path.isdir(mysettings["PORTAGE_TMPDIR"]):
                        writemsg("The directory specified in your " + \