Merged from trunk -r15455:15460
authorFabian Groffen <grobian@gentoo.org>
Sat, 27 Feb 2010 19:26:00 +0000 (19:26 -0000)
committerFabian Groffen <grobian@gentoo.org>
Sat, 27 Feb 2010 19:26:00 +0000 (19:26 -0000)
   | 15456   | Relocate portage.util.digestgen to                           |
   | zmedico | portage.package.ebuild.digestgen.                            |

   | 15457   | Fix broken digestgen import.                                 |
   | zmedico |                                                              |

   | 15458   | Move portage.digestcheck to                                  |
   | zmedico | portage.package.ebuild.digestcheck.                          |

   | 15459   | Fix typo in import.                                          |
   | zmedico |                                                              |

   | 15460   | Move dep_expand and cpv_expand into portage.dbapi            |
   | zmedico | submodules.                                                  |

svn path=/main/branches/prefix/; revision=15482

16 files changed:
bin/quickpkg
bin/repoman
pym/_emerge/Scheduler.py
pym/_emerge/actions.py
pym/_emerge/depgraph.py
pym/_emerge/main.py
pym/portage/__init__.py
pym/portage/dbapi/__init__.py
pym/portage/dbapi/bintree.py
pym/portage/dbapi/cpv_expand.py [new file with mode: 0644]
pym/portage/dbapi/dep_expand.py [new file with mode: 0644]
pym/portage/dbapi/porttree.py
pym/portage/dbapi/vartree.py
pym/portage/package/ebuild/digestcheck.py [new file with mode: 0644]
pym/portage/package/ebuild/digestgen.py [moved from pym/portage/util/digestgen.py with 100% similarity]
pym/portage/package/ebuild/doebuild.py

index 5679d964b4a7d0ce14c967df4ebeb3d6ceaf8b2e..208a88aefb83706b6afaad09659ff6cc76d98d5a 100755 (executable)
@@ -20,7 +20,8 @@ import portage
 from portage import os
 
 def quickpkg_main(options, args, eout):
-       from portage import catsplit, dep_expand, flatten, isvalidatom, xpak
+       from portage import catsplit, flatten, isvalidatom, xpak
+       from portage.dbapi.dep_expand import dep_expand
        from portage.dep import use_reduce, paren_reduce
        from portage.util import ConfigProtect, ensure_dirs
        from portage.exception import InvalidAtom, InvalidData, InvalidDependString
index 4761a12b920057c0349bcf574b47d0de8c2357c1..5a924f5f1e6e9180f3f4e5946c1d96a57bf2252b 100755 (executable)
@@ -75,7 +75,7 @@ from portage.output import bold, create_color_func, darkgreen, \
        green, nocolor, red, turquoise, yellow
 from portage.output import ConsoleStyleFile, StyleWriter
 from portage.util import cmp_sort_key, writemsg_level
-from portage.util.digestgen import digestgen
+from portage.package.ebuild.digestgen import digestgen
 
 if sys.hexversion >= 0x3000000:
        basestring = str
index 071b8e8d78599cfc85d2c9a077d6e5c96fe79bab..0f113416f3cd51f38568f354c86d57e553ff0471 100644 (file)
@@ -24,7 +24,8 @@ bad = create_color_func("BAD")
 from portage.sets import SETPREFIX
 from portage.sets.base import InternalPackageSet
 from portage.util import writemsg, writemsg_level
-from portage.util.digestgen import digestgen
+from portage.package.ebuild.digestcheck import digestcheck
+from portage.package.ebuild.digestgen import digestgen
 
 from _emerge.BinpkgPrefetcher import BinpkgPrefetcher
 from _emerge.Blocker import Blocker
@@ -638,7 +639,7 @@ class Scheduler(PollScheduler):
                        if ebuild_path is None:
                                raise AssertionError("ebuild not found for '%s'" % x.cpv)
                        quiet_config["O"] = os.path.dirname(ebuild_path)
-                       if not portage.digestcheck([], quiet_config, strict=True):
+                       if not digestcheck([], quiet_config, strict=True):
                                failures |= 1
 
                if failures:
index 8eb4cf9aa8ce3368b83df0def60da36c94775cbb..05839b8bed43b69b5660c8a5993852d0844f1ed8 100644 (file)
@@ -27,6 +27,7 @@ from portage import digraph
 from portage import _unicode_decode
 from portage.cache.cache_errors import CacheError
 from portage.const import NEWS_LIB_PATH, EPREFIX
+from portage.dbapi.dep_expand import dep_expand
 from portage.output import blue, bold, colorize, create_color_func, darkgreen, \
        red, yellow
 good = create_color_func("GOOD")
