summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pym/portage/__init__.py127
-rw-r--r--pym/portage/_legacy_globals.py87
2 files changed, 93 insertions, 121 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index ccfacebc7..9d0f929b2 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -564,43 +564,6 @@ def create_trees(config_root=None, target_root=None, trees=None):
return trees
class _LegacyGlobalProxy(proxy.objectproxy.ObjectProxy):
- """
- Instances of these serve as proxies to global variables
- that are initialized on demand.
- """
-
- __slots__ = ('_name',)
-
- def __init__(self, name):
- proxy.objectproxy.ObjectProxy.__init__(self)
- object.__setattr__(self, '_name', name)
-
- def _get_target(self):
- init_legacy_globals()
- name = object.__getattribute__(self, '_name')
- return globals()[name]
-
-class _PortdbProxy(proxy.objectproxy.ObjectProxy):
- """
- The portdb is initialized separately from the rest
- of the variables, since sometimes the other variables
- are needed while the portdb is not.
- """
-
- __slots__ = ()
-
- def _get_target(self):
- init_legacy_globals()
- global db, portdb, root, _portdb_initialized
- if not _portdb_initialized:
- portdb = db[root]["porttree"].dbapi
- _portdb_initialized = True
- return portdb
-
-class _MtimedbProxy(proxy.objectproxy.ObjectProxy):
- """
- The mtimedb is independent from the portdb and other globals.
- """
__slots__ = ('_name',)
@@ -609,20 +572,19 @@ class _MtimedbProxy(proxy.objectproxy.ObjectProxy):
object.__setattr__(self, '_name', name)
def _get_target(self):
- global mtimedb, mtimedbfile, _mtimedb_initialized
- if not _mtimedb_initialized:
- mtimedbfile = os.path.join(os.path.sep,
- CACHE_PATH, "mtimedb")
- mtimedb = MtimeDB(mtimedbfile)
- _mtimedb_initialized = True
name = object.__getattribute__(self, '_name')
- return globals()[name]
+ from portage._legacy_globals import _get_legacy_global
+ return _get_legacy_global(name)
_legacy_global_var_names = ("archlist", "db", "features",
"groups", "mtimedb", "mtimedbfile", "pkglines",
"portdb", "profiledir", "root", "selinux_enabled",
"settings", "thirdpartymirrors", "usedefaults")
+for k in _legacy_global_var_names:
+ globals()[k] = _LegacyGlobalProxy(k)
+del k
+
def _disable_legacy_globals():
"""
This deletes the ObjectProxy instances that are used
@@ -633,80 +595,3 @@ def _disable_legacy_globals():
global _legacy_global_var_names
for k in _legacy_global_var_names:
globals().pop(k, None)
-
-# Initialization of legacy globals. No functions/classes below this point
-# please! When the above functions and classes become independent of the
-# below global variables, it will be possible to make the below code
-# conditional on a backward compatibility flag (backward compatibility could
-# be disabled via an environment variable, for example). This will enable new
-# code that is aware of this flag to import portage without the unnecessary
-# overhead (and other issues!) of initializing the legacy globals.
-
-def init_legacy_globals():
- global _globals_initialized
- if _globals_initialized:
- return
- _globals_initialized = True
-
- global db, settings, root, portdb, selinux_enabled, mtimedbfile, mtimedb, \
- archlist, features, groups, pkglines, thirdpartymirrors, usedefaults, \
- profiledir
-
- # Portage needs to ensure a sane umask for the files it creates.
- os.umask(0o22)
-
- kwargs = {}
- for k, envvar in (("config_root", "PORTAGE_CONFIGROOT"), ("target_root", "ROOT")):
- kwargs[k] = os.environ.get(envvar, "/")
-
- global _initializing_globals
- _initializing_globals = True
- db = create_trees(**kwargs)
- del _initializing_globals
-
- settings = db["/"]["vartree"].settings
-
- for myroot in db:
- if myroot != "/":
- settings = db[myroot]["vartree"].settings
- break
-
- root = settings["ROOT"]
- output._init(config_root=settings['PORTAGE_CONFIGROOT'])
-
- # ========================================================================
- # COMPATIBILITY
- # These attributes should not be used
- # within Portage under any circumstances.
- # ========================================================================
- archlist = settings.archlist()
- features = settings.features
- groups = settings["ACCEPT_KEYWORDS"].split()
- pkglines = settings.packages
- selinux_enabled = settings.selinux_enabled()
- thirdpartymirrors = settings.thirdpartymirrors()
- usedefaults = settings.use_defs
- profiledir = os.path.join(settings["PORTAGE_CONFIGROOT"], PROFILE_PATH)
- if not os.path.isdir(profiledir):
- profiledir = None
- # ========================================================================
- # COMPATIBILITY
- # These attributes should not be used
- # within Portage under any circumstances.
- # ========================================================================
-
-if True:
-
- _mtimedb_initialized = False
- mtimedb = _MtimedbProxy("mtimedb")
- mtimedbfile = _MtimedbProxy("mtimedbfile")
-
- _portdb_initialized = False
- portdb = _PortdbProxy()
-
- _globals_initialized = False
-
- for k in ("db", "settings", "root", "selinux_enabled",
- "archlist", "features", "groups",
- "pkglines", "thirdpartymirrors", "usedefaults", "profiledir"):
- globals()[k] = _LegacyGlobalProxy(k)
diff --git a/pym/portage/_legacy_globals.py b/pym/portage/_legacy_globals.py
new file mode 100644
index 000000000..432d8d84f
--- /dev/null
+++ b/pym/portage/_legacy_globals.py
@@ -0,0 +1,87 @@
+# Copyright 2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+import portage
+from portage import os
+from portage.const import CACHE_PATH, PROFILE_PATH
+
+_legacy_globals = {}
+
+def _get_legacy_global(name):
+ global _legacy_globals
+ target = _legacy_globals.get(name, _legacy_globals)
+ if target is not _legacy_globals:
+ return target
+
+ if name == 'portdb':
+ portage.portdb = portage.db[portage.root]["porttree"].dbapi
+ _legacy_globals[name] = portage.portdb
+ return _legacy_globals[name]
+ elif name in ('mtimedb', 'mtimedbfile'):
+ portage.mtimedbfile = os.path.join(portage.root,
+ CACHE_PATH, "mtimedb")
+ _legacy_globals['mtimedbfile'] = portage.mtimedbfile
+ portage.mtimedb = portage.MtimeDB(portage.mtimedbfile)
+ _legacy_globals['mtimedb'] = portage.mtimedb
+ return _legacy_globals[name]
+
+ # Portage needs to ensure a sane umask for the files it creates.
+ os.umask(0o22)
+
+ kwargs = {}
+ for k, envvar in (("config_root", "PORTAGE_CONFIGROOT"), ("target_root", "ROOT")):
+ kwargs[k] = os.environ.get(envvar, "/")
+
+ portage._initializing_globals = True
+ portage.db = portage.create_trees(**kwargs)
+ _legacy_globals['db'] = portage.db
+ del portage._initializing_globals
+
+ settings = portage.db["/"]["vartree"].settings
+
+ for root in portage.db:
+ if root != "/":
+ settings = portage.db[root]["vartree"].settings
+ break
+
+ portage.output._init(config_root=settings['PORTAGE_CONFIGROOT'])
+
+ portage.settings = settings
+ _legacy_globals['settings'] = settings
+
+ portage.root = root
+ _legacy_globals['root'] = root
+
+ # COMPATIBILITY
+ # These attributes should not be used within
+ # Portage under any circumstances.
+
+ portage.archlist = settings.archlist()
+ _legacy_globals['archlist'] = portage.archlist
+
+ portage.features = settings.features
+ _legacy_globals['features'] = portage.features
+
+ portage.groups = settings["ACCEPT_KEYWORDS"].split()
+ _legacy_globals['groups'] = portage.groups
+
+ portage.pkglines = settings.packages
+ _legacy_globals['pkglines'] = portage.pkglines
+
+ portage.selinux_enabled = settings.selinux_enabled()
+ _legacy_globals['selinux_enabled'] = portage.selinux_enabled
+
+ portage.thirdpartymirrors = settings.thirdpartymirrors()
+ _legacy_globals['thirdpartymirrors'] = portage.thirdpartymirrors
+
+ portage.usedefaults = settings.use_defs
+ _legacy_globals['usedefaults'] = portage.usedefaults
+
+ profiledir = os.path.join(settings["PORTAGE_CONFIGROOT"], PROFILE_PATH)
+ if not os.path.isdir(profiledir):
+ profiledir = None
+ portage.profiledir = profiledir
+ _legacy_globals['profiledir'] = portage.profiledir
+
+ return _legacy_globals[name]