From: Fabian Groffen Date: Sat, 27 Feb 2010 19:26:00 +0000 (-0000) Subject: Merged from trunk -r15455:15460 X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=ba2203ecbe30080021bb940f06ee59cbf8c2b750;p=portage.git Merged from trunk -r15455:15460 | 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 --- diff --git a/bin/quickpkg b/bin/quickpkg index 5679d964b..208a88aef 100755 --- a/bin/quickpkg +++ b/bin/quickpkg @@ -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 diff --git a/bin/repoman b/bin/repoman index 4761a12b9..5a924f5f1 100755 --- a/bin/repoman +++ b/bin/repoman @@ -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 diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index 071b8e8d7..0f113416f 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -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: diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index 8eb4cf9aa..05839b8be 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -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 " + \ diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index 89349822a..d7adea83e 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -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)) diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py index 4b146cc96..acae2b545 100644 --- a/pym/_emerge/main.py +++ b/pym/_emerge/main.py @@ -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 " + \ diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index d066d3452..5edbf843f 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -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: diff --git a/pym/portage/dbapi/__init__.py b/pym/portage/dbapi/__init__.py index c758491f1..dcd933f62 100644 --- a/pym/portage/dbapi/__init__.py +++ b/pym/portage/dbapi/__init__.py @@ -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): diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py index 18278c114..13a5e4f37 100644 --- a/pym/portage/dbapi/bintree.py +++ b/pym/portage/dbapi/bintree.py @@ -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 index 000000000..587f2372c --- /dev/null +++ b/pym/portage/dbapi/cpv_expand.py @@ -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 index 000000000..53a666ee0 --- /dev/null +++ b/pym/portage/dbapi/dep_expand.py @@ -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)) diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index 7dd81f7b5..39dd6eb8c 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -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 diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index aefb53f96..b2983a568 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -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 index 000000000..65d249489 --- /dev/null +++ b/pym/portage/package/ebuild/digestcheck.py @@ -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 diff --git a/pym/portage/util/digestgen.py b/pym/portage/package/ebuild/digestgen.py similarity index 100% rename from pym/portage/util/digestgen.py rename to pym/portage/package/ebuild/digestgen.py diff --git a/pym/portage/package/ebuild/doebuild.py b/pym/portage/package/ebuild/doebuild.py index f77f7c869..c6a85adcc 100644 --- a/pym/portage/package/ebuild/doebuild.py +++ b/pym/portage/package/ebuild/doebuild.py @@ -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