diff options
-rwxr-xr-x | setuptools.txt | 11 | ||||
-rwxr-xr-x | setuptools/command/egg_info.py | 22 | ||||
-rw-r--r-- | setuptools/dist.py | 30 |
3 files changed, 37 insertions, 26 deletions
diff --git a/setuptools.txt b/setuptools.txt index 97f51f20..8ec42dd5 100755 --- a/setuptools.txt +++ b/setuptools.txt @@ -1966,6 +1966,17 @@ Release Notes/Change History number from ``PKG-INFO`` in case it is being run on a source distribution of a snapshot taken from a Subversion-based project. + * Fixed some problems with fresh checkouts of projects that don't include + ``.egg-info/PKG-INFO`` under revision control and put the project's source + code directly in the project directory. If such a package had any + requirements that get processed before the ``egg_info`` command can be run, + the setup scripts would fail with a "Missing 'Version:' header and/or + PKG-INFO file" error, because the egg runtime interpreted the unbuilt + metadata in a directory on ``sys.path`` (i.e. the current directory) as + being a corrupted egg. Setuptools now monkeypatches the distribution + metadata cache to pretend that the egg has valid version information, until + it has a chance to make it actually be so (via the ``egg_info`` command). + 0.6a5 * Fixed missing gui/cli .exe files in distribution. Fixed bugs in tests. diff --git a/setuptools/command/egg_info.py b/setuptools/command/egg_info.py index c5a404e9..198f9635 100755 --- a/setuptools/command/egg_info.py +++ b/setuptools/command/egg_info.py @@ -7,7 +7,7 @@ import os, re from setuptools import Command from distutils.errors import * from distutils import log -from pkg_resources import parse_requirements, safe_name, \ +from pkg_resources import parse_requirements, safe_name, parse_version, \ safe_version, yield_lines, EntryPoint, iter_entry_points class egg_info(Command): @@ -65,16 +65,16 @@ class egg_info(Command): # self.distribution.metadata.version = self.egg_version - - - - - - - - - - + # If we bootstrapped around the lack of a PKG-INFO, as might be the + # case in a fresh checkout, make sure that any special tags get added + # to the version info + # + pd = self.distribution._patched_dist + if pd is not None and pd.key==self.egg_name.lower(): + pd._version = self.egg_version + pd._parsed_version = parse_version(self.egg_version) + self.distribution._patched_dist = None + diff --git a/setuptools/dist.py b/setuptools/dist.py index 31a07827..f0ad6f8b 100644 --- a/setuptools/dist.py +++ b/setuptools/dist.py @@ -188,20 +188,20 @@ class Distribution(_Distribution): distribution for the included and excluded features. """ - - - - - - - - - - - - - - + _patched_dist = None + + def patch_missing_pkg_info(self, attrs): + # Fake up a replacement for the data that would normally come from + # PKG-INFO, but which might not yet be built if this is a fresh + # checkout. + # + if not attrs or 'name' not in attrs or 'version' not in attrs: + return + key = pkg_resources.safe_name(str(attrs['name'])).lower() + dist = pkg_resources.working_set.by_key.get(key) + if dist is not None and not dist.has_metadata('PKG-INFO'): + dist._version = pkg_resources.safe_version(str(attrs['version'])) + self._patched_dist = dist def __init__ (self, attrs=None): have_package_data = hasattr(self, "package_data") @@ -210,7 +210,7 @@ class Distribution(_Distribution): self.requires = [] # XXX self.features = {} self.dist_files = [] - + self.patch_missing_pkg_info(attrs) if attrs and 'setup_requires' in attrs: # Make sure we have any eggs needed to interpret 'attrs' self.fetch_build_eggs(attrs.pop('setup_requires')) |