@@ -2260,7 +2261,7 @@ def action_uninstall(settings, trees, ldpath_mtimes,
 
                        try:
                                valid_atoms.append(
-                                       portage.dep_expand(x, mydb=vardb, settings=settings))
+                                       dep_expand(x, mydb=vardb, settings=settings))
                        except portage.exception.AmbiguousPackageName as e:
                                msg = "The short ebuild name \"" + x + \
                                        "\" is ambiguous.  Please specify " + \
index 89349822aebc4e6c4206155218d5c4f01d1989d8..d7adea83e2d6a31dec844699cb6dd0024a7cb100 100644 (file)
@@ -15,6 +15,7 @@ import portage
 from portage import os
 from portage import digraph
 from portage.dbapi import dbapi
+from portage.dbapi.dep_expand import dep_expand
 from portage.dep import Atom
 from portage.output import bold, blue, colorize, create_color_func, darkblue, \
        darkgreen, green, nc_len, red, teal, turquoise, yellow
@@ -4160,7 +4161,7 @@ class depgraph(object):
                                else:
                                        blocker_style = "PKG_BLOCKER"
                                        addl = "%s  %s  " % (colorize(blocker_style, "B"), fetch)
-                               resolved = portage.dep_expand(
+                               resolved = dep_expand(
                                        str(x.atom).lstrip("!"), mydb=vardb, settings=pkgsettings)
                                if "--columns" in self._frozen_config.myopts and "--quiet" in self._frozen_config.myopts:
                                        addl += " " + colorize(blocker_style, str(resolved))
index 4b146cc964300905fbf421d735dce740a2c9a30e..acae2b545162785400858df7a75ad2fa01d08965 100644 (file)
@@ -33,6 +33,7 @@ import portage.locks
 import portage.exception
 from portage.const import EPREFIX, BPREFIX, EPREFIX_LSTRIP
 from portage.data import secpass
+from portage.dbapi.dep_expand import dep_expand
 from portage.util import normalize_path as normpath
 from portage.util import writemsg, writemsg_level, writemsg_stdout
 from portage.sets import SETPREFIX
@@ -1501,7 +1502,7 @@ def emerge_main():
                        if is_valid_package_atom(x):
                                try:
                                        valid_atoms.append(
-                                               portage.dep_expand(x, mydb=vardb, settings=settings))
+                                               dep_expand(x, mydb=vardb, settings=settings))
                                except portage.exception.AmbiguousPackageName as e:
                                        msg = "The short ebuild name \"" + x + \
                                                "\" is ambiguous.  Please specify " + \
index d066d345253e5f0c8447e758d8054caf482e2858..5edbf843fdd3a358e78ba430dd7f0768b0c22d2e 100644 (file)
@@ -82,6 +82,8 @@ try:
                        'uid,userland,userpriv_groups,wheelgid',
                'portage.dbapi',
                'portage.dbapi.bintree:bindbapi,binarytree',
+               'portage.dbapi.cpv_expand:cpv_expand',
+               'portage.dbapi.dep_expand:dep_expand',
                'portage.dbapi.porttree:close_portdbapi_caches,FetchlistDict,' + \
                        'portagetree,portdbapi',
                'portage.dbapi.vartree:vardbapi,vartree,dblink',
@@ -104,6 +106,8 @@ try:
                        'doebuild_environment,spawn,spawnebuild',
                'portage.package.ebuild.config:autouse,best_from_dict,' + \
                        'check_config_instance,config',
+               'portage.package.ebuild.digestcheck:digestcheck',
+               'portage.package.ebuild.digestgen:digestgen',
                'portage.package.ebuild.fetch:fetch',
                'portage.package.ebuild.prepare_build_dirs:prepare_build_dirs',
                'portage.process',
@@ -119,7 +123,6 @@ try:
                        'pickle_read,pickle_write,stack_dictlist,stack_dicts,' + \
                        'stack_lists,unique_array,varexpand,writedict,writemsg,' + \
                        'writemsg_stdout,write_atomic',
-               'portage.util.digestgen:digestgen',
                'portage.util.digraph:digraph',
                'portage.util.env_update:env_update',
                'portage.util.ExtractKernelVersion:ExtractKernelVersion',
@@ -560,146 +563,6 @@ def digestParseFile(myfilename, mysettings=None):
 
        return Manifest(pkgdir, mysettings["DISTDIR"]).getDigests()
 
