aboutsummaryrefslogtreecommitdiffstats
path: root/pkg_resources.py
diff options
context:
space:
mode:
authorPJ Eby <distutils-sig@python.org>2005-09-24 17:58:22 +0000
committerPJ Eby <distutils-sig@python.org>2005-09-24 17:58:22 +0000
commitb6b29d019d1c33c75ee45fe8846525c75f1ed404 (patch)
tree747afb3f844107fc6557513e2f76ec0a7b129c53 /pkg_resources.py
parentb36d8cf48254de4e35688764e6026dfffdfa2b62 (diff)
downloadexternal_python_setuptools-b6b29d019d1c33c75ee45fe8846525c75f1ed404.tar.gz
external_python_setuptools-b6b29d019d1c33c75ee45fe8846525c75f1ed404.tar.bz2
external_python_setuptools-b6b29d019d1c33c75ee45fe8846525c75f1ed404.zip
Implement smart version conflict resolution for scripts, so that
installed applications will not have their eggs overridden by packages installed locally on sys.path. This should also make things work a bit better for "traditional" non-root Python setups on Unixy operating systems. See: http://mail.python.org/pipermail/distutils-sig/2005-September/005164.html for more details. --HG-- branch : setuptools extra : convert_revision : svn%3A6015fed2-1504-0410-9fe1-9d1591cc4771/sandbox/trunk/setuptools%4041250
Diffstat (limited to 'pkg_resources.py')
-rw-r--r--pkg_resources.py42
1 files changed, 21 insertions, 21 deletions
diff --git a/pkg_resources.py b/pkg_resources.py
index 60415c08..4cb9f957 100644
--- a/pkg_resources.py
+++ b/pkg_resources.py
@@ -463,7 +463,7 @@ class WorkingSet(object):
requirements = list(requirements)[::-1] # set up the stack
processed = {} # set of processed requirements
- best = {} # key -> dist
+ best = dict([(d.key,d) for d in self]) # key -> dist
to_activate = []
while requirements:
@@ -2131,19 +2131,35 @@ def split_sections(s):
# Set up global resource manager
-
_manager = ResourceManager()
-
def _initialize(g):
for name in dir(_manager):
if not name.startswith('_'):
g[name] = getattr(_manager, name)
_initialize(globals())
-
# Prepare the master working set and make the ``require()`` API available
-
working_set = WorkingSet()
+try:
+ # Does the main program list any requirements?
+ from __main__ import __requires__
+except ImportError:
+ pass # No: just use the default working set based on sys.path
+else:
+ # Yes: ensure the requirements are met, by prefixing sys.path if necessary
+ try:
+ working_set.require(__requires__)
+ except VersionConflict: # try it without defaults already on sys.path
+ working_set = WorkingSet([]) # by starting with an empty path
+ for dist in working_set.resolve(
+ parse_requirements(__requires__), Environment()
+ ):
+ working_set.add(dist)
+ for entry in sys.path: # add any missing entries from sys.path
+ if entry not in working_set.entries:
+ working_set.add_entry(entry)
+ sys.path[:] = working_set.entries # then copy back to sys.path
+
require = working_set.require
iter_entry_points = working_set.iter_entry_points
add_activation_listener = working_set.subscribe
@@ -2153,21 +2169,5 @@ run_main = run_script # backward compatibility
# Activate all distributions already on sys.path, and ensure that
# all distributions added to the working set in the future (e.g. by
# calling ``require()``) will get activated as well.
-#
add_activation_listener(lambda dist: dist.activate())
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-