Merged from trunk -r15465:15470
authorFabian Groffen <grobian@gentoo.org>
Sat, 27 Feb 2010 20:02:45 +0000 (20:02 -0000)
committerFabian Groffen <grobian@gentoo.org>
Sat, 27 Feb 2010 20:02:45 +0000 (20:02 -0000)
   | 15466   | Splid deprecated functions into a _deprecated module.        |
   | zmedico |                                                              |

   | 15467   | Fix broken dep_expand import from previous commit.           |
   | zmedico |                                                              |

   | 15468   | Move merge and unmerge functions to the vartree module.      |
   | zmedico |                                                              |

   | 15469   | Move getvirtuals to _deprecated module.                      |
   | zmedico |                                                              |

   | 15470   | Eliminate the PhaseCheck constructor and make                |
   | zmedico | PhaseCheck.phases_re a class attribute. Thanks to Sebastian  |
   |         | Pipping <sping@g.o> for the initial patch.                   |

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

pym/portage/__init__.py
pym/portage/_deprecated.py [new file with mode: 0644]
pym/portage/dbapi/__init__.py
pym/portage/dbapi/vartree.py
pym/repoman/checks.py

index ad372fd79ef0ef7b36c2342be27f3524d9fbebbc..d894fbdc6eb25d674e43e5b953d109c797e5de94 100644 (file)
@@ -86,7 +86,7 @@ try:
                'portage.dbapi.dep_expand:dep_expand',
                'portage.dbapi.porttree:close_portdbapi_caches,FetchlistDict,' + \
                        'portagetree,portdbapi',
-               'portage.dbapi.vartree:vardbapi,vartree,dblink',
+               'portage.dbapi.vartree:dblink,merge,unmerge,vardbapi,vartree',
                'portage.dbapi.virtual:fakedbapi',
                'portage.dep',
                'portage.dep:best_match_to_list,dep_getcpv,dep_getkey,' + \
@@ -136,6 +136,7 @@ try:
                        'cpv_getkey@getCPFromCPV,endversion_keys,' + \
                        'suffix_value@endversion,pkgcmp,pkgsplit,vercmp,ververify',
                'portage.xpak',
+               'portage._deprecated:dep_virtual,digestParseFile,getvirtuals,pkgmerge',
        )
 
        import portage.const
@@ -543,30 +544,6 @@ def abssymlink(symlink):
                mylink=mydir+"/"+mylink
        return os.path.normpath(mylink)
 
-def digestParseFile(myfilename, mysettings=None):
-       """(filename) -- Parses a given file for entries matching:
-       <checksumkey> <checksum_hex_string> <filename> <filesize>
-       Ignores lines that don't start with a valid checksum identifier
-       and returns a dict with the filenames as keys and {checksumkey:checksum}
-       as the values.
-       DEPRECATED: this function is now only a compability wrapper for
-                   portage.manifest.Manifest()."""
-
-       warnings.warn("portage.digestParseFile() is deprecated",
-               DeprecationWarning, stacklevel=2)
-
-       mysplit = myfilename.split(os.sep)
-       if mysplit[-2] == "files" and mysplit[-1].startswith("digest-"):
-               pkgdir = os.sep + os.sep.join(mysplit[:-2]).strip(os.sep)
-       elif mysplit[-1] == "Manifest":
-               pkgdir = os.sep + os.sep.join(mysplit[:-1]).strip(os.sep)
-
-       if mysettings is None:
-               global settings
-               mysettings = config(clone=settings)
-
-       return Manifest(pkgdir, mysettings["DISTDIR"]).getDigests()
-
 _testing_eapis = frozenset()
 _deprecated_eapis = frozenset(["3_pre2", "3_pre1", "2_pre3", "2_pre2", "2_pre1"])
 
@@ -638,66 +615,6 @@ def _movefile(src, dest, **kwargs):
                raise portage.exception.PortageException(
                        "mv '%s' '%s'" % (src, dest))
 