-def digestcheck(myfiles, mysettings, strict=0, justmanifest=0):
-       """Verifies checksums.  Assumes all files have been downloaded.
-       DEPRECATED: this is now only a compability wrapper for 
-                   portage.manifest.Manifest()."""
-       if mysettings.get("EBUILD_SKIP_MANIFEST") == "1":
-               return 1
-       pkgdir = mysettings["O"]
-       manifest_path = os.path.join(pkgdir, "Manifest")
-       if not os.path.exists(manifest_path):
-               writemsg(_("!!! Manifest file not found: '%s'\n") % manifest_path,
-                       noiselevel=-1)
-               if strict:
-                       return 0
-               else:
-                       return 1
-       mf = Manifest(pkgdir, mysettings["DISTDIR"])
-       manifest_empty = True
-       for d in mf.fhashdict.values():
-               if d:
-                       manifest_empty = False
-                       break
-       if manifest_empty:
-               writemsg(_("!!! Manifest is empty: '%s'\n") % manifest_path,
-                       noiselevel=-1)
-               if strict:
-                       return 0
-               else:
-                       return 1
-       eout = portage.output.EOutput()
-       eout.quiet = mysettings.get("PORTAGE_QUIET", None) == "1"
-       try:
-               if strict and "PORTAGE_PARALLEL_FETCHONLY" not in mysettings:
-                       eout.ebegin(_("checking ebuild checksums ;-)"))
-                       mf.checkTypeHashes("EBUILD")
-                       eout.eend(0)
-                       eout.ebegin(_("checking auxfile checksums ;-)"))
-                       mf.checkTypeHashes("AUX")
-                       eout.eend(0)
-                       eout.ebegin(_("checking miscfile checksums ;-)"))
-                       mf.checkTypeHashes("MISC", ignoreMissingFiles=True)
-                       eout.eend(0)
-               for f in myfiles:
-                       eout.ebegin(_("checking %s ;-)") % f)
-                       ftype = mf.findFile(f)
-                       if ftype is None:
-                               raise KeyError(f)
-                       mf.checkFileHashes(ftype, f)
-                       eout.eend(0)
-       except KeyError as e:
-               eout.eend(1)
-               writemsg(_("\n!!! Missing digest for %s\n") % str(e), noiselevel=-1)
-               return 0
-       except portage.exception.FileNotFound as e:
-               eout.eend(1)
-               writemsg(_("\n!!! A file listed in the Manifest could not be found: %s\n") % str(e),
-                       noiselevel=-1)
-               return 0
-       except portage.exception.DigestException as e:
-               eout.eend(1)
-               writemsg(_("\n!!! Digest verification failed:\n"), noiselevel=-1)
-               writemsg("!!! %s\n" % e.value[0], noiselevel=-1)
-               writemsg(_("!!! Reason: %s\n") % e.value[1], noiselevel=-1)
-               writemsg(_("!!! Got: %s\n") % e.value[2], noiselevel=-1)
-               writemsg(_("!!! Expected: %s\n") % e.value[3], noiselevel=-1)
-               return 0
-       # Make sure that all of the ebuilds are actually listed in the Manifest.
-       glep55 = 'parse-eapi-glep-55' in mysettings.features
-       for f in os.listdir(pkgdir):
-               pf = None
-               if glep55:
-                       pf, eapi = _split_ebuild_name_glep55(f)
-               elif f[-7:] == '.ebuild':
-                       pf = f[:-7]
-               if pf is not None and not mf.hasFile("EBUILD", f):
-                       writemsg(_("!!! A file is not listed in the Manifest: '%s'\n") % \
-                               os.path.join(pkgdir, f), noiselevel=-1)
-                       if strict:
-                               return 0
-       """ epatch will just grab all the patches out of a directory, so we have to
-       make sure there aren't any foreign files that it might grab."""
-       filesdir = os.path.join(pkgdir, "files")
-
-       for parent, dirs, files in os.walk(filesdir):
-               try:
-                       parent = _unicode_decode(parent,
-                               encoding=_encodings['fs'], errors='strict')
-               except UnicodeDecodeError:
-                       parent = _unicode_decode(parent,
-                               encoding=_encodings['fs'], errors='replace')
-                       writemsg(_("!!! Path contains invalid "
-                               "character(s) for encoding '%s': '%s'") \
-                               % (_encodings['fs'], parent), noiselevel=-1)
-                       if strict:
-                               return 0
-                       continue
-               for d in dirs:
-                       d_bytes = d
-                       try:
-                               d = _unicode_decode(d,
-                                       encoding=_encodings['fs'], errors='strict')
-                       except UnicodeDecodeError:
-                               d = _unicode_decode(d,
-                                       encoding=_encodings['fs'], errors='replace')
-                               writemsg(_("!!! Path contains invalid "
-                                       "character(s) for encoding '%s': '%s'") \
-                                       % (_encodings['fs'], os.path.join(parent, d)),
-                                       noiselevel=-1)
-                               if strict:
-                                       return 0
-                               dirs.remove(d_bytes)
-                               continue
-                       if d.startswith(".") or d == "CVS":
-                               dirs.remove(d_bytes)
-               for f in files:
-                       try:
-                               f = _unicode_decode(f,
-                                       encoding=_encodings['fs'], errors='strict')
-                       except UnicodeDecodeError:
-                               f = _unicode_decode(f,
-                                       encoding=_encodings['fs'], errors='replace')
-                               if f.startswith("."):
-                                       continue
-                               f = os.path.join(parent, f)[len(filesdir) + 1:]
-                               writemsg(_("!!! File name contains invalid "
-                                       "character(s) for encoding '%s': '%s'") \
-                                       % (_encodings['fs'], f), noiselevel=-1)
-                               if strict:
-                                       return 0
-                               continue
-                       if f.startswith("."):
-                               continue
-                       f = os.path.join(parent, f)[len(filesdir) + 1:]
-                       file_type = mf.findFile(f)
-                       if file_type != "AUX" and not f.startswith("digest-"):
-                               writemsg(_("!!! A file is not listed in the Manifest: '%s'\n") % \
-                                       os.path.join(filesdir, f), noiselevel=-1)
-                               if strict:
-                                       return 0
-       return 1
-
 _testing_eapis = frozenset()
 _deprecated_eapis = frozenset(["3_pre2", "3_pre1", "2_pre3", "2_pre2", "2_pre1"])
 
