From dcc17e98f26c23dcbb867910fb2457309fb583fa Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Sat, 22 Dec 2007 23:07:33 +0000 Subject: [PATCH] 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. svn path=/main/branches/prefix/; revision=9045 --- bin/archive-conf | 12 +++++++----- bin/chkcontents | 12 +++++++----- bin/clean_locks | 12 +++++++----- bin/dispatch-conf | 14 ++++++++------ bin/ebuild | 12 +++++++----- bin/emaint | 11 ++++++----- bin/emerge | 13 +++++++------ bin/env-update | 12 +++++++----- bin/filter-bash-environment.py | 2 +- bin/fix-db.py | 11 ++++++----- bin/fixpackages | 12 +++++++----- bin/glsa-check | 11 ++++++----- bin/md5check.py | 13 ++++++++----- bin/pkgname | 12 +++++++----- bin/portageq | 15 +++++++++------ bin/quickpkg | 7 +++++++ bin/regenworld | 13 ++++++++----- bin/repoman | 20 +++++++++----------- bin/xpak | 11 ++++++----- pym/_emerge/__init__.py | 23 ++++++++++++++++++----- 20 files changed, 148 insertions(+), 100 deletions(-) diff --git a/bin/archive-conf b/bin/archive-conf index f5065cc14..9047f3abf 100755 --- a/bin/archive-conf +++ b/bin/archive-conf @@ -11,12 +11,14 @@ # 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 diff --git a/bin/chkcontents b/bin/chkcontents index a1ee672ed..1d9d11de7 100755 --- a/bin/chkcontents +++ b/bin/chkcontents @@ -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: diff --git a/bin/clean_locks b/bin/clean_locks index 466e4df96..9d7c1986a 100755 --- a/bin/clean_locks +++ b/bin/clean_locks @@ -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 diff --git a/bin/dispatch-conf b/bin/dispatch-conf index 324f09270..557c937fc 100755 --- a/bin/dispatch-conf +++ b/bin/dispatch-conf @@ -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 diff --git a/bin/ebuild b/bin/ebuild index 14902dd6e..9c4d69652 100755 --- a/bin/ebuild +++ b/bin/ebuild @@ -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 diff --git a/bin/emaint b/bin/emaint index 2eaa3cf0b..d333f5679 100755 --- a/bin/emaint +++ b/bin/emaint @@ -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): diff --git a/bin/emerge b/bin/emerge index f97d7b5e3..60cf94d83 100755 --- a/bin/emerge +++ b/bin/emerge @@ -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 diff --git a/bin/env-update b/bin/env-update index 9c51df5d3..8af3b0886 100755 --- a/bin/env-update +++ b/bin/env-update @@ -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: diff --git a/bin/filter-bash-environment.py b/bin/filter-bash-environment.py index 83b250b69..7e4a6dcc9 100755 --- a/bin/filter-bash-environment.py +++ b/bin/filter-bash-environment.py @@ -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$ diff --git a/bin/fix-db.py b/bin/fix-db.py index 4c2f2606f..ba44a0a16 100755 --- a/bin/fix-db.py +++ b/bin/fix-db.py @@ -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 * diff --git a/bin/fixpackages b/bin/fixpackages index 6796395e4..dc6e75c4d 100755 --- a/bin/fixpackages +++ b/bin/fixpackages @@ -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 diff --git a/bin/glsa-check b/bin/glsa-check index 8d955526a..892851f75 100644 --- a/bin/glsa-check +++ b/bin/glsa-check @@ -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 * diff --git a/bin/md5check.py b/bin/md5check.py index 915a0234e..57de95947 100755 --- a/bin/md5check.py +++ b/bin/md5check.py @@ -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): diff --git a/bin/pkgname b/bin/pkgname index 4660606a7..d7482f4bf 100755 --- a/bin/pkgname +++ b/bin/pkgname @@ -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: diff --git a/bin/portageq b/bin/portageq index a0e8f11de..7c339a349 100755 --- a/bin/portageq +++ b/bin/portageq @@ -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:]) diff --git a/bin/quickpkg b/bin/quickpkg index 052223fb6..0d8e0faed 100755 --- a/bin/quickpkg +++ b/bin/quickpkg @@ -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 diff --git a/bin/regenworld b/bin/regenworld index 8b052b276..04d4e6ede 100755 --- a/bin/regenworld +++ b/bin/regenworld @@ -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 ") diff --git a/bin/repoman b/bin/repoman index 8245d15e0..0fb3432f3 100755 --- a/bin/repoman +++ b/bin/repoman @@ -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 diff --git a/bin/xpak b/bin/xpak index 6ffccf0c0..2a945a84c 100755 --- 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]) diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py index 4b8e43967..5070b5ea6 100644 --- a/pym/_emerge/__init__.py +++ b/pym/_emerge/__init__.py @@ -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 -- 2.26.2