-def merge(mycat, mypkg, pkgloc, infloc, myroot, mysettings, myebuild=None,
-       mytree=None, mydbapi=None, vartree=None, prev_mtimes=None, blockers=None,
-       scheduler=None):
-       if not os.access(myroot + EPREFIX_LSTRIP, os.W_OK):
-               writemsg(_("Permission denied: access('%s', W_OK)\n") %
-                               (myroot + EPREFIX_LSTRIP), noiselevel=-1)
-               return errno.EACCES
-       mylink = dblink(mycat, mypkg, myroot, mysettings, treetype=mytree,
-               vartree=vartree, blockers=blockers, scheduler=scheduler)
-       return mylink.merge(pkgloc, infloc, myroot, myebuild,
-               mydbapi=mydbapi, prev_mtimes=prev_mtimes)
-
-def unmerge(cat, pkg, myroot, mysettings, mytrimworld=1, vartree=None,
-       ldpath_mtimes=None, scheduler=None):
-       mylink = dblink(cat, pkg, myroot, mysettings, treetype="vartree",
-               vartree=vartree, scheduler=scheduler)
-       vartree = mylink.vartree
-       try:
-               mylink.lockdb()
-               if mylink.exists():
-                       vartree.dbapi.plib_registry.load()
-                       vartree.dbapi.plib_registry.pruneNonExisting()
-                       retval = mylink.unmerge(trimworld=mytrimworld, cleanup=1,
-                               ldpath_mtimes=ldpath_mtimes)
-                       if retval == os.EX_OK:
-                               mylink.delete()
-                       return retval
-               return os.EX_OK
-       finally:
-               vartree.dbapi.linkmap._clear_cache()
-               mylink.unlockdb()
-
-def dep_virtual(mysplit, mysettings):
-       "Does virtual dependency conversion"
-       warnings.warn("portage.dep_virtual() is deprecated",
-               DeprecationWarning, stacklevel=2)
-       newsplit=[]
-       myvirtuals = mysettings.getvirtuals()
-       for x in mysplit:
-               if isinstance(x, list):
-                       newsplit.append(dep_virtual(x, mysettings))
-               else:
-                       mykey=dep_getkey(x)
-                       mychoices = myvirtuals.get(mykey, None)
-                       if mychoices:
-                               if len(mychoices) == 1:
-                                       a = x.replace(mykey, dep_getkey(mychoices[0]), 1)
-                               else:
-                                       if x[0]=="!":
-                                               # blocker needs "and" not "or(||)".
-                                               a=[]
-                                       else:
-                                               a=['||']
-                                       for y in mychoices:
-                                               a.append(x.replace(mykey, dep_getkey(y), 1))
-                               newsplit.append(a)
-                       else:
-                               newsplit.append(x)
-       return newsplit
-
 auxdbkeys = (
   'DEPEND',    'RDEPEND',   'SLOT',      'SRC_URI',
        'RESTRICT',  'HOMEPAGE',  'LICENSE',   'DESCRIPTION',
@@ -708,162 +625,6 @@ auxdbkeys = (
 )
 auxdbkeylen=len(auxdbkeys)
 
-def pkgmerge(mytbz2, myroot, mysettings, mydbapi=None,
-       vartree=None, prev_mtimes=None, blockers=None):
-       """will merge a .tbz2 file, returning a list of runtime dependencies
-               that must be satisfied, or None if there was a merge error.     This
-               code assumes the package exists."""
-
-       warnings.warn("portage.pkgmerge() is deprecated",
-               DeprecationWarning, stacklevel=2)
-
-       global db
-       if mydbapi is None:
-               mydbapi = db[myroot]["bintree"].dbapi
-       if vartree is None:
-               vartree = db[myroot]["vartree"]
-       if mytbz2[-5:]!=".tbz2":
-               print(_("!!! Not a .tbz2 file"))
-               return 1
-
-       tbz2_lock = None
-       mycat = None
-       mypkg = None
-       did_merge_phase = False
-       success = False
-       try:
-               """ Don't lock the tbz2 file because the filesytem could be readonly or
-               shared by a cluster."""
-               #tbz2_lock = portage.locks.lockfile(mytbz2, wantnewlockfile=1)
-
-               mypkg = os.path.basename(mytbz2)[:-5]
-               xptbz2 = portage.xpak.tbz2(mytbz2)
-               mycat = xptbz2.getfile(_unicode_encode("CATEGORY",
-                       encoding=_encodings['repo.content']))
-               if not mycat:
-                       writemsg(_("!!! CATEGORY info missing from info chunk, aborting...\n"),
-                               noiselevel=-1)
-                       return 1
-               mycat = _unicode_decode(mycat,
-                       encoding=_encodings['repo.content'], errors='replace')
-               mycat = mycat.strip()
-
-               buildprefix = xptbz2.getfile("EPREFIX")
-               if not buildprefix:
-                       writemsg("!!! EPREFIX info missing from info chunk, aborting...\n",
-                               noiselevel=-1)
-                       return 1
-               buildprefix = buildprefix.strip()
-
-               # These are the same directories that would be used at build time.
-               builddir = os.path.join(
-                       mysettings["PORTAGE_TMPDIR"], "portage", mycat, mypkg)
-               catdir = os.path.dirname(builddir)
-               # if the prefix differs, we copy it to the image after extraction
-               if (buildprefix != EPREFIX):
-                       pkgloc = os.path.join(builddir, "work")
-               else:
-                       pkgloc = os.path.join(builddir, "image")
-               infloc = os.path.join(builddir, "build-info")
-               myebuild = os.path.join(
-                       infloc, os.path.basename(mytbz2)[:-4] + "ebuild")
-               portage.util.ensure_dirs(os.path.dirname(catdir),
-                       uid=portage_uid, gid=portage_gid, mode=0o70, mask=0)
-               catdir_lock = portage.locks.lockdir(catdir)
-               portage.util.ensure_dirs(catdir,
-                       uid=portage_uid, gid=portage_gid, mode=0o70, mask=0)
-               try:
-                       shutil.rmtree(builddir)
-               except (IOError, OSError) as e:
-                       if e.errno != errno.ENOENT:
-                               raise
-                       del e
-               for mydir in (builddir, pkgloc, infloc):
-                       portage.util.ensure_dirs(mydir, uid=portage_uid,
-                               gid=portage_gid, mode=0o755)
-               writemsg_stdout(_(">>> Extracting info\n"))
-               xptbz2.unpackinfo(infloc)
-               mysettings.setcpv(mycat + "/" + mypkg, mydb=mydbapi)
-               # Store the md5sum in the vdb.
-               fp = open(_unicode_encode(os.path.join(infloc, 'BINPKGMD5')), 'w')
-               fp.write(str(portage.checksum.perform_md5(mytbz2))+"\n")
-               fp.close()
-
-               # This gives bashrc users an opportunity to do various things
-               # such as remove binary packages after they're installed.
-               mysettings["PORTAGE_BINPKG_FILE"] = mytbz2
-               mysettings.backup_changes("PORTAGE_BINPKG_FILE")
-               debug = mysettings.get("PORTAGE_DEBUG", "") == "1"
-
-               # We want to install in "our" prefix, not the binary one
-               mysettings["EPREFIX"] = EPREFIX
-               # Store "our" prefix in the vdb.
-               fp = open(os.path.join(infloc, "EPREFIX"), "w")
-               fp.write(EPREFIX+"\n")
-               fp.close()
-
-               # Eventually we'd like to pass in the saved ebuild env here.
-               retval = doebuild(myebuild, "setup", myroot, mysettings, debug=debug,
-                       tree="bintree", mydbapi=mydbapi, vartree=vartree)
-               if retval != os.EX_OK:
-                       writemsg(_("!!! Setup failed: %s\n") % retval, noiselevel=-1)
-                       return retval
-
-               writemsg_stdout(_(">>> Extracting %s\n") % mypkg)
-               retval = portage.process.spawn_bash(
-                       "bzip2 -dqc -- '%s' | tar -xp -C '%s' -f -" % (mytbz2, pkgloc),
-                       env=mysettings.environ())
-               if retval != os.EX_OK:
-                       writemsg(_("!!! Error Extracting '%s'\n") % mytbz2, noiselevel=-1)
-                       return retval
-               #portage.locks.unlockfile(tbz2_lock)
-               #tbz2_lock = None
-
-               # the extracted package put everything in buildprefix, so we
-               # just have to move it to the right EPREFIX
-               if buildprefix != EPREFIX:
-                       writemsg_stdout(">>> Adjusting Prefix to %s\n" % EPREFIX)
-                       b = os.path.join(pkgloc, buildprefix.lstrip(os.path.sep))
-                       i = os.path.join(builddir, "image", EPREFIX_LSTRIP)
-                       # make sure the directory structure for EPREFIX is set up in
-                       # the image, but avoid the last directory being there,
-                       # otherwise chpathtool will complain
-                       portage.util.ensure_dirs(i)
-                       os.rmdir(i)
-                       retval = portage.process.spawn_bash(
-                               "chpathtool -q '%s' '%s' '%s' '%s'" % (b, i, buildprefix, EPREFIX),
-                               env=mysettings.environ())
-                       if retval != os.EX_OK:
-                               writemsg("!!! Adjusing to Prefix failed!\n", noiselevel=-1)
-                               return retval
-                       pkgloc = os.path.join(builddir, "image")
-
-               mylink = dblink(mycat, mypkg, myroot, mysettings, vartree=vartree,
-                       treetype="bintree", blockers=blockers)
-               retval = mylink.merge(pkgloc, infloc, myroot, myebuild, cleanup=0,
-                       mydbapi=mydbapi, prev_mtimes=prev_mtimes)
-               did_merge_phase = True
-               success = retval == os.EX_OK
-               return retval
-       finally:
-               mysettings.pop("PORTAGE_BINPKG_FILE", None)
-               if tbz2_lock:
-                       portage.locks.unlockfile(tbz2_lock)
-               if True:
-                       if not did_merge_phase:
-                               # The merge phase handles this already.  Callers don't know how
-                               # far this function got, so we have to call elog_process() here
-                               # so that it's only called once.
-                               from portage.elog import elog_process
-                               elog_process(mycat + "/" + mypkg, mysettings)
-                       try:
-                               if success:
-                                       shutil.rmtree(builddir)
-                       except (IOError, OSError) as e:
-                               if e.errno != errno.ENOENT:
-                                       raise
-                               del e
-
 def deprecated_profile_check(settings=None):
        config_root = "/"
        if settings is not None:
@@ -894,17 +655,6 @@ def deprecated_profile_check(settings=None):
                writemsg("\n\n", noiselevel=-1)
        return True
 
-# gets virtual package settings
-def getvirtuals(myroot):
-       """
-       Calls portage.settings.getvirtuals().
-       @deprecated: Use portage.settings.getvirtuals().
-       """
-       global settings
-       warnings.warn("portage.getvirtuals() is deprecated",
-               DeprecationWarning, stacklevel=2)
-       return settings.getvirtuals()
-
 def commit_mtimedb(mydict=None, filename=None):
        if mydict is None:
                global mtimedb
diff --git a/pym/portage/_deprecated.py b/pym/portage/_deprecated.py
new file mode 100644 (file)
index 0000000..a2b5331
--- /dev/null
@@ -0,0 +1,228 @@
+# Copyright 2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+from __future__ import print_function
+
+import errno
+import shutil
+import warnings
+
+import portage
+from portage import os, _encodings, _unicode_decode, _unicode_encode
+from portage.data import portage_gid, portage_uid
+from portage.dep import dep_getkey
+from portage.localization import _
+from portage.manifest import Manifest
+from portage.util import writemsg, writemsg_stdout
+
+def digestParseFile(myfilename, mysettings=None):
+       """(filename) -- Parses a given file for entries matching:
+       <checksumkey> <checksum_hex_string> <filename> <filesize>
+       Ignores lines that don't start with a valid checksum identifier
+       and returns a dict with the filenames as keys and {checksumkey:checksum}
+       as the values.
+       DEPRECATED: this function is now only a compability wrapper for
+                   portage.manifest.Manifest()."""
+
+       warnings.warn("portage.digestParseFile() is deprecated",
+               DeprecationWarning, stacklevel=2)
+
+       mysplit = myfilename.split(os.sep)
+       if mysplit[-2] == "files" and mysplit[-1].startswith("digest-"):
+               pkgdir = os.sep + os.sep.join(mysplit[:-2]).strip(os.sep)
+       elif mysplit[-1] == "Manifest":
+               pkgdir = os.sep + os.sep.join(mysplit[:-1]).strip(os.sep)
+
+       return Manifest(pkgdir, None).getDigests()
+
+def dep_virtual(mysplit, mysettings):
+       "Does virtual dependency conversion"
+       warnings.warn("portage.dep_virtual() is deprecated",
+               DeprecationWarning, stacklevel=2)
+       newsplit=[]
+       myvirtuals = mysettings.getvirtuals()
+       for x in mysplit:
+               if isinstance(x, list):
+                       newsplit.append(dep_virtual(x, mysettings))
+               else:
+                       mykey=dep_getkey(x)
+                       mychoices = myvirtuals.get(mykey, None)
+                       if mychoices:
+                               if len(mychoices) == 1:
+                                       a = x.replace(mykey, dep_getkey(mychoices[0]), 1)
+                               else:
+                                       if x[0]=="!":
+                                               # blocker needs "and" not "or(||)".
+                                               a=[]
+                                       else:
+                                               a=['||']
+                                       for y in mychoices:
+                                               a.append(x.replace(mykey, dep_getkey(y), 1))
+                               newsplit.append(a)
+                       else:
+                               newsplit.append(x)
+       return newsplit
+
+def getvirtuals(myroot):
+       """
+       Calls portage.settings.getvirtuals().
+       @deprecated: Use portage.settings.getvirtuals().
+       """
+       warnings.warn("portage.getvirtuals() is deprecated",
+               DeprecationWarning, stacklevel=2)
+       return portage.settings.getvirtuals()
+
+def pkgmerge(mytbz2, myroot, mysettings, mydbapi=None,
+       vartree=None, prev_mtimes=None, blockers=None):
+       """will merge a .tbz2 file, returning a list of runtime dependencies
+               that must be satisfied, or None if there was a merge error.     This
+               code assumes the package exists."""
+
+       warnings.warn("portage.pkgmerge() is deprecated",
+               DeprecationWarning, stacklevel=2)
+
+       if mydbapi is None:
+               mydbapi = portage.db[myroot]["bintree"].dbapi
+       if vartree is None:
+               vartree = portage.db[myroot]["vartree"]
+       if mytbz2[-5:]!=".tbz2":
+               print(_("!!! Not a .tbz2 file"))
+               return 1
+
+       tbz2_lock = None
+       mycat = None
+       mypkg = None
+       did_merge_phase = False
+       success = False
+       try:
+               """ Don't lock the tbz2 file because the filesytem could be readonly or
+               shared by a cluster."""
+               #tbz2_lock = portage.locks.lockfile(mytbz2, wantnewlockfile=1)
+
+               mypkg = os.path.basename(mytbz2)[:-5]
+               xptbz2 = portage.xpak.tbz2(mytbz2)
+               mycat = xptbz2.getfile(_unicode_encode("CATEGORY",
+                       encoding=_encodings['repo.content']))
+               if not mycat:
+                       writemsg(_("!!! CATEGORY info missing from info chunk, aborting...\n"),
+                               noiselevel=-1)
+                       return 1
+               mycat = _unicode_decode(mycat,
+                       encoding=_encodings['repo.content'], errors='replace')
+               mycat = mycat.strip()
+
+               buildprefix = xptbz2.getfile("EPREFIX")
+               if not buildprefix:
+                       writemsg("!!! EPREFIX info missing from info chunk, aborting...\n",
+                               noiselevel=-1)
+                       return 1
+               buildprefix = buildprefix.strip()
+
+               # These are the same directories that would be used at build time.
+               builddir = os.path.join(
+                       mysettings["PORTAGE_TMPDIR"], "portage", mycat, mypkg)
+               catdir = os.path.dirname(builddir)
+               # if the prefix differs, we copy it to the image after extraction
+               if (buildprefix != EPREFIX):
+                       pkgloc = os.path.join(builddir, "work")
+               else:
+                       pkgloc = os.path.join(builddir, "image")
+               infloc = os.path.join(builddir, "build-info")
+               myebuild = os.path.join(
+                       infloc, os.path.basename(mytbz2)[:-4] + "ebuild")
+               portage.util.ensure_dirs(os.path.dirname(catdir),
+                       uid=portage_uid, gid=portage_gid, mode=0o70, mask=0)
+               portage.util.ensure_dirs(catdir,
+                       uid=portage_uid, gid=portage_gid, mode=0o70, mask=0)
+               try:
+                       shutil.rmtree(builddir)
+               except (IOError, OSError) as e:
+                       if e.errno != errno.ENOENT:
+                               raise
+                       del e
+               for mydir in (builddir, pkgloc, infloc):
+                       portage.util.ensure_dirs(mydir, uid=portage_uid,
+                               gid=portage_gid, mode=0o755)
+               writemsg_stdout(_(">>> Extracting info\n"))
+               xptbz2.unpackinfo(infloc)
+               mysettings.setcpv(mycat + "/" + mypkg, mydb=mydbapi)
+               # Store the md5sum in the vdb.
+               fp = open(_unicode_encode(os.path.join(infloc, 'BINPKGMD5')), 'w')
+               fp.write(str(portage.checksum.perform_md5(mytbz2))+"\n")
+               fp.close()
+
+               # This gives bashrc users an opportunity to do various things
+               # such as remove binary packages after they're installed.
+               mysettings["PORTAGE_BINPKG_FILE"] = mytbz2
+               mysettings.backup_changes("PORTAGE_BINPKG_FILE")
+               debug = mysettings.get("PORTAGE_DEBUG", "") == "1"
+
+               # We want to install in "our" prefix, not the binary one
+               mysettings["EPREFIX"] = EPREFIX
+               # Store "our" prefix in the vdb.
+               fp = open(os.path.join(infloc, "EPREFIX"), "w")
+               fp.write(EPREFIX+"\n")
+               fp.close()
+
+               # Eventually we'd like to pass in the saved ebuild env here.
+               retval = portage.doebuild(myebuild, "setup", myroot, mysettings, debug=debug,
+                       tree="bintree", mydbapi=mydbapi, vartree=vartree)
+               if retval != os.EX_OK:
+                       writemsg(_("!!! Setup failed: %s\n") % retval, noiselevel=-1)
+                       return retval
+
+               writemsg_stdout(_(">>> Extracting %s\n") % mypkg)
+               retval = portage.process.spawn_bash(
+                       "bzip2 -dqc -- '%s' | tar -xp -C '%s' -f -" % (mytbz2, pkgloc),
+                       env=mysettings.environ())
+               if retval != os.EX_OK:
+                       writemsg(_("!!! Error Extracting '%s'\n") % mytbz2, noiselevel=-1)
+                       return retval
+               #portage.locks.unlockfile(tbz2_lock)
+               #tbz2_lock = None
+
+               # the extracted package put everything in buildprefix, so we
+               # just have to move it to the right EPREFIX
+               if buildprefix != EPREFIX:
+                       writemsg_stdout(">>> Adjusting Prefix to %s\n" % EPREFIX)
+                       b = os.path.join(pkgloc, buildprefix.lstrip(os.path.sep))
+                       i = os.path.join(builddir, "image", EPREFIX_LSTRIP)
+                       # make sure the directory structure for EPREFIX is set up in
+                       # the image, but avoid the last directory being there,
+                       # otherwise chpathtool will complain
+                       portage.util.ensure_dirs(i)
+                       os.rmdir(i)
+                       retval = portage.process.spawn_bash(
+                               "chpathtool -q '%s' '%s' '%s' '%s'" % (b, i, buildprefix, EPREFIX),
+                               env=mysettings.environ())
+                       if retval != os.EX_OK:
+                               writemsg("!!! Adjusing to Prefix failed!\n", noiselevel=-1)
+                               return retval
+                       pkgloc = os.path.join(builddir, "image")
+
+               mylink = dblink(mycat, mypkg, myroot, mysettings, vartree=vartree,
+                       treetype="bintree", blockers=blockers)
+               retval = mylink.merge(pkgloc, infloc, myroot, myebuild, cleanup=0,
+                       mydbapi=mydbapi, prev_mtimes=prev_mtimes)
+               did_merge_phase = True
+               success = retval == os.EX_OK
+               return retval
+       finally:
+               mysettings.pop("PORTAGE_BINPKG_FILE", None)
+               if tbz2_lock:
+                       portage.locks.unlockfile(tbz2_lock)
+               if True:
+                       if not did_merge_phase:
+                               # The merge phase handles this already.  Callers don't know how
+                               # far this function got, so we have to call elog_process() here
+                               # so that it's only called once.
+                               from portage.elog import elog_process
+                               elog_process(mycat + "/" + mypkg, mysettings)
+                       try:
+                               if success:
+                                       shutil.rmtree(builddir)
+                       except (IOError, OSError) as e:
+                               if e.errno != errno.ENOENT:
+                                       raise
+                               del e
index 54d3877b272d2b7cda3dee82994d86f7486041f7..e3e53a4324728546a00d878983cd1b2642050887 100644 (file)
@@ -8,7 +8,7 @@ import re
 
 import portage
 portage.proxy.lazyimport.lazyimport(globals(),
-       'portage.dbapi.dep_expand:_dep_expand',
+       'portage.dbapi.dep_expand:dep_expand@_dep_expand',
        'portage.dep:match_from_list',
        'portage.locks:unlockfile',
        'portage.output:colorize',
index 0cbcd88b122d7ca8c9e3c1b176fc422678d87240..c04caf940ed30e286e80a053ca7d138ac98b630c 100644 (file)
@@ -5475,6 +5475,38 @@ class dblink(object):
                "Is this a regular package (does it have a CATEGORY file?  A dblink can be virtual *and* regular)"
                return os.path.exists(os.path.join(self.dbdir, "CATEGORY"))
 
+def merge(mycat, mypkg, pkgloc, infloc, myroot, mysettings, myebuild=None,
+       mytree=None, mydbapi=None, vartree=None, prev_mtimes=None, blockers=None,
+       scheduler=None):
+       if not os.access(myroot + EPREFIX_LSTRIP, os.W_OK):
+               writemsg(_("Permission denied: access('%s', W_OK)\n") % myroot + EPREFIX_LSTRIP,
+                       noiselevel=-1)
+               return errno.EACCES
+       mylink = dblink(mycat, mypkg, myroot, mysettings, treetype=mytree,
+               vartree=vartree, blockers=blockers, scheduler=scheduler)
+       return mylink.merge(pkgloc, infloc, myroot, myebuild,
+               mydbapi=mydbapi, prev_mtimes=prev_mtimes)
+
+def unmerge(cat, pkg, myroot, mysettings, mytrimworld=1, vartree=None,
+       ldpath_mtimes=None, scheduler=None):
+       mylink = dblink(cat, pkg, myroot, mysettings, treetype="vartree",
+               vartree=vartree, scheduler=scheduler)
+       vartree = mylink.vartree
+       try:
+               mylink.lockdb()
+               if mylink.exists():
+                       vartree.dbapi.plib_registry.load()
+                       vartree.dbapi.plib_registry.pruneNonExisting()
+                       retval = mylink.unmerge(trimworld=mytrimworld, cleanup=1,
+                               ldpath_mtimes=ldpath_mtimes)
+                       if retval == os.EX_OK:
+                               mylink.delete()
+                       return retval
+               return os.EX_OK
+       finally:
+               vartree.dbapi.linkmap._clear_cache()
+               mylink.unlockdb()
+
 def write_contents(contents, root, f):
        """
        Write contents to any file like object. The file will be left open.
index 941cb41889f98ab6bd2952a235a08b14badbb8cd..79ba892e6963f7fef135096770121066b8161a27 100644 (file)
@@ -35,17 +35,13 @@ class PhaseCheck(LineCheck):
 
        ignore_line = re.compile(r'(^\s*#)')
        func_end_re = re.compile(r'^\}$')
+       phases_re = re.compile('(%s)' % '|'.join((
+               'pkg_pretend', 'pkg_setup', 'src_unpack', 'src_prepare',
+               'src_configure', 'src_compile', 'src_test', 'src_install',
+               'pkg_preinst', 'pkg_postinst', 'pkg_prerm', 'pkg_postrm',
+               'pkg_config')))
        in_phase = ''
 
-       def __init__(self):
-               self.phases = ('pkg_pretend', 'pkg_setup', 'src_unpack', 'src_prepare', 'src_configure', 'src_compile',
-                       'src_test', 'src_install', 'pkg_preinst', 'pkg_postinst', 'pkg_prerm', 'pkg_postrm', 'pkg_config')
-               phase_re = '('
-               for phase in self.phases:
-                       phase_re += phase + '|'
-               phase_re = phase_re[:-1] + ')'
-               self.phases_re = re.compile(phase_re)
-
        def check(self, num, line):
                m = self.phases_re.match(line)
                if m is not None: