Portage module path logic (Prefix way)
authorFabian Groffen <grobian@gentoo.org>
Sat, 22 Dec 2007 23:07:33 +0000 (23:07 -0000)
committerFabian Groffen <grobian@gentoo.org>
Sat, 22 Dec 2007 23:07:33 +0000 (23:07 -0000)
In principle we don't want to be dependant on the environment
(PYTHONPATH) and/or python hardcoded default search path.  (PYTHONPATH).
Since Gentoo patches Python to include Portage's python modules in the
default search path, any Gentoo python interpreter is an enemy for
Portage once it is not installed in the path hardcoded during Python
compilation.  This is the case when bootstrapping Prefix Portage on a
Gentoo Linux system, or when bootstrapping Prefix Portage using another
Prefix instance on the same system.  For this reason we ignore the
entire search path, and allow a backdoor for developers via the
PORTAGE_PYTHONPATH variable.

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

20 files changed:
bin/archive-conf
bin/chkcontents
bin/clean_locks
bin/dispatch-conf
bin/ebuild
bin/emaint
bin/emerge
bin/env-update
bin/filter-bash-environment.py
bin/fix-db.py
bin/fixpackages
bin/glsa-check
bin/md5check.py
bin/pkgname
bin/portageq
bin/quickpkg
bin/regenworld
bin/repoman
bin/xpak
pym/_emerge/__init__.py

index f5065cc14da37a86e8480d6584742d194e37573b..9047f3abfe0296ec993ec9d906190547e701e810 100755 (executable)
 #
 
 import os, sys
-try:
-    import portage
-except ImportError:
-       from os import path as osp
+
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage
+import portage
 
 import dispatch_conf
 
index a1ee672edb3aec174263aae3f2a3d80a555db444..1d9d11de71792256267bef48927879d9e53f842e 100755 (executable)
@@ -9,12 +9,14 @@
 # the right files).
 
 import os.path, os, sys
-try:
-       import portage
-except ImportError:
-       from os import path as osp
+
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage
+import portage
 
 def CONTENTScheck(path):
        try:
index 466e4df96957a0fc2f8165cfdc04e9d207b493a8..9d7c1986a0b8c210047b31048dea946ce040e4f2 100755 (executable)
@@ -4,12 +4,14 @@
 # $Id$
 
 import os,sys,errno
-try:
-       import portage.locks
-except ImportError:
-       from os import path as osp
+
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage.locks
+import portage.locks
 
 from portage.const import EPREFIX
 
index 324f09270e23d6b6bbcaad7c1a4abacfbb4ef68f..557c937fc0bf03d43f6ef2d28d87739c0a870a94 100755 (executable)
@@ -18,12 +18,14 @@ if not hasattr(__builtins__, "set"):
 from stat import *
 from random import *
 import atexit, commands, os, re, shutil, stat, sys
-try:
-    import portage
-except ImportError:
-    from os import path as osp
-    sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-    import portage
+
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
+       sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
+import portage
 
 from portage import dispatch_conf, const
 from portage.process import find_binary
index 14902dd6e6a8397f90d3bc3f52d90dcead0102c1..9c4d69652768ac529d3fa6ab7ede7174bbc9c55a 100755 (executable)
@@ -25,12 +25,14 @@ if "merge" in pargs:
        os.environ["FEATURES"] = os.environ.get("FEATURES", "") + " -noauto"
 
 os.environ["PORTAGE_CALLER"]="ebuild"
-try:
-       import portage
-except ImportError:
-       from os import path as osp
+
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage
+import portage
 
 import portage.util, portage.const
 import portage.dep
index 2eaa3cf0b689d9ec51166941029c0a06d9f67653..d333f56796f4960dc978d4f6a6fa0029085f816c 100755 (executable)
@@ -4,12 +4,13 @@ import sys, os, time, signal
 from optparse import OptionParser, OptionValueError
 import re
 
-try:
-       import portage
-except ImportError:
-       from os import path as osp
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage
+import portage
 
 import portage.const, portage.exception, portage.output
 class WorldHandler(object):