@@ -1533,42 +1396,6 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
 
        assert(False) # This point should not be reachable
 
-def dep_expand(mydep, mydb=None, use_cache=1, settings=None):
-       '''
-       @rtype: Atom
-       '''
-       if not len(mydep):
-               return mydep
-       if mydep[0]=="*":
-               mydep=mydep[1:]
-       orig_dep = mydep
-       if isinstance(orig_dep, dep.Atom):
-               mydep = orig_dep.cp
-       else:
-               mydep = orig_dep
-               has_cat = '/' in orig_dep
-               if not has_cat:
-                       alphanum = re.search(r'\w', orig_dep)
-                       if alphanum:
-                               mydep = orig_dep[:alphanum.start()] + "null/" + \
-                                       orig_dep[alphanum.start():]
-               try:
-                       mydep = dep.Atom(mydep)
-               except exception.InvalidAtom:
-                       # Missing '=' prefix is allowed for backward compatibility.
-                       if not dep.isvalidatom("=" + mydep):
-                               raise
-                       mydep = dep.Atom('=' + mydep)
-                       orig_dep = '=' + orig_dep
-               if not has_cat:
-                       null_cat, pn = catsplit(mydep.cp)
-                       mydep = pn
-               else:
-                       mydep = mydep.cp
-       expanded = cpv_expand(mydep, mydb=mydb,
-               use_cache=use_cache, settings=settings)
-       return portage.dep.Atom(orig_dep.replace(mydep, expanded, 1))
-
 def dep_check(depstring, mydbapi, mysettings, use="yes", mode=None, myuse=None,
        use_cache=1, use_binaries=0, myroot="/", trees=None):
        """Takes a depend string and parses the condition."""
@@ -1702,92 +1529,6 @@ def dep_wordreduce(mydeplist,mysettings,mydbapi,mode,use_cache=1):
                                        return None
        return deplist
 
