Skip to content

Commit

Permalink
Merge pull request #2535 from msabramo/speed_up_unpack_file_url_2
Browse files Browse the repository at this point in the history
Speed up unpack_file_url
  • Loading branch information
dstufft committed Mar 16, 2015
2 parents cc7d178 + 4e6d935 commit d01e7d6
Showing 1 changed file with 42 additions and 1 deletion.
43 changes: 42 additions & 1 deletion pip/download.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@
from pip.exceptions import InstallationError, HashMismatch
from pip.models import PyPI
from pip.utils import (splitext, rmtree, format_size, display_path,
backup_dir, ask_path_exists, unpack_file)
backup_dir, ask_path_exists, unpack_file,
call_subprocess)
from pip.utils.filesystem import check_path_owner
from pip.utils.logging import indent_log
from pip.utils.ui import DownloadProgressBar, DownloadProgressSpinner
from pip.locations import write_delete_marker_file
from pip.vcs import vcs
Expand Down Expand Up @@ -725,6 +727,45 @@ def unpack_file_url(link, location, download_dir=None):
_copy_file(from_path, download_dir, content_type, link)


def _copy_dist_from_dir(link_path, location):
"""Copy distribution files in `link_path` to `location`.
Invoked when user requests to install a local directory. E.g.:
pip install .
pip install ~/dev/git-repos/python-prompt-toolkit
"""

# Note: This is currently VERY SLOW if you have a lot of data in the
# directory, because it copies everything with `shutil.copytree`.
# What it should really do is build an sdist and install that.
# See https://github.com/pypa/pip/issues/2195

if os.path.isdir(location):
rmtree(location)

# build an sdist
setup_py = 'setup.py'
sdist_args = [sys.executable]
sdist_args.append('-c')
sdist_args.append(
"import setuptools, tokenize;__file__=%r;"
"exec(compile(getattr(tokenize, 'open', open)(__file__).read()"
".replace('\\r\\n', '\\n'), __file__, 'exec'))" % setup_py)
sdist_args.append('sdist')
sdist_args += ['--dist-dir', location]
logger.info('Running setup.py sdist for %s', link_path)

with indent_log():
call_subprocess(sdist_args, cwd=link_path, show_stdout=False)

# unpack sdist into `location`
sdist = os.path.join(location, os.listdir(location)[0])
logger.info('Unpacking sdist %s into %s', sdist, location)
unpack_file(sdist, location, content_type=None, link=None)


class PipXmlrpcTransport(xmlrpc_client.Transport):
"""Provide a `xmlrpclib.Transport` implementation via a `PipSession`
object.
Expand Down

0 comments on commit d01e7d6

Please sign in to comment.