index f97d7b5e36d31d65cc76f7448aefad94eb13d3a6..60cf94d83e082f0789b6821e34754d75e79fe7bb 100755 (executable)
@@ -3,13 +3,14 @@
 # Portage Emerge bits
 # $Id$
 
-try:
-       import _emerge
-except ImportError:
-       from os import path as osp
-       import sys
+
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import _emerge
+import _emerge
 
 if __name__ == "__main__":
        import sys
index 9c51df5d326a434eb0bd4c4d2ca21a0a60a5d35e..8af3b0886178414730aa0b8cc718c0bface8664b 100755 (executable)
@@ -23,12 +23,14 @@ if len(sys.argv) > 1:
        print "!!! Invalid command line options!\n"
        usage(1)
 
-try:
-       import portage
-except ImportError:
-       from os import path as osp
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage
+import portage
+
 try:
        portage.env_update(makelinks)
 except IOError, e:
index 83b250b697fabe3e51d9892a12ab6bbd548c52df..7e4a6dcc9f4847f9c70ae53bd88a728dbacc34db 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!@PYTHON@
 # Copyright 1999-2007 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 # $Id$
index 4c2f2606f90a08a5730f383b99285c07af49bf76..ba44a0a169ea442ae86206e1efcd8790517648a1 100755 (executable)
@@ -5,12 +5,13 @@
 
 import os,sys,re
 
-try:
-       import portage
-except ImportError:
-       from os import path as osp
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage
+import portage
 
 from stat import *
 from portage.output import *
index 6796395e4035db07933737b0a23860c57ede25a2..dc6e75c4d903fcbb89369ec8e599efe54aa86169 100755 (executable)
@@ -5,12 +5,14 @@
 
 import os,sys
 os.environ["PORTAGE_CALLER"]="fixpackages"
-try:
-       import portage
-except ImportError:
-       from os import path as osp
+
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage
+import portage
 
 mysettings = portage.settings
 mytrees = portage.db
index 8d955526af179b07cd58e268bb330c4d0d6c9356..892851f75f3d91d2a2ff0daf103eec3d605b16ff 100644 (file)
@@ -6,12 +6,13 @@
 import os
 import sys
 
-try:
-       import portage
-except ImportError:
-       from os import path as osp
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage
+import portage
 
 from portage.output import *
 
index 915a0234e04268e610d287c6d59b6a23acbed57c..57de9594783142168db9d91966195cbb5f5b6214 100755 (executable)
@@ -5,12 +5,15 @@
 
 import os,sys
 os.environ["FEATURES"]="mirror cvs"
-try:
-       import portage
-except ImportError:
-       from os import path as osp
+
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage
+import portage
+
 import portage.util
 
 def cstrip(mystr,mychars):
index 4660606a7e14be32414087344c8f8606e659332a..d7482f4bf87dae230ed86b8c6f355167cee8a903 100755 (executable)
@@ -4,12 +4,14 @@
 # $Id$
 
 import sys, os
-try:
-       import portage
-except ImportError:
-       from os import path as osp
+
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage
+import portage
 
 a=portage.pkgsplit(sys.argv[1])
 if a:
index a0e8f11dea8bb690ede39a04901f3b262402cea9..7c339a349d408e77ff160e605639c0a070f3be12 100755 (executable)
@@ -473,15 +473,18 @@ def main():
        # handling, like if portage.exception.PermissionDenied is raised when
        # constructing the legacy global config instance.
        os.environ["PORTAGE_LEGACY_GLOBALS"] = "false"
+
+       # for an explanation on this logic, see pym/_emerge/__init__.py
+       from os import path as osp
+       if os.environ.contains("PORTAGE_PYTHONPATH"):
+               sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+       else:
+               sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
        import portage
+
        del os.environ["PORTAGE_LEGACY_GLOBALS"]
        try:
-               try:
-                       reload(portage)
-               except ImportError:
-                       from os import path as osp
-                       sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-                       import portage
+               reload(portage)
                if uses_root:
                        sys.argv[2] = portage.root
                retval = function(sys.argv[2:])