-def cpv_expand(mycpv, mydb=None, use_cache=1, settings=None):
-       """Given a string (packagename or virtual) expand it into a valid
-       cat/package string. Virtuals use the mydb to determine which provided
-       virtual is a valid choice and defaults to the first element when there
-       are no installed/available candidates."""
-       myslash=mycpv.split("/")
-       mysplit = versions._pkgsplit(myslash[-1])
-       if settings is None:
-               settings = globals()["settings"]
-       virts = settings.getvirtuals()
-       virts_p = settings.get_virts_p()
-       if len(myslash)>2:
-               # this is illegal case.
-               mysplit=[]
-               mykey=mycpv
-       elif len(myslash)==2:
-               if mysplit:
-                       mykey=myslash[0]+"/"+mysplit[0]
-               else:
-                       mykey=mycpv
-               if mydb and virts and mykey in virts:
-                       writemsg("mydb.__class__: %s\n" % (mydb.__class__), 1)
-                       if hasattr(mydb, "cp_list"):
-                               if not mydb.cp_list(mykey, use_cache=use_cache):
-                                       writemsg("virts[%s]: %s\n" % (str(mykey),virts[mykey]), 1)
-                                       mykey_orig = mykey[:]
-                                       for vkey in virts[mykey]:
-                                               # The virtuals file can contain a versioned atom, so
-                                               # it may be necessary to remove the operator and
-                                               # version from the atom before it is passed into
-                                               # dbapi.cp_list().
-                                               if mydb.cp_list(vkey.cp):
-                                                       mykey = str(vkey)
-                                                       writemsg(_("virts chosen: %s\n") % (mykey), 1)
-                                                       break
-                                       if mykey == mykey_orig:
-                                               mykey = str(virts[mykey][0])
-                                               writemsg(_("virts defaulted: %s\n") % (mykey), 1)
-                       #we only perform virtual expansion if we are passed a dbapi
-       else:
-               #specific cpv, no category, ie. "foo-1.0"
-               if mysplit:
-                       myp=mysplit[0]
-               else:
-                       # "foo" ?
-                       myp=mycpv
-               mykey=None
-               matches=[]
-               if mydb and hasattr(mydb, "categories"):
-                       for x in mydb.categories:
-                               if mydb.cp_list(x+"/"+myp,use_cache=use_cache):
-                                       matches.append(x+"/"+myp)
-               if len(matches) > 1:
-                       virtual_name_collision = False
-                       if len(matches) == 2:
-                               for x in matches:
-                                       if not x.startswith("virtual/"):
-                                               # Assume that the non-virtual is desired.  This helps
-                                               # avoid the ValueError for invalid deps that come from
-                                               # installed packages (during reverse blocker detection,
-                                               # for example).
-                                               mykey = x
-                                       else:
-                                               virtual_name_collision = True
-                       if not virtual_name_collision:
-                               # AmbiguousPackageName inherits from ValueError,
-                               # for backward compatibility with calling code
-                               # that already handles ValueError.
-                               raise portage.exception.AmbiguousPackageName(matches)
-               elif matches:
-                       mykey=matches[0]
-
-               if not mykey and not isinstance(mydb, list):
-                       if myp in virts_p:
-                               mykey=virts_p[myp][0]
-                       #again, we only perform virtual expansion if we have a dbapi (not a list)
-               if not mykey:
-                       mykey="null/"+myp
-       if mysplit:
-               if mysplit[2]=="r0":
-                       return mykey+"-"+mysplit[1]
-               else:
-                       return mykey+"-"+mysplit[1]+"-"+mysplit[2]
-       else:
-               return mykey
-
 def getmaskingreason(mycpv, metadata=None, settings=None, portdb=None, return_location=False):
        from portage.util import grablines
        if settings is None:
