[Python-checkins] r42260 - in sandbox/trunk/setuptools: EasyInstall.txt setuptools/command/easy_install.py setuptools/package_index.py
phillip.eby
python-checkins at python.org
Tue Feb 7 17:43:42 CET 2006
Author: phillip.eby
Date: Tue Feb 7 17:43:41 2006
New Revision: 42260
Modified:
sandbox/trunk/setuptools/EasyInstall.txt
sandbox/trunk/setuptools/setuptools/command/easy_install.py
sandbox/trunk/setuptools/setuptools/package_index.py
Log:
The ``--always-copy`` option now skips "system" and "development" eggs
since they can't be reliably copied. Note that this may cause EasyInstall
to choose an older version of a package than what you expected, or it may
cause downloading and installation of a fresh version of what's already
installed.
Modified: sandbox/trunk/setuptools/EasyInstall.txt
==============================================================================
--- sandbox/trunk/setuptools/EasyInstall.txt (original)
+++ sandbox/trunk/setuptools/EasyInstall.txt Tue Feb 7 17:43:41 2006
@@ -589,6 +589,14 @@
from other sys.path directories to the installation directory, unless you
explicitly gave the distribution's filename on the command line.
+ Note that as of 0.6a10, using this option excludes "system" and
+ "development" eggs from consideration because they can't be reliably
+ copied. This may cause EasyInstall to choose an older version of a package
+ than what you expected, or it may cause downloading and installation of a
+ fresh copy of something that's already installed. You will see warning
+ messages for any eggs that EasyInstall skips, before it falls back to an
+ older version or attempts to download a fresh copy.
+
``--find-links=URL, -f URL`` (Option renamed in 0.4a2)
Scan the specified "download pages" for direct links to downloadable eggs
or source distributions. Any usable packages will be downloaded if they
@@ -982,6 +990,11 @@
linking to them (e.g. from within their own PyPI page or download links
page).
+ * The ``--always-copy`` option now skips "system" and "development" eggs since
+ they can't be reliably copied. Note that this may cause EasyInstall to
+ choose an older version of a package than what you expected, or it may cause
+ downloading and installation of a fresh version of what's already installed.
+
0.6a9
* Fixed ``.pth`` file processing picking up nested eggs (i.e. ones inside
"baskets") when they weren't explicitly listed in the ``.pth`` file.
Modified: sandbox/trunk/setuptools/setuptools/command/easy_install.py
==============================================================================
--- sandbox/trunk/setuptools/setuptools/command/easy_install.py (original)
+++ sandbox/trunk/setuptools/setuptools/command/easy_install.py Tue Feb 7 17:43:41 2006
@@ -305,27 +305,27 @@
spec = parse_requirement_arg(spec)
self.check_editable(spec)
- download = self.package_index.fetch(
- spec, tmpdir, self.upgrade, self.editable
+ dist = self.package_index.fetch_distribution(
+ spec, tmpdir, self.upgrade, self.editable, not self.always_copy
)
- if download is None:
- raise DistutilsError(
- "Could not find distribution for %r" % spec
- )
-
- return self.install_item(spec, download, tmpdir, deps)
+ if dist is None:
+ msg = "Could not find suitable distribution for %r" % spec
+ if self.always_copy:
+ msg+=" (--always-copy skips system and development eggs)"
+ raise DistutilsError(msg)
+ elif dist.precedence==DEVELOP_DIST:
+ # .egg-info dists don't need installing, just process deps
+ self.process_distribution(spec, dist, deps, "Using")
+ return dist
+ else:
+ return self.install_item(spec, dist.location, tmpdir, deps)
finally:
if os.path.exists(tmpdir):
rmtree(tmpdir)
-
-
-
-
-
def install_item(self, spec, download, tmpdir, deps, install_needed=False):
# Installation is also needed if file in tmpdir or is not an egg
Modified: sandbox/trunk/setuptools/setuptools/package_index.py
==============================================================================
--- sandbox/trunk/setuptools/setuptools/package_index.py (original)
+++ sandbox/trunk/setuptools/setuptools/package_index.py Tue Feb 7 17:43:41 2006
@@ -337,12 +337,12 @@
automatically created alongside the downloaded file.
If `spec` is a ``Requirement`` object or a string containing a
- project/version requirement spec, this method is equivalent to
- the ``fetch()`` method. If `spec` is a local, existing file or
- directory name, it is simply returned unchanged. If `spec` is a URL,
- it is downloaded to a subpath of `tmpdir`, and the local filename is
- returned. Various errors may be raised if a problem occurs during
- downloading.
+ project/version requirement spec, this method returns the location of
+ a matching distribution (possibly after downloading it to `tmpdir`).
+ If `spec` is a locally existing file or directory name, it is simply
+ returned unchanged. If `spec` is a URL, it is downloaded to a subpath
+ of `tmpdir`, and the local filename is returned. Various errors may be
+ raised if a problem occurs during downloading.
"""
if not isinstance(spec,Requirement):
scheme = URL_SCHEME(spec)
@@ -364,31 +364,49 @@
"Not a URL, existing file, or requirement spec: %r" %
(spec,)
)
- return self.fetch(spec, tmpdir)
+ return getattr(self.fetch_distribution(spec, tmpdir),'location',None)
- def fetch(self, requirement, tmpdir, force_scan=False, source=False):
- """Obtain a file suitable for fulfilling `requirement`
+ def fetch_distribution(self,
+ requirement, tmpdir, force_scan=False, source=False, develop_ok=False
+ ):
+ """Obtain a distribution suitable for fulfilling `requirement`
`requirement` must be a ``pkg_resources.Requirement`` instance.
If necessary, or if the `force_scan` flag is set, the requirement is
searched for in the (online) package index as well as the locally
installed packages. If a distribution matching `requirement` is found,
- the return value is the same as if you had called the ``download()``
- method with the matching distribution's URL. If no matching
- distribution is found, returns ``None``.
+ the returned distribution's ``location`` is the value you would have
+ gotten from calling the ``download()`` method with the matching
+ distribution's URL or filename. If no matching distribution is found,
+ ``None`` is returned.
If the `source` flag is set, only source distributions and source
- checkout links will be considered.
+ checkout links will be considered. Unless the `develop_ok` flag is
+ set, development and system eggs (i.e., those using the ``.egg-info``
+ format) will be ignored.
"""
+
# process a Requirement
self.info("Searching for %s", requirement)
+ skipped = {}
def find(req):
+ # Find a matching distribution; may be called more than once
+
for dist in self[req.key]:
+
+ if dist.precedence==DEVELOP_DIST and not develop_ok:
+ if dist not in skipped:
+ self.warn("Skipping development or system egg: %s",dist)
+ skipped[dist] = 1
+ continue
+
if dist in req and (dist.precedence<=SOURCE_DIST or not source):
self.info("Best match: %s", dist)
- return self.download(dist.location, tmpdir)
+ return dist.clone(
+ location=self.download(dist.location, tmpdir)
+ )
if force_scan:
self.find_packages(requirement)
@@ -407,6 +425,29 @@
)
return dist
+ def fetch(self, requirement, tmpdir, force_scan=False, source=False):
+ """Obtain a file suitable for fulfilling `requirement`
+
+ DEPRECATED; use the ``fetch_distribution()`` method now instead. For
+ backward compatibility, this routine is identical but returns the
+ ``location`` of the downloaded distribution instead of a distribution
+ object.
+ """
+ dist = self.fetch_dist(requirement,tmpdir,force_scan,source)
+ if dist is not None:
+ return dist.location
+ return None
+
+
+
+
+
+
+
+
+
+
+
def gen_setup(self, filename, fragment, tmpdir):
match = EGG_FRAGMENT.match(fragment); #import pdb; pdb.set_trace()
More information about the Python-checkins
mailing list