index 052223fb63680bacbf2bc21ad0b3df5360af8c7d..0d8e0faedb272bbbc6fb4eb3fafe338a8f095df2 100755 (executable)
@@ -5,6 +5,13 @@
 
 import errno, signal, sys, os
 
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
+       sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
+
 def quickpkg_main(options, args, eout):
        from portage import catsplit, dep_expand, flatten, isvalidatom, xpak
        from portage.dep import use_reduce, paren_reduce
index 8b052b276ef0e3652e122adefc4887dc7c861115..04d4e6edeba43a359f4e37a41d743df0fbdb6887 100755 (executable)
@@ -4,12 +4,15 @@
 # $Id$
 
 import sys, os
-try:
-       import portage
-except ImportError:
-       from os import path as osp
+
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage
+import portage
+
 import re, portage.const
 
 __candidatematcher__ = re.compile("^[0-9]+: \\*\\*\\* emerge ")
index 8245d15e0423cff2cfc45ff5ced6949cb9571d4f..0fb3432f3de81d9c46b825d7d94e26e053143bbb 100755 (executable)
@@ -41,20 +41,18 @@ if not hasattr(__builtins__, "set"):
        from sets import Set as set
 
 os.environ["PORTAGE_LEGACY_GLOBALS"] = "false"
-try:
-       import portage
-except ImportError:
-       from os import path as osp
+
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage
+import portage
+
 del os.environ["PORTAGE_LEGACY_GLOBALS"]
 
-try:
-       from repoman.checks import run_checks
-except ImportError:
-       from os import path as osp
-       sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), 'pym'))
-       from repoman.checks import run_checks
+from repoman.checks import run_checks
 
 import portage.checksum
 import portage.const
index 6ffccf0c0e577c8262c0d287c96abab2c2069928..2a945a84ca3d6b2db67f8c7c8a462c6f7f190744 100755 (executable)
--- a/bin/xpak
+++ b/bin/xpak
@@ -8,11 +8,12 @@ if len(sys.argv)!=3:
        print "xpak: expecting three arguments."
        sys.exit(1)
 
-try:
-       import portage.xpak
-except ImportError:
-       from os import path as osp
+# for an explanation on this logic, see pym/_emerge/__init__.py
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage.xpak
+import portage.xpak
 
 portage.xpak.xpak(sys.argv[1],sys.argv[2])
index 4b8e4396782f61f6c4a5dead03434ac585528113..5070b5ea638356d1f7d265edcc73e6bc5b19db60 100644 (file)
@@ -23,12 +23,25 @@ except KeyboardInterrupt:
 import os, stat
 
 os.environ["PORTAGE_LEGACY_GLOBALS"] = "false"
-try:
-       import portage
-except ImportError:
-       from os import path as osp
+
+# Portage module path logic (Prefix way)
+# In principle we don't want to be dependant on the environment
+# (PYTHONPATH) and/or python hardcoded default search path.
+# (PYTHONPATH).  Since Gentoo patches Python to include Portage's python
+# modules in the default search path, any Gentoo python interpreter is
+# an enemy for Portage once it is not installed in the path hardcoded
+# during Python compilation.  This is the case when bootstrapping
+# Prefix Portage on a Gentoo Linux system, or when bootstrapping Prefix
+# Portage using another Prefix instance on the same system.  For this
+# reason we ignore the entire search path, and allow a backdoor for
+# developers via the PORTAGE_PYTHONPATH variable.
+from os import path as osp
+if os.environ.contains("PORTAGE_PYTHONPATH"):
+       sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"])
+else:
        sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym"))
-       import portage
+import portage
+
 del os.environ["PORTAGE_LEGACY_GLOBALS"]
 from portage import digraph, portdbapi
 from portage.const import NEWS_LIB_PATH, CACHE_PATH, PRIVATE_PATH, USER_CONFIG_PATH, GLOBAL_CONFIG_PATH