index c758491f1e3e18fb89f9184f36b881bfe6405bd4..dcd933f623b78ce2054a691c18eda6961e0ff676 100644 (file)
@@ -8,6 +8,7 @@ import re
 
 import portage
 portage.proxy.lazyimport.lazyimport(globals(),
+       'portage.dbapi.dep_expand:dep_expand',
        'portage.dep:match_from_list',
        'portage.locks:unlockfile',
        'portage.output:colorize',
@@ -16,7 +17,7 @@ portage.proxy.lazyimport.lazyimport(globals(),
 )
 
 from portage import os
-from portage import auxdbkeys, dep_expand
+from portage import auxdbkeys
 from portage.localization import _
 
 class dbapi(object):
index 18278c11434dc0142cf139b98a709da2cadc872d..13a5e4f3785ee2e479e028f05d8464324e574dba 100644 (file)
@@ -8,6 +8,7 @@ __all__ = ["bindbapi", "binarytree"]
 
 import portage
 portage.proxy.lazyimport.lazyimport(globals(),
+       'portage.dbapi.dep_expand:dep_expand',
        'portage.dep:dep_getkey,isjustname,match_from_list',
        'portage.output:EOutput,colorize',
        'portage.package.ebuild.doebuild:_vdb_use_conditional_atoms',
@@ -24,7 +25,7 @@ from portage.exception import InvalidPackageName, \
 from portage.const import EAPI
 from portage.localization import _
 
-from portage import dep_expand, _movefile
+from portage import _movefile
 from portage import os
 from portage import _encodings
 from portage import _unicode_decode
diff --git a/pym/portage/dbapi/cpv_expand.py b/pym/portage/dbapi/cpv_expand.py
new file mode 100644 (file)
index 0000000..587f237
--- /dev/null
@@ -0,0 +1,96 @@
+# Copyright 2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+__all__ = ["cpv_expand"]
+
+from portage.exception import AmbiguousPackageName
+from portage.localization import _
+from portage.util import writemsg
+from portage.versions import _pkgsplit
+
+def cpv_expand(mycpv, mydb=None, use_cache=1, settings=None):
+       """Given a string (packagename or virtual) expand it into a valid
+       cat/package string. Virtuals use the mydb to determine which provided
+       virtual is a valid choice and defaults to the first element when there
+       are no installed/available candidates."""
+       myslash=mycpv.split("/")
+       mysplit = _pkgsplit(myslash[-1])
+       if settings is None:
+               settings = globals()["settings"]
+       virts = settings.getvirtuals()
+       virts_p = settings.get_virts_p()
+       if len(myslash)>2:
+               # this is illegal case.
+               mysplit=[]
+               mykey=mycpv
+       elif len(myslash)==2:
+               if mysplit:
+                       mykey=myslash[0]+"/"+mysplit[0]
+               else:
+                       mykey=mycpv
+               if mydb and virts and mykey in virts:
+                       writemsg("mydb.__class__: %s\n" % (mydb.__class__), 1)
+                       if hasattr(mydb, "cp_list"):
+                               if not mydb.cp_list(mykey, use_cache=use_cache):
+                                       writemsg("virts[%s]: %s\n" % (str(mykey),virts[mykey]), 1)
+                                       mykey_orig = mykey[:]
+                                       for vkey in virts[mykey]:
+                                               # The virtuals file can contain a versioned atom, so
+                                               # it may be necessary to remove the operator and
+                                               # version from the atom before it is passed into
+                                               # dbapi.cp_list().
+                                               if mydb.cp_list(vkey.cp):
+                                                       mykey = str(vkey)
+                                                       writemsg(_("virts chosen: %s\n") % (mykey), 1)
+                                                       break
+                                       if mykey == mykey_orig:
+                                               mykey = str(virts[mykey][0])
+                                               writemsg(_("virts defaulted: %s\n") % (mykey), 1)
+                       #we only perform virtual expansion if we are passed a dbapi
+       else:
+               #specific cpv, no category, ie. "foo-1.0"
+               if mysplit:
+                       myp=mysplit[0]
+               else:
+                       # "foo" ?
+                       myp=mycpv
+               mykey=None
+               matches=[]
+               if mydb and hasattr(mydb, "categories"):
+                       for x in mydb.categories:
+                               if mydb.cp_list(x+"/"+myp,use_cache=use_cache):
+                                       matches.append(x+"/"+myp)
+               if len(matches) > 1:
+                       virtual_name_collision = False
+                       if len(matches) == 2:
+                               for x in matches:
+                                       if not x.startswith("virtual/"):
+                                               # Assume that the non-virtual is desired.  This helps
+                                               # avoid the ValueError for invalid deps that come from
+                                               # installed packages (during reverse blocker detection,
+                                               # for example).
+                                               mykey = x
+                                       else:
+                                               virtual_name_collision = True
+                       if not virtual_name_collision:
+                               # AmbiguousPackageName inherits from ValueError,
+                               # for backward compatibility with calling code
+                               # that already handles ValueError.
+                               raise AmbiguousPackageName(matches)
+               elif matches:
+                       mykey=matches[0]
+
+               if not mykey and not isinstance(mydb, list):
+                       if myp in virts_p:
+                               mykey=virts_p[myp][0]
+                       #again, we only perform virtual expansion if we have a dbapi (not a list)
+               if not mykey:
+                       mykey="null/"+myp
+       if mysplit:
+               if mysplit[2]=="r0":
+                       return mykey+"-"+mysplit[1]
+               else:
+                       return mykey+"-"+mysplit[1]+"-"+mysplit[2]
+       else:
+               return mykey
diff --git a/pym/portage/dbapi/dep_expand.py b/pym/portage/dbapi/dep_expand.py
new file mode 100644 (file)
index 0000000..53a666e
--- /dev/null
@@ -0,0 +1,48 @@
+# Copyright 2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+__all__ = ["dep_expand"]
+
+import re
+
+from portage.dbapi.cpv_expand import cpv_expand
+from portage.dep import Atom, isvalidatom
+from portage.exception import InvalidAtom
+from portage.versions import catsplit
+
+def dep_expand(mydep, mydb=None, use_cache=1, settings=None):
+       '''
+       @rtype: Atom
+       '''
+       if not len(mydep):
+               return mydep
+       if mydep[0]=="*":
+               mydep=mydep[1:]
+       orig_dep = mydep
+       if isinstance(orig_dep, Atom):
+               mydep = orig_dep.cp
+       else:
+               mydep = orig_dep
+               has_cat = '/' in orig_dep
+               if not has_cat:
+                       alphanum = re.search(r'\w', orig_dep)
+                       if alphanum:
+                               mydep = orig_dep[:alphanum.start()] + "null/" + \
+                                       orig_dep[alphanum.start():]
+               try:
+                       mydep = Atom(mydep)
+               except InvalidAtom:
+                       # Missing '=' prefix is allowed for backward compatibility.
+                       if not isvalidatom("=" + mydep):
+                               raise
+                       mydep = Atom('=' + mydep)
+                       orig_dep = '=' + orig_dep
+               if not has_cat:
+                       null_cat, pn = catsplit(mydep.cp)
+                       mydep = pn
+               else:
+                       mydep = mydep.cp
+       expanded = cpv_expand(mydep, mydb=mydb,
+               use_cache=use_cache, settings=settings)
+       return Atom(orig_dep.replace(mydep, expanded, 1))
index 7dd81f7b5f62fb184a4c8a5adb63b2a24f42723c..39dd6eb8ced0d2f4e26bf757f1bb52a4a9e3269a 100644 (file)
@@ -11,6 +11,7 @@ __all__ = [
 import portage
 portage.proxy.lazyimport.lazyimport(globals(),
        'portage.checksum',
+       'portage.dbapi.dep_expand:dep_expand',
        'portage.dep:dep_getkey,flatten,match_from_list,paren_reduce,use_reduce',
        'portage.env.loaders:KeyValuePairFileLoader',
        'portage.package.ebuild.doebuild:doebuild',
@@ -30,7 +31,7 @@ from portage.localization import _
 from portage.manifest import Manifest
 
 from portage import eclass_cache, auxdbkeys, \
-       dep_expand, eapi_is_supported, dep_check, \
+       eapi_is_supported, dep_check, \
        _eapi_is_deprecated
 from portage import os
 from portage import _encodings
index aefb53f9678b9ca16a9f48853a075f373953cc3c..b2983a568ca009797bafa54bda50f429dd5283aa 100644 (file)
@@ -12,6 +12,7 @@ __all__ = ["PreservedLibsRegistry", "LinkageMap",
 import portage
 portage.proxy.lazyimport.lazyimport(globals(),
        'portage.checksum:_perform_md5_merge@perform_md5',
+       'portage.dbapi.dep_expand:dep_expand',
        'portage.dep:dep_getkey,isjustname,flatten,match_from_list,' + \
                'use_reduce,paren_reduce,_slot_re',
        'portage.elog:elog_process',
@@ -40,8 +41,7 @@ from portage.exception import CommandNotFound, \
        FileNotFound, PermissionDenied, UnsupportedAPIException
 from portage.localization import _
 
-from portage import dep_expand, \
-       abssymlink, movefile, _movefile, bsd_chflags
+from portage import abssymlink, movefile, _movefile, bsd_chflags
 
 # This is a special version of the os module, wrapped for unicode support.
 from portage import os
diff --git a/pym/portage/package/ebuild/digestcheck.py b/pym/portage/package/ebuild/digestcheck.py
new file mode 100644 (file)
index 0000000..65d2494
--- /dev/null
@@ -0,0 +1,154 @@
+# Copyright 2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+__all__ = ['digestcheck']
+
+from portage import os, _encodings, _split_ebuild_name_glep55, _unicode_decode
+from portage.exception import DigestException, FileNotFound
+from portage.localization import _
+from portage.manifest import Manifest
+from portage.output import EOutput
+from portage.util import writemsg
+
+def digestcheck(myfiles, mysettings, strict=0, justmanifest=0):
+       """
+       Verifies checksums. Assumes all files have been downloaded.
+       @rtype: int
+       @returns: 1 on success and 0 on failure
+       """
+       if mysettings.get("EBUILD_SKIP_MANIFEST") == "1":
+               return 1
+       pkgdir = mysettings["O"]
+       manifest_path = os.path.join(pkgdir, "Manifest")
+       if not os.path.exists(manifest_path):
+               writemsg(_("!!! Manifest file not found: '%s'\n") % manifest_path,
+                       noiselevel=-1)
+               if strict:
+                       return 0
+               else:
+                       return 1
+       mf = Manifest(pkgdir, mysettings["DISTDIR"])
+       manifest_empty = True
+       for d in mf.fhashdict.values():
+               if d:
+                       manifest_empty = False
+                       break
+       if manifest_empty:
+               writemsg(_("!!! Manifest is empty: '%s'\n") % manifest_path,
+                       noiselevel=-1)
+               if strict:
+                       return 0
+               else:
+                       return 1
+       eout = EOutput()
+       eout.quiet = mysettings.get("PORTAGE_QUIET", None) == "1"
+       try:
+               if strict and "PORTAGE_PARALLEL_FETCHONLY" not in mysettings:
+                       eout.ebegin(_("checking ebuild checksums ;-)"))
+                       mf.checkTypeHashes("EBUILD")
+                       eout.eend(0)
+                       eout.ebegin(_("checking auxfile checksums ;-)"))
+                       mf.checkTypeHashes("AUX")
+                       eout.eend(0)
+                       eout.ebegin(_("checking miscfile checksums ;-)"))
+                       mf.checkTypeHashes("MISC", ignoreMissingFiles=True)
+                       eout.eend(0)
+               for f in myfiles:
+                       eout.ebegin(_("checking %s ;-)") % f)
+                       ftype = mf.findFile(f)
+                       if ftype is None:
+                               raise KeyError(f)
+                       mf.checkFileHashes(ftype, f)
+                       eout.eend(0)
+       except KeyError as e:
+               eout.eend(1)
+               writemsg(_("\n!!! Missing digest for %s\n") % str(e), noiselevel=-1)
+               return 0
+       except FileNotFound as e:
+               eout.eend(1)
+               writemsg(_("\n!!! A file listed in the Manifest could not be found: %s\n") % str(e),
+                       noiselevel=-1)
+               return 0
+       except DigestException as e:
+               eout.eend(1)
+               writemsg(_("\n!!! Digest verification failed:\n"), noiselevel=-1)
+               writemsg("!!! %s\n" % e.value[0], noiselevel=-1)
+               writemsg(_("!!! Reason: %s\n") % e.value[1], noiselevel=-1)
+               writemsg(_("!!! Got: %s\n") % e.value[2], noiselevel=-1)
+               writemsg(_("!!! Expected: %s\n") % e.value[3], noiselevel=-1)
+               return 0
+       # Make sure that all of the ebuilds are actually listed in the Manifest.
+       glep55 = 'parse-eapi-glep-55' in mysettings.features
+       for f in os.listdir(pkgdir):
+               pf = None
+               if glep55:
+                       pf, eapi = _split_ebuild_name_glep55(f)
+               elif f[-7:] == '.ebuild':
+                       pf = f[:-7]
+               if pf is not None and not mf.hasFile("EBUILD", f):
+                       writemsg(_("!!! A file is not listed in the Manifest: '%s'\n") % \
+                               os.path.join(pkgdir, f), noiselevel=-1)
+                       if strict:
+                               return 0
+       """ epatch will just grab all the patches out of a directory, so we have to
+       make sure there aren't any foreign files that it might grab."""
+       filesdir = os.path.join(pkgdir, "files")
+
+       for parent, dirs, files in os.walk(filesdir):
+               try:
+                       parent = _unicode_decode(parent,
+                               encoding=_encodings['fs'], errors='strict')
+               except UnicodeDecodeError:
+                       parent = _unicode_decode(parent,
+                               encoding=_encodings['fs'], errors='replace')
+                       writemsg(_("!!! Path contains invalid "
+                               "character(s) for encoding '%s': '%s'") \
+                               % (_encodings['fs'], parent), noiselevel=-1)
+                       if strict:
+                               return 0
+                       continue
+               for d in dirs:
+                       d_bytes = d
+                       try:
+                               d = _unicode_decode(d,
+                                       encoding=_encodings['fs'], errors='strict')
+                       except UnicodeDecodeError:
+                               d = _unicode_decode(d,
+                                       encoding=_encodings['fs'], errors='replace')
+                               writemsg(_("!!! Path contains invalid "
+                                       "character(s) for encoding '%s': '%s'") \
+                                       % (_encodings['fs'], os.path.join(parent, d)),
+                                       noiselevel=-1)
+                               if strict:
+                                       return 0
+                               dirs.remove(d_bytes)
+                               continue
+                       if d.startswith(".") or d == "CVS":
+                               dirs.remove(d_bytes)
+               for f in files:
+                       try:
+                               f = _unicode_decode(f,
+                                       encoding=_encodings['fs'], errors='strict')
+                       except UnicodeDecodeError:
+                               f = _unicode_decode(f,
+                                       encoding=_encodings['fs'], errors='replace')
+                               if f.startswith("."):
+                                       continue
+                               f = os.path.join(parent, f)[len(filesdir) + 1:]
+                               writemsg(_("!!! File name contains invalid "
+                                       "character(s) for encoding '%s': '%s'") \
+                                       % (_encodings['fs'], f), noiselevel=-1)
+                               if strict:
+                                       return 0
+                               continue
+                       if f.startswith("."):
+                               continue
+                       f = os.path.join(parent, f)[len(filesdir) + 1:]
+                       file_type = mf.findFile(f)
+                       if file_type != "AUX" and not f.startswith("digest-"):
+                               writemsg(_("!!! A file is not listed in the Manifest: '%s'\n") % \
+                                       os.path.join(filesdir, f), noiselevel=-1)
+                               if strict:
+                                       return 0
+       return 1
index f77f7c869e2c5e692a24bba0da79551152cfd017..c6a85adccfd8de351dffaa123e928b2bb9077b05 100644 (file)
@@ -21,11 +21,12 @@ import time
 import portage
 portage.proxy.lazyimport.lazyimport(globals(),
        'portage.package.ebuild.config:check_config_instance',
-       'portage.util.digestgen:digestgen',
+       'portage.package.ebuild.digestcheck:digestcheck',
+       'portage.package.ebuild.digestgen:digestgen',
        'portage.util.ExtractKernelVersion:ExtractKernelVersion'
 )
 
-from portage import auxdbkeys, bsd_chflags, dep_check, digestcheck, \
+from portage import auxdbkeys, bsd_chflags, dep_check, \
        eapi_is_supported, merge, os, selinux, StringIO, \
        unmerge, _encodings, _parse_eapi_ebuild_head, _os_merge, \
        _shell_quote, _split_ebuild_name_glep55, _unicode_decode, _unicode_encode