Blame SOURCES/local-dos.patch

f08a46
diff --git a/pip/cmdoptions.py b/pip/cmdoptions.py
f08a46
index 8ed3d91..01b2104 100644
f08a46
--- a/pip/cmdoptions.py
f08a46
+++ b/pip/cmdoptions.py
f08a46
@@ -9,7 +9,7 @@ To be consistent, all options will follow this design.
f08a46
 """
f08a46
 import copy
f08a46
 from optparse import OptionGroup, SUPPRESS_HELP, Option
f08a46
-from pip.locations import build_prefix, default_log_file
f08a46
+from pip.locations import default_log_file
f08a46
 
f08a46
 
f08a46
 def make_option_group(group, parser):
f08a46
@@ -297,10 +297,8 @@ build_dir = OptionMaker(
f08a46
     '-b', '--build', '--build-dir', '--build-directory',
f08a46
     dest='build_dir',
f08a46
     metavar='dir',
f08a46
-    default=build_prefix,
f08a46
-    help='Directory to unpack packages into and build in. '
f08a46
-    'The default in a virtualenv is "<venv path>/build". '
f08a46
-    'The default for global installs is "<OS temp dir>/pip_build_<username>".')
f08a46
+    help='Directory to unpack packages into and build in.',
f08a46
+)
f08a46
 
f08a46
 install_options = OptionMaker(
f08a46
     '--install-option',
f08a46
diff --git a/pip/commands/install.py b/pip/commands/install.py
f08a46
index cbf22a0..cb7d0db 100644
f08a46
--- a/pip/commands/install.py
f08a46
+++ b/pip/commands/install.py
f08a46
@@ -10,6 +10,7 @@ from pip.basecommand import Command
f08a46
 from pip.index import PackageFinder
f08a46
 from pip.exceptions import InstallationError, CommandError, PreviousBuildDirError
f08a46
 from pip import cmdoptions
f08a46
+from pip.util import BuildDirectory
f08a46
 
f08a46
 
f08a46
 class InstallCommand(Command):
f08a46
@@ -188,7 +189,7 @@ class InstallCommand(Command):
f08a46
         if (
f08a46
             options.no_install or
f08a46
             options.no_download or
f08a46
-            (options.build_dir != build_prefix) or
f08a46
+            options.build_dir or
f08a46
             options.no_clean
f08a46
         ):
f08a46
             logger.deprecated('1.7', 'DEPRECATION: --no-install, --no-download, --build, '
f08a46
@@ -197,7 +198,16 @@ class InstallCommand(Command):
f08a46
         if options.download_dir:
f08a46
             options.no_install = True
f08a46
             options.ignore_installed = True
f08a46
-        options.build_dir = os.path.abspath(options.build_dir)
f08a46
+
f08a46
+        # If we have --no-install or --no-download and no --build we use the
f08a46
+        # legacy static build dir
f08a46
+        if (options.build_dir is None
f08a46
+                and (options.no_install or options.no_download)):
f08a46
+            options.build_dir = build_prefix
f08a46
+
f08a46
+        if options.build_dir:
f08a46
+            options.build_dir = os.path.abspath(options.build_dir)
f08a46
+
f08a46
         options.src_dir = os.path.abspath(options.src_dir)
f08a46
         install_options = options.install_options or []
f08a46
         if options.use_user_site:
f08a46
@@ -246,73 +256,75 @@ class InstallCommand(Command):
f08a46
 
f08a46
         finder = self._build_package_finder(options, index_urls, session)
f08a46
 
f08a46
-        requirement_set = RequirementSet(
f08a46
-            build_dir=options.build_dir,
f08a46
-            src_dir=options.src_dir,
f08a46
-            download_dir=options.download_dir,
f08a46
-            download_cache=options.download_cache,
f08a46
-            upgrade=options.upgrade,
f08a46
-            as_egg=options.as_egg,
f08a46
-            ignore_installed=options.ignore_installed,
f08a46
-            ignore_dependencies=options.ignore_dependencies,
f08a46
-            force_reinstall=options.force_reinstall,
f08a46
-            use_user_site=options.use_user_site,
f08a46
-            target_dir=temp_target_dir,
f08a46
-            session=session,
f08a46
-            pycompile=options.compile,
f08a46
-        )
f08a46
-        for name in args:
f08a46
-            requirement_set.add_requirement(
f08a46
-                InstallRequirement.from_line(name, None))
f08a46
-        for name in options.editables:
f08a46
-            requirement_set.add_requirement(
f08a46
-                InstallRequirement.from_editable(name, default_vcs=options.default_vcs))
f08a46
-        for filename in options.requirements:
f08a46
-            for req in parse_requirements(filename, finder=finder, options=options, session=session):
f08a46
-                requirement_set.add_requirement(req)
f08a46
-        if not requirement_set.has_requirements:
f08a46
-            opts = {'name': self.name}
f08a46
-            if options.find_links:
f08a46
-                msg = ('You must give at least one requirement to %(name)s '
f08a46
-                       '(maybe you meant "pip %(name)s %(links)s"?)' %
f08a46
-                       dict(opts, links=' '.join(options.find_links)))
f08a46
-            else:
f08a46
-                msg = ('You must give at least one requirement '
f08a46
-                       'to %(name)s (see "pip help %(name)s")' % opts)
f08a46
-            logger.warn(msg)
f08a46
-            return
f08a46
-
f08a46
-        try:
f08a46
-            if not options.no_download:
f08a46
-                requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
f08a46
-            else:
f08a46
-                requirement_set.locate_files()
f08a46
-
f08a46
-            if not options.no_install and not self.bundle:
f08a46
-                requirement_set.install(
f08a46
-                    install_options,
f08a46
-                    global_options,
f08a46
-                    root=options.root_path,
f08a46
-                    strip_file_prefix=options.strip_file_prefix)
f08a46
-                installed = ' '.join([req.name for req in
f08a46
-                                      requirement_set.successfully_installed])
f08a46
-                if installed:
f08a46
-                    logger.notify('Successfully installed %s' % installed)
f08a46
-            elif not self.bundle:
f08a46
-                downloaded = ' '.join([req.name for req in
f08a46
-                                       requirement_set.successfully_downloaded])
f08a46
-                if downloaded:
f08a46
-                    logger.notify('Successfully downloaded %s' % downloaded)
f08a46
-            elif self.bundle:
f08a46
-                requirement_set.create_bundle(self.bundle_filename)
f08a46
-                logger.notify('Created bundle in %s' % self.bundle_filename)
f08a46
-        except PreviousBuildDirError:
f08a46
-            options.no_clean = True
f08a46
-            raise
f08a46
-        finally:
f08a46
-            # Clean up
f08a46
-            if (not options.no_clean) and ((not options.no_install) or options.download_dir):
f08a46
-                requirement_set.cleanup_files(bundle=self.bundle)
f08a46
+        build_delete = (not (options.no_clean or options.build_dir))
f08a46
+        with BuildDirectory(options.build_dir, delete=build_delete) as build_dir:
f08a46
+            requirement_set = RequirementSet(
f08a46
+                build_dir=build_dir,
f08a46
+                src_dir=options.src_dir,
f08a46
+                download_dir=options.download_dir,
f08a46
+                download_cache=options.download_cache,
f08a46
+                upgrade=options.upgrade,
f08a46
+                as_egg=options.as_egg,
f08a46
+                ignore_installed=options.ignore_installed,
f08a46
+                ignore_dependencies=options.ignore_dependencies,
f08a46
+                force_reinstall=options.force_reinstall,
f08a46
+                use_user_site=options.use_user_site,
f08a46
+                target_dir=temp_target_dir,
f08a46
+                session=session,
f08a46
+                pycompile=options.compile,
f08a46
+            )
f08a46
+            for name in args:
f08a46
+                requirement_set.add_requirement(
f08a46
+                    InstallRequirement.from_line(name, None))
f08a46
+            for name in options.editables:
f08a46
+                requirement_set.add_requirement(
f08a46
+                    InstallRequirement.from_editable(name, default_vcs=options.default_vcs))
f08a46
+            for filename in options.requirements:
f08a46
+                for req in parse_requirements(filename, finder=finder, options=options, session=session):
f08a46
+                    requirement_set.add_requirement(req)
f08a46
+            if not requirement_set.has_requirements:
f08a46
+                opts = {'name': self.name}
f08a46
+                if options.find_links:
f08a46
+                    msg = ('You must give at least one requirement to %(name)s '
f08a46
+                           '(maybe you meant "pip %(name)s %(links)s"?)' %
f08a46
+                           dict(opts, links=' '.join(options.find_links)))
f08a46
+                else:
f08a46
+                    msg = ('You must give at least one requirement '
f08a46
+                           'to %(name)s (see "pip help %(name)s")' % opts)
f08a46
+                logger.warn(msg)
f08a46
+                return
f08a46
+
f08a46
+            try:
f08a46
+                if not options.no_download:
f08a46
+                    requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
f08a46
+                else:
f08a46
+                    requirement_set.locate_files()
f08a46
+
f08a46
+                if not options.no_install and not self.bundle:
f08a46
+                    requirement_set.install(
f08a46
+                        install_options,
f08a46
+                        global_options,
f08a46
+                        root=options.root_path,
f08a46
+                        strip_file_prefix=options.strip_file_prefix)
f08a46
+                    installed = ' '.join([req.name for req in
f08a46
+                                          requirement_set.successfully_installed])
f08a46
+                    if installed:
f08a46
+                        logger.notify('Successfully installed %s' % installed)
f08a46
+                elif not self.bundle:
f08a46
+                    downloaded = ' '.join([req.name for req in
f08a46
+                                           requirement_set.successfully_downloaded])
f08a46
+                    if downloaded:
f08a46
+                        logger.notify('Successfully downloaded %s' % downloaded)
f08a46
+                elif self.bundle:
f08a46
+                    requirement_set.create_bundle(self.bundle_filename)
f08a46
+                    logger.notify('Created bundle in %s' % self.bundle_filename)
f08a46
+            except PreviousBuildDirError:
f08a46
+                options.no_clean = True
f08a46
+                raise
f08a46
+            finally:
f08a46
+                # Clean up
f08a46
+                if (not options.no_clean) and ((not options.no_install) or options.download_dir):
f08a46
+                    requirement_set.cleanup_files(bundle=self.bundle)
f08a46
 
f08a46
         if options.target_dir:
f08a46
             if not os.path.exists(options.target_dir):
f08a46
diff --git a/pip/commands/wheel.py b/pip/commands/wheel.py
f08a46
index 6527063..a96631a 100644
f08a46
--- a/pip/commands/wheel.py
f08a46
+++ b/pip/commands/wheel.py
f08a46
@@ -8,7 +8,7 @@ from pip.index import PackageFinder
f08a46
 from pip.log import logger
f08a46
 from pip.exceptions import CommandError, PreviousBuildDirError
f08a46
 from pip.req import InstallRequirement, RequirementSet, parse_requirements
f08a46
-from pip.util import normalize_path
f08a46
+from pip.util import BuildDirectory, normalize_path
f08a46
 from pip.wheel import WheelBuilder
f08a46
 from pip import cmdoptions
f08a46
 
f08a46
@@ -123,6 +123,9 @@ class WheelCommand(Command):
f08a46
                         "--extra-index-url is suggested.")
f08a46
             index_urls += options.mirrors
f08a46
 
f08a46
+        if options.build_dir:
f08a46
+            options.build_dir = os.path.abspath(options.build_dir)
f08a46
+
f08a46
         session = self._build_session(options)
f08a46
 
f08a46
         finder = PackageFinder(find_links=options.find_links,
f08a46
@@ -137,59 +140,60 @@ class WheelCommand(Command):
f08a46
                                session=session,
f08a46
                             )
f08a46
 
f08a46
-        options.build_dir = os.path.abspath(options.build_dir)
f08a46
-        requirement_set = RequirementSet(
f08a46
-            build_dir=options.build_dir,
f08a46
-            src_dir=None,
f08a46
-            download_dir=None,
f08a46
-            download_cache=options.download_cache,
f08a46
-            ignore_dependencies=options.ignore_dependencies,
f08a46
-            ignore_installed=True,
f08a46
-            session=session,
f08a46
-            wheel_download_dir=options.wheel_dir
f08a46
-        )
f08a46
-
f08a46
-        # make the wheelhouse
f08a46
-        if not os.path.exists(options.wheel_dir):
f08a46
-            os.makedirs(options.wheel_dir)
f08a46
-
f08a46
-        #parse args and/or requirements files
f08a46
-        for name in args:
f08a46
-            requirement_set.add_requirement(
f08a46
-                InstallRequirement.from_line(name, None))
f08a46
-
f08a46
-        for filename in options.requirements:
f08a46
-            for req in parse_requirements(
f08a46
-                filename,
f08a46
-                finder=finder,
f08a46
-                options=options,
f08a46
-                session=session):
f08a46
-                if req.editable:
f08a46
-                    logger.notify("ignoring %s" % req.url)
f08a46
-                    continue
f08a46
-                requirement_set.add_requirement(req)
f08a46
-
f08a46
-        #fail if no requirements
f08a46
-        if not requirement_set.has_requirements:
f08a46
-            opts = {'name': self.name}
f08a46
-            msg = ('You must give at least one requirement '
f08a46
-                   'to %(name)s (see "pip help %(name)s")' % opts)
f08a46
-            logger.error(msg)
f08a46
-            return
f08a46
+        build_delete = (not (options.no_clean or options.build_dir))
f08a46
+        with BuildDirectory(options.build_dir, delete=build_delete) as build_dir:
f08a46
+            requirement_set = RequirementSet(
f08a46
+                build_dir=build_dir,
f08a46
+                src_dir=None,
f08a46
+                download_dir=None,
f08a46
+                download_cache=options.download_cache,
f08a46
+                ignore_dependencies=options.ignore_dependencies,
f08a46
+                ignore_installed=True,
f08a46
+                session=session,
f08a46
+                wheel_download_dir=options.wheel_dir
f08a46
+            )
f08a46
 
f08a46
-        try:
f08a46
-            #build wheels
f08a46
-            wb = WheelBuilder(
f08a46
-                requirement_set,
f08a46
-                finder,
f08a46
-                options.wheel_dir,
f08a46
-                build_options = options.build_options or [],
f08a46
-                global_options = options.global_options or []
f08a46
-                )
f08a46
-            wb.build()
f08a46
-        except PreviousBuildDirError:
f08a46
-            options.no_clean = True
f08a46
-            raise
f08a46
-        finally:
f08a46
-            if not options.no_clean:
f08a46
-                requirement_set.cleanup_files()
f08a46
+            # make the wheelhouse
f08a46
+            if not os.path.exists(options.wheel_dir):
f08a46
+                os.makedirs(options.wheel_dir)
f08a46
+
f08a46
+            #parse args and/or requirements files
f08a46
+            for name in args:
f08a46
+                requirement_set.add_requirement(
f08a46
+                    InstallRequirement.from_line(name, None))
f08a46
+
f08a46
+            for filename in options.requirements:
f08a46
+                for req in parse_requirements(
f08a46
+                    filename,
f08a46
+                    finder=finder,
f08a46
+                    options=options,
f08a46
+                    session=session):
f08a46
+                    if req.editable:
f08a46
+                        logger.notify("ignoring %s" % req.url)
f08a46
+                        continue
f08a46
+                    requirement_set.add_requirement(req)
f08a46
+
f08a46
+            #fail if no requirements
f08a46
+            if not requirement_set.has_requirements:
f08a46
+                opts = {'name': self.name}
f08a46
+                msg = ('You must give at least one requirement '
f08a46
+                       'to %(name)s (see "pip help %(name)s")' % opts)
f08a46
+                logger.error(msg)
f08a46
+                return
f08a46
+
f08a46
+            try:
f08a46
+                #build wheels
f08a46
+                wb = WheelBuilder(
f08a46
+                    requirement_set,
f08a46
+                    finder,
f08a46
+                    options.wheel_dir,
f08a46
+                    build_options = options.build_options or [],
f08a46
+                    global_options = options.global_options or []
f08a46
+                    )
f08a46
+                wb.build()
f08a46
+            except PreviousBuildDirError:
f08a46
+                options.no_clean = True
f08a46
+                raise
f08a46
+            finally:
f08a46
+                if not options.no_clean:
f08a46
+                    requirement_set.cleanup_files()
f08a46
diff --git a/pip/util.py b/pip/util.py
f08a46
index f459bb2..f5edeeb 100644
f08a46
--- a/pip/util.py
f08a46
+++ b/pip/util.py
f08a46
@@ -8,6 +8,7 @@ import zipfile
f08a46
 import tarfile
f08a46
 import subprocess
f08a46
 import textwrap
f08a46
+import tempfile
f08a46
 
f08a46
 from pip.exceptions import InstallationError, BadCommand, PipError
f08a46
 from pip.backwardcompat import(WindowsError, string_types, raw_input,
f08a46
@@ -718,3 +719,35 @@ def is_prerelease(vers):
f08a46
 
f08a46
     parsed = version._normalized_key(normalized)
f08a46
     return any([any([y in set(["a", "b", "c", "rc", "dev"]) for y in x]) for x in parsed])
f08a46
+
f08a46
+
f08a46
+class BuildDirectory(object):
f08a46
+
f08a46
+    def __init__(self, name=None, delete=None):
f08a46
+        # If we were not given an explicit directory, and we were not given an
f08a46
+        # explicit delete option, then we'll default to deleting.
f08a46
+        if name is None and delete is None:
f08a46
+            delete = True
f08a46
+
f08a46
+        if name is None:
f08a46
+            name = tempfile.mkdtemp(prefix="pip-build-")
f08a46
+            # If we were not given an explicit directory, and we were not given
f08a46
+            # an explicit delete option, then we'll default to deleting.
f08a46
+            if delete is None:
f08a46
+                delete = True
f08a46
+
f08a46
+        self.name = name
f08a46
+        self.delete = delete
f08a46
+
f08a46
+    def __repr__(self):
f08a46
+        return "<{} {!r}>".format(self.__class__.__name__, self.name)
f08a46
+
f08a46
+    def __enter__(self):
f08a46
+        return self.name
f08a46
+
f08a46
+    def __exit__(self, exc, value, tb):
f08a46
+        self.cleanup()
f08a46
+
f08a46
+    def cleanup(self):
f08a46
+        if self.delete:
f08a46
+            rmtree(self.name)