virtualenv/web/virtualenv.py
changeset 283 d6bc9a2cc131
parent 4 0587d6556969
equal deleted inserted replaced
282:8ee36aa9a5f6 283:d6bc9a2cc131
     1 #!/usr/bin/env python
     1 #!/usr/bin/env python
     2 """Create a "virtual" Python installation
     2 """Create a "virtual" Python installation
     3 """
     3 """
     4 
     4 
     5 # If you change the version here, change it in setup.py
     5 __version__ = "1.11.4"
     6 # and docs/conf.py as well.
     6 virtualenv_version = __version__  # legacy
     7 __version__ = "1.8.4"  # following best practices
       
     8 virtualenv_version = __version__  # legacy, again
       
     9 
     7 
    10 import base64
     8 import base64
    11 import sys
     9 import sys
    12 import os
    10 import os
    13 import codecs
    11 import codecs
    21 import glob
    19 import glob
    22 import distutils.sysconfig
    20 import distutils.sysconfig
    23 from distutils.util import strtobool
    21 from distutils.util import strtobool
    24 import struct
    22 import struct
    25 import subprocess
    23 import subprocess
    26 
    24 import tarfile
    27 if sys.version_info < (2, 5):
    25 
       
    26 if sys.version_info < (2, 6):
    28     print('ERROR: %s' % sys.exc_info()[1])
    27     print('ERROR: %s' % sys.exc_info()[1])
    29     print('ERROR: this script requires Python 2.5 or greater.')
    28     print('ERROR: this script requires Python 2.6 or greater.')
    30     sys.exit(101)
    29     sys.exit(101)
    31 
    30 
    32 try:
    31 try:
    33     set
    32     set
    34 except NameError:
    33 except NameError:
    65 elif is_jython:
    64 elif is_jython:
    66     expected_exe = 'jython'
    65     expected_exe = 'jython'
    67 else:
    66 else:
    68     expected_exe = 'python'
    67     expected_exe = 'python'
    69 
    68 
       
    69 # Return a mapping of version -> Python executable
       
    70 # Only provided for Windows, where the information in the registry is used
       
    71 if not is_win:
       
    72     def get_installed_pythons():
       
    73         return {}
       
    74 else:
       
    75     try:
       
    76         import winreg
       
    77     except ImportError:
       
    78         import _winreg as winreg
       
    79 
       
    80     def get_installed_pythons():
       
    81         python_core = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE,
       
    82                 "Software\\Python\\PythonCore")
       
    83         i = 0
       
    84         versions = []
       
    85         while True:
       
    86             try:
       
    87                 versions.append(winreg.EnumKey(python_core, i))
       
    88                 i = i + 1
       
    89             except WindowsError:
       
    90                 break
       
    91         exes = dict()
       
    92         for ver in versions:
       
    93             path = winreg.QueryValue(python_core, "%s\\InstallPath" % ver)
       
    94             exes[ver] = join(path, "python.exe")
       
    95 
       
    96         winreg.CloseKey(python_core)
       
    97 
       
    98         # Add the major versions
       
    99         # Sort the keys, then repeatedly update the major version entry
       
   100         # Last executable (i.e., highest version) wins with this approach
       
   101         for ver in sorted(exes):
       
   102             exes[ver[0]] = exes[ver]
       
   103 
       
   104         return exes
    70 
   105 
    71 REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'nt', 'ntpath', 'genericpath',
   106 REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'nt', 'ntpath', 'genericpath',
    72                     'fnmatch', 'locale', 'encodings', 'codecs',
   107                     'fnmatch', 'locale', 'encodings', 'codecs',
    73                     'stat', 'UserDict', 'readline', 'copy_reg', 'types',
   108                     'stat', 'UserDict', 'readline', 'copy_reg', 'types',
    74                     're', 'sre', 'sre_parse', 'sre_constants', 'sre_compile',
   109                     're', 'sre', 'sre_parse', 'sre_constants', 'sre_compile',
    93                              'shutil', 'struct', 'copy', 'tokenize', 'token',
   128                              'shutil', 'struct', 'copy', 'tokenize', 'token',
    94                              'functools', 'heapq', 'bisect', 'weakref',
   129                              'functools', 'heapq', 'bisect', 'weakref',
    95                              'reprlib'])
   130                              'reprlib'])
    96     if minver >= 2:
   131     if minver >= 2:
    97         REQUIRED_FILES[-1] = 'config-%s' % majver
   132         REQUIRED_FILES[-1] = 'config-%s' % majver
    98     if minver == 3:
   133     if minver >= 3:
    99         import sysconfig
   134         import sysconfig
   100         platdir = sysconfig.get_config_var('PLATDIR')
   135         platdir = sysconfig.get_config_var('PLATDIR')
   101         REQUIRED_FILES.append(platdir)
   136         REQUIRED_FILES.append(platdir)
   102         # The whole list of 3.3 modules is reproduced below - the current
   137         # The whole list of 3.3 modules is reproduced below - the current
   103         # uncommented ones are required for 3.3 as of now, but more may be
   138         # uncommented ones are required for 3.3 as of now, but more may be
   248             #"xdrlib",
   283             #"xdrlib",
   249             #"xml",
   284             #"xml",
   250             #"xmlrpc",
   285             #"xmlrpc",
   251             #"zipfile",
   286             #"zipfile",
   252         ])
   287         ])
       
   288     if minver >= 4:
       
   289         REQUIRED_MODULES.extend([
       
   290             'operator',
       
   291             '_collections_abc',
       
   292             '_bootlocale',
       
   293         ])
   253 
   294 
   254 if is_pypy:
   295 if is_pypy:
   255     # these are needed to correctly display the exceptions that may happen
   296     # these are needed to correctly display the exceptions that may happen
   256     # during the bootstrap
   297     # during the bootstrap
   257     REQUIRED_MODULES.extend(['traceback', 'linecache'])
   298     REQUIRED_MODULES.extend(['traceback', 'linecache'])
   405         logger.info('Creating %s', path)
   446         logger.info('Creating %s', path)
   406         os.makedirs(path)
   447         os.makedirs(path)
   407     else:
   448     else:
   408         logger.info('Directory %s already exists', path)
   449         logger.info('Directory %s already exists', path)
   409 
   450 
   410 def copyfileordir(src, dest):
   451 def copyfileordir(src, dest, symlink=True):
   411     if os.path.isdir(src):
   452     if os.path.isdir(src):
   412         shutil.copytree(src, dest, True)
   453         shutil.copytree(src, dest, symlink)
   413     else:
   454     else:
   414         shutil.copy2(src, dest)
   455         shutil.copy2(src, dest)
   415 
   456 
   416 def copyfile(src, dest, symlink=True):
   457 def copyfile(src, dest, symlink=True):
   417     if not os.path.exists(src):
   458     if not os.path.exists(src):
   420         return
   461         return
   421     if os.path.exists(dest):
   462     if os.path.exists(dest):
   422         logger.debug('File %s already exists', dest)
   463         logger.debug('File %s already exists', dest)
   423         return
   464         return
   424     if not os.path.exists(os.path.dirname(dest)):
   465     if not os.path.exists(os.path.dirname(dest)):
   425         logger.info('Creating parent directories for %s' % os.path.dirname(dest))
   466         logger.info('Creating parent directories for %s', os.path.dirname(dest))
   426         os.makedirs(os.path.dirname(dest))
   467         os.makedirs(os.path.dirname(dest))
   427     if not os.path.islink(src):
   468     if not os.path.islink(src):
   428         srcpath = os.path.abspath(src)
   469         srcpath = os.path.abspath(src)
   429     else:
   470     else:
   430         srcpath = os.readlink(src)
   471         srcpath = os.readlink(src)
   432         logger.info('Symlinking %s', dest)
   473         logger.info('Symlinking %s', dest)
   433         try:
   474         try:
   434             os.symlink(srcpath, dest)
   475             os.symlink(srcpath, dest)
   435         except (OSError, NotImplementedError):
   476         except (OSError, NotImplementedError):
   436             logger.info('Symlinking failed, copying to %s', dest)
   477             logger.info('Symlinking failed, copying to %s', dest)
   437             copyfileordir(src, dest)
   478             copyfileordir(src, dest, symlink)
   438     else:
   479     else:
   439         logger.info('Copying to %s', dest)
   480         logger.info('Copying to %s', dest)
   440         copyfileordir(src, dest)
   481         copyfileordir(src, dest, symlink)
   441 
   482 
   442 def writefile(dest, content, overwrite=True):
   483 def writefile(dest, content, overwrite=True):
   443     if not os.path.exists(dest):
   484     if not os.path.exists(dest):
   444         logger.info('Writing %s', dest)
   485         logger.info('Writing %s', dest)
   445         f = open(dest, 'wb')
   486         f = open(dest, 'wb')
   480         files = glob.glob(os.path.join(dir, filename))
   521         files = glob.glob(os.path.join(dir, filename))
   481         if files and os.path.isfile(files[0]):
   522         if files and os.path.isfile(files[0]):
   482             return True, files[0]
   523             return True, files[0]
   483     return False, filename
   524     return False, filename
   484 
   525 
   485 def _install_req(py_executable, unzip=False, distribute=False,
       
   486                  search_dirs=None, never_download=False):
       
   487 
       
   488     if search_dirs is None:
       
   489         search_dirs = file_search_dirs()
       
   490 
       
   491     if not distribute:
       
   492         egg_path = 'setuptools-*-py%s.egg' % sys.version[:3]
       
   493         found, egg_path = _find_file(egg_path, search_dirs)
       
   494         project_name = 'setuptools'
       
   495         bootstrap_script = EZ_SETUP_PY
       
   496         tgz_path = None
       
   497     else:
       
   498         # Look for a distribute egg (these are not distributed by default,
       
   499         # but can be made available by the user)
       
   500         egg_path = 'distribute-*-py%s.egg' % sys.version[:3]
       
   501         found, egg_path = _find_file(egg_path, search_dirs)
       
   502         project_name = 'distribute'
       
   503         if found:
       
   504             tgz_path = None
       
   505             bootstrap_script = DISTRIBUTE_FROM_EGG_PY
       
   506         else:
       
   507             # Fall back to sdist
       
   508             # NB: egg_path is not None iff tgz_path is None
       
   509             # iff bootstrap_script is a generic setup script accepting
       
   510             # the standard arguments.
       
   511             egg_path = None
       
   512             tgz_path = 'distribute-*.tar.gz'
       
   513             found, tgz_path = _find_file(tgz_path, search_dirs)
       
   514             bootstrap_script = DISTRIBUTE_SETUP_PY
       
   515 
       
   516     if is_jython and os._name == 'nt':
       
   517         # Jython's .bat sys.executable can't handle a command line
       
   518         # argument with newlines
       
   519         fd, ez_setup = tempfile.mkstemp('.py')
       
   520         os.write(fd, bootstrap_script)
       
   521         os.close(fd)
       
   522         cmd = [py_executable, ez_setup]
       
   523     else:
       
   524         cmd = [py_executable, '-c', bootstrap_script]
       
   525     if unzip and egg_path:
       
   526         cmd.append('--always-unzip')
       
   527     env = {}
       
   528     remove_from_env = ['__PYVENV_LAUNCHER__']
       
   529     if logger.stdout_level_matches(logger.DEBUG) and egg_path:
       
   530         cmd.append('-v')
       
   531 
       
   532     old_chdir = os.getcwd()
       
   533     if egg_path is not None and os.path.exists(egg_path):
       
   534         logger.info('Using existing %s egg: %s' % (project_name, egg_path))
       
   535         cmd.append(egg_path)
       
   536         if os.environ.get('PYTHONPATH'):
       
   537             env['PYTHONPATH'] = egg_path + os.path.pathsep + os.environ['PYTHONPATH']
       
   538         else:
       
   539             env['PYTHONPATH'] = egg_path
       
   540     elif tgz_path is not None and os.path.exists(tgz_path):
       
   541         # Found a tgz source dist, let's chdir
       
   542         logger.info('Using existing %s egg: %s' % (project_name, tgz_path))
       
   543         os.chdir(os.path.dirname(tgz_path))
       
   544         # in this case, we want to be sure that PYTHONPATH is unset (not
       
   545         # just empty, really unset), else CPython tries to import the
       
   546         # site.py that it's in virtualenv_support
       
   547         remove_from_env.append('PYTHONPATH')
       
   548     elif never_download:
       
   549         logger.fatal("Can't find any local distributions of %s to install "
       
   550                      "and --never-download is set.  Either re-run virtualenv "
       
   551                      "without the --never-download option, or place a %s "
       
   552                      "distribution (%s) in one of these "
       
   553                      "locations: %r" % (project_name, project_name,
       
   554                                         egg_path or tgz_path,
       
   555                                         search_dirs))
       
   556         sys.exit(1)
       
   557     elif egg_path:
       
   558         logger.info('No %s egg found; downloading' % project_name)
       
   559         cmd.extend(['--always-copy', '-U', project_name])
       
   560     else:
       
   561         logger.info('No %s tgz found; downloading' % project_name)
       
   562     logger.start_progress('Installing %s...' % project_name)
       
   563     logger.indent += 2
       
   564     cwd = None
       
   565     if project_name == 'distribute':
       
   566         env['DONT_PATCH_SETUPTOOLS'] = 'true'
       
   567 
       
   568     def _filter_ez_setup(line):
       
   569         return filter_ez_setup(line, project_name)
       
   570 
       
   571     if not os.access(os.getcwd(), os.W_OK):
       
   572         cwd = tempfile.mkdtemp()
       
   573         if tgz_path is not None and os.path.exists(tgz_path):
       
   574             # the current working dir is hostile, let's copy the
       
   575             # tarball to a temp dir
       
   576             target = os.path.join(cwd, os.path.split(tgz_path)[-1])
       
   577             shutil.copy(tgz_path, target)
       
   578     try:
       
   579         call_subprocess(cmd, show_stdout=False,
       
   580                         filter_stdout=_filter_ez_setup,
       
   581                         extra_env=env,
       
   582                         remove_from_env=remove_from_env,
       
   583                         cwd=cwd)
       
   584     finally:
       
   585         logger.indent -= 2
       
   586         logger.end_progress()
       
   587         if cwd is not None:
       
   588             shutil.rmtree(cwd)
       
   589         if os.getcwd() != old_chdir:
       
   590             os.chdir(old_chdir)
       
   591         if is_jython and os._name == 'nt':
       
   592             os.remove(ez_setup)
       
   593 
       
   594 def file_search_dirs():
   526 def file_search_dirs():
   595     here = os.path.dirname(os.path.abspath(__file__))
   527     here = os.path.dirname(os.path.abspath(__file__))
   596     dirs = ['.', here,
   528     dirs = ['.', here,
   597             join(here, 'virtualenv_support')]
   529             join(here, 'virtualenv_support')]
   598     if os.path.splitext(os.path.dirname(__file__))[0] != 'virtualenv':
   530     if os.path.splitext(os.path.dirname(__file__))[0] != 'virtualenv':
   603             pass
   535             pass
   604         else:
   536         else:
   605             dirs.append(os.path.join(os.path.dirname(virtualenv.__file__), 'virtualenv_support'))
   537             dirs.append(os.path.join(os.path.dirname(virtualenv.__file__), 'virtualenv_support'))
   606     return [d for d in dirs if os.path.isdir(d)]
   538     return [d for d in dirs if os.path.isdir(d)]
   607 
   539 
   608 def install_setuptools(py_executable, unzip=False,
       
   609                        search_dirs=None, never_download=False):
       
   610     _install_req(py_executable, unzip,
       
   611                  search_dirs=search_dirs, never_download=never_download)
       
   612 
       
   613 def install_distribute(py_executable, unzip=False,
       
   614                        search_dirs=None, never_download=False):
       
   615     _install_req(py_executable, unzip, distribute=True,
       
   616                  search_dirs=search_dirs, never_download=never_download)
       
   617 
       
   618 _pip_re = re.compile(r'^pip-.*(zip|tar.gz|tar.bz2|tgz|tbz)$', re.I)
       
   619 def install_pip(py_executable, search_dirs=None, never_download=False):
       
   620     if search_dirs is None:
       
   621         search_dirs = file_search_dirs()
       
   622 
       
   623     filenames = []
       
   624     for dir in search_dirs:
       
   625         filenames.extend([join(dir, fn) for fn in os.listdir(dir)
       
   626                           if _pip_re.search(fn)])
       
   627     filenames = [(os.path.basename(filename).lower(), i, filename) for i, filename in enumerate(filenames)]
       
   628     filenames.sort()
       
   629     filenames = [filename for basename, i, filename in filenames]
       
   630     if not filenames:
       
   631         filename = 'pip'
       
   632     else:
       
   633         filename = filenames[-1]
       
   634     easy_install_script = 'easy_install'
       
   635     if is_win:
       
   636         easy_install_script = 'easy_install-script.py'
       
   637     # There's two subtle issues here when invoking easy_install.
       
   638     # 1. On unix-like systems the easy_install script can *only* be executed
       
   639     #    directly if its full filesystem path is no longer than 78 characters.
       
   640     # 2. A work around to [1] is to use the `python path/to/easy_install foo`
       
   641     #    pattern, but that breaks if the path contains non-ASCII characters, as
       
   642     #    you can't put the file encoding declaration before the shebang line.
       
   643     # The solution is to use Python's -x flag to skip the first line of the
       
   644     # script (and any ASCII decoding errors that may have occurred in that line)
       
   645     cmd = [py_executable, '-x', join(os.path.dirname(py_executable), easy_install_script), filename]
       
   646     # jython and pypy don't yet support -x
       
   647     if is_jython or is_pypy:
       
   648         cmd.remove('-x')
       
   649     if filename == 'pip':
       
   650         if never_download:
       
   651             logger.fatal("Can't find any local distributions of pip to install "
       
   652                          "and --never-download is set.  Either re-run virtualenv "
       
   653                          "without the --never-download option, or place a pip "
       
   654                          "source distribution (zip/tar.gz/tar.bz2) in one of these "
       
   655                          "locations: %r" % search_dirs)
       
   656             sys.exit(1)
       
   657         logger.info('Installing pip from network...')
       
   658     else:
       
   659         logger.info('Installing existing %s distribution: %s' % (
       
   660                 os.path.basename(filename), filename))
       
   661     logger.start_progress('Installing pip...')
       
   662     logger.indent += 2
       
   663     def _filter_setup(line):
       
   664         return filter_ez_setup(line, 'pip')
       
   665     try:
       
   666         call_subprocess(cmd, show_stdout=False,
       
   667                         filter_stdout=_filter_setup)
       
   668     finally:
       
   669         logger.indent -= 2
       
   670         logger.end_progress()
       
   671 
       
   672 def filter_ez_setup(line, project_name='setuptools'):
       
   673     if not line.strip():
       
   674         return Logger.DEBUG
       
   675     if project_name == 'distribute':
       
   676         for prefix in ('Extracting', 'Now working', 'Installing', 'Before',
       
   677                        'Scanning', 'Setuptools', 'Egg', 'Already',
       
   678                        'running', 'writing', 'reading', 'installing',
       
   679                        'creating', 'copying', 'byte-compiling', 'removing',
       
   680                        'Processing'):
       
   681             if line.startswith(prefix):
       
   682                 return Logger.DEBUG
       
   683         return Logger.DEBUG
       
   684     for prefix in ['Reading ', 'Best match', 'Processing setuptools',
       
   685                    'Copying setuptools', 'Adding setuptools',
       
   686                    'Installing ', 'Installed ']:
       
   687         if line.startswith(prefix):
       
   688             return Logger.DEBUG
       
   689     return Logger.INFO
       
   690 
       
   691 
   540 
   692 class UpdatingDefaultsHelpFormatter(optparse.IndentedHelpFormatter):
   541 class UpdatingDefaultsHelpFormatter(optparse.IndentedHelpFormatter):
   693     """
   542     """
   694     Custom help formatter for use in ConfigOptionParser that updates
   543     Custom help formatter for use in ConfigOptionParser that updates
   695     the defaults before expanding them, allowing them to show up correctly
   544     the defaults before expanding them, allowing them to show up correctly
   701         return optparse.IndentedHelpFormatter.expand_default(self, option)
   550         return optparse.IndentedHelpFormatter.expand_default(self, option)
   702 
   551 
   703 
   552 
   704 class ConfigOptionParser(optparse.OptionParser):
   553 class ConfigOptionParser(optparse.OptionParser):
   705     """
   554     """
   706     Custom option parser which updates its defaults by by checking the
   555     Custom option parser which updates its defaults by checking the
   707     configuration files and environmental variables
   556     configuration files and environmental variables
   708     """
   557     """
   709     def __init__(self, *args, **kwargs):
   558     def __init__(self, *args, **kwargs):
   710         self.config = ConfigParser.RawConfigParser()
   559         self.config = ConfigParser.RawConfigParser()
   711         self.files = self.get_config_files()
   560         self.files = self.get_config_files()
   801     parser.add_option(
   650     parser.add_option(
   802         '-v', '--verbose',
   651         '-v', '--verbose',
   803         action='count',
   652         action='count',
   804         dest='verbose',
   653         dest='verbose',
   805         default=0,
   654         default=0,
   806         help="Increase verbosity")
   655         help="Increase verbosity.")
   807 
   656 
   808     parser.add_option(
   657     parser.add_option(
   809         '-q', '--quiet',
   658         '-q', '--quiet',
   810         action='count',
   659         action='count',
   811         dest='quiet',
   660         dest='quiet',
   812         default=0,
   661         default=0,
   813         help='Decrease verbosity')
   662         help='Decrease verbosity.')
   814 
   663 
   815     parser.add_option(
   664     parser.add_option(
   816         '-p', '--python',
   665         '-p', '--python',
   817         dest='python',
   666         dest='python',
   818         metavar='PYTHON_EXE',
   667         metavar='PYTHON_EXE',
   822 
   671 
   823     parser.add_option(
   672     parser.add_option(
   824         '--clear',
   673         '--clear',
   825         dest='clear',
   674         dest='clear',
   826         action='store_true',
   675         action='store_true',
   827         help="Clear out the non-root install and start from scratch")
   676         help="Clear out the non-root install and start from scratch.")
   828 
   677 
   829     parser.set_defaults(system_site_packages=False)
   678     parser.set_defaults(system_site_packages=False)
   830     parser.add_option(
   679     parser.add_option(
   831         '--no-site-packages',
   680         '--no-site-packages',
   832         dest='system_site_packages',
   681         dest='system_site_packages',
   833         action='store_false',
   682         action='store_false',
   834         help="Don't give access to the global site-packages dir to the "
   683         help="DEPRECATED. Retained only for backward compatibility. "
   835              "virtual environment (default)")
   684              "Not having access to global site-packages is now the default behavior.")
   836 
   685 
   837     parser.add_option(
   686     parser.add_option(
   838         '--system-site-packages',
   687         '--system-site-packages',
   839         dest='system_site_packages',
   688         dest='system_site_packages',
   840         action='store_true',
   689         action='store_true',
   841         help="Give access to the global site-packages dir to the "
   690         help="Give the virtual environment access to the global site-packages.")
   842              "virtual environment")
   691 
       
   692     parser.add_option(
       
   693         '--always-copy',
       
   694         dest='symlink',
       
   695         action='store_false',
       
   696         default=True,
       
   697         help="Always copy files rather than symlinking.")
   843 
   698 
   844     parser.add_option(
   699     parser.add_option(
   845         '--unzip-setuptools',
   700         '--unzip-setuptools',
   846         dest='unzip_setuptools',
   701         dest='unzip_setuptools',
   847         action='store_true',
   702         action='store_true',
   848         help="Unzip Setuptools or Distribute when installing it")
   703         help="Unzip Setuptools when installing it.")
   849 
   704 
   850     parser.add_option(
   705     parser.add_option(
   851         '--relocatable',
   706         '--relocatable',
   852         dest='relocatable',
   707         dest='relocatable',
   853         action='store_true',
   708         action='store_true',
   854         help='Make an EXISTING virtualenv environment relocatable.  '
   709         help='Make an EXISTING virtualenv environment relocatable. '
   855         'This fixes up scripts and makes all .pth files relative')
   710              'This fixes up scripts and makes all .pth files relative.')
   856 
   711 
   857     parser.add_option(
   712     parser.add_option(
   858         '--distribute', '--use-distribute',  # the second option is for legacy reasons here. Hi Kenneth!
   713         '--no-setuptools',
   859         dest='use_distribute',
   714         dest='no_setuptools',
   860         action='store_true',
   715         action='store_true',
   861         help='Use Distribute instead of Setuptools. Set environ variable '
   716         help='Do not install setuptools (or pip) in the new virtualenv.')
   862         'VIRTUALENV_DISTRIBUTE to make it the default ')
       
   863 
   717 
   864     parser.add_option(
   718     parser.add_option(
   865         '--setuptools',
   719         '--no-pip',
   866         dest='use_distribute',
   720         dest='no_pip',
   867         action='store_false',
   721         action='store_true',
   868         help='Use Setuptools instead of Distribute.  Set environ variable '
   722         help='Do not install pip in the new virtualenv.')
   869         'VIRTUALENV_SETUPTOOLS to make it the default ')
       
   870 
       
   871     # Set this to True to use distribute by default, even in Python 2.
       
   872     parser.set_defaults(use_distribute=False)
       
   873 
   723 
   874     default_search_dirs = file_search_dirs()
   724     default_search_dirs = file_search_dirs()
   875     parser.add_option(
   725     parser.add_option(
   876         '--extra-search-dir',
   726         '--extra-search-dir',
   877         dest="search_dirs",
   727         dest="search_dirs",
   878         action="append",
   728         action="append",
       
   729         metavar='DIR',
   879         default=default_search_dirs,
   730         default=default_search_dirs,
   880         help="Directory to look for setuptools/distribute/pip distributions in. "
   731         help="Directory to look for setuptools/pip distributions in. "
   881         "You can add any number of additional --extra-search-dir paths.")
   732               "This option can be used multiple times.")
   882 
   733 
   883     parser.add_option(
   734     parser.add_option(
   884         '--never-download',
   735         '--never-download',
   885         dest="never_download",
   736         dest="never_download",
   886         action="store_true",
   737         action="store_true",
   887         help="Never download anything from the network.  Instead, virtualenv will fail "
   738         default=True,
   888         "if local distributions of setuptools/distribute/pip are not present.")
   739         help="DEPRECATED. Retained only for backward compatibility. This option has no effect. "
       
   740               "Virtualenv never downloads pip or setuptools.")
   889 
   741 
   890     parser.add_option(
   742     parser.add_option(
   891         '--prompt',
   743         '--prompt',
   892         dest='prompt',
   744         dest='prompt',
   893         help='Provides an alternative prompt prefix for this environment')
   745         help='Provides an alternative prompt prefix for this environment.')
       
   746 
       
   747     parser.add_option(
       
   748         '--setuptools',
       
   749         dest='setuptools',
       
   750         action='store_true',
       
   751         help="DEPRECATED. Retained only for backward compatibility. This option has no effect.")
       
   752 
       
   753     parser.add_option(
       
   754         '--distribute',
       
   755         dest='distribute',
       
   756         action='store_true',
       
   757         help="DEPRECATED. Retained only for backward compatibility. This option has no effect.")
   894 
   758 
   895     if 'extend_parser' in globals():
   759     if 'extend_parser' in globals():
   896         extend_parser(parser)
   760         extend_parser(parser)
   897 
   761 
   898     options, args = parser.parse_args()
   762     options, args = parser.parse_args()
   917             if file.endswith('.pyc'):
   781             if file.endswith('.pyc'):
   918                 file = file[:-1]
   782                 file = file[:-1]
   919             popen = subprocess.Popen([interpreter, file] + sys.argv[1:], env=env)
   783             popen = subprocess.Popen([interpreter, file] + sys.argv[1:], env=env)
   920             raise SystemExit(popen.wait())
   784             raise SystemExit(popen.wait())
   921 
   785 
   922     # Force --distribute on Python 3, since setuptools is not available.
       
   923     if majver > 2:
       
   924         options.use_distribute = True
       
   925 
       
   926     if os.environ.get('PYTHONDONTWRITEBYTECODE') and not options.use_distribute:
       
   927         print(
       
   928             "The PYTHONDONTWRITEBYTECODE environment variable is "
       
   929             "not compatible with setuptools. Either use --distribute "
       
   930             "or unset PYTHONDONTWRITEBYTECODE.")
       
   931         sys.exit(2)
       
   932     if not args:
   786     if not args:
   933         print('You must provide a DEST_DIR')
   787         print('You must provide a DEST_DIR')
   934         parser.print_help()
   788         parser.print_help()
   935         sys.exit(2)
   789         sys.exit(2)
   936     if len(args) > 1:
   790     if len(args) > 1:
   952 
   806 
   953     if options.relocatable:
   807     if options.relocatable:
   954         make_environment_relocatable(home_dir)
   808         make_environment_relocatable(home_dir)
   955         return
   809         return
   956 
   810 
       
   811     if not options.never_download:
       
   812         logger.warn('The --never-download option is for backward compatibility only.')
       
   813         logger.warn('Setting it to false is no longer supported, and will be ignored.')
       
   814 
   957     create_environment(home_dir,
   815     create_environment(home_dir,
   958                        site_packages=options.system_site_packages,
   816                        site_packages=options.system_site_packages,
   959                        clear=options.clear,
   817                        clear=options.clear,
   960                        unzip_setuptools=options.unzip_setuptools,
   818                        unzip_setuptools=options.unzip_setuptools,
   961                        use_distribute=options.use_distribute,
       
   962                        prompt=options.prompt,
   819                        prompt=options.prompt,
   963                        search_dirs=options.search_dirs,
   820                        search_dirs=options.search_dirs,
   964                        never_download=options.never_download)
   821                        never_download=True,
       
   822                        no_setuptools=options.no_setuptools,
       
   823                        no_pip=options.no_pip,
       
   824                        symlink=options.symlink)
   965     if 'after_install' in globals():
   825     if 'after_install' in globals():
   966         after_install(options, home_dir)
   826         after_install(options, home_dir)
   967 
   827 
   968 def call_subprocess(cmd, show_stdout=True,
   828 def call_subprocess(cmd, show_stdout=True,
   969                     filter_stdout=None, cwd=None,
   829                     filter_stdout=None, cwd=None,
  1043         else:
   903         else:
  1044             logger.warn(
   904             logger.warn(
  1045                 "Command %s had error code %s"
   905                 "Command %s had error code %s"
  1046                 % (cmd_desc, proc.returncode))
   906                 % (cmd_desc, proc.returncode))
  1047 
   907 
       
   908 def filter_install_output(line):
       
   909     if line.strip().startswith('running'):
       
   910         return Logger.INFO
       
   911     return Logger.DEBUG
       
   912 
       
   913 def find_wheels(projects, search_dirs):
       
   914     """Find wheels from which we can import PROJECTS.
       
   915 
       
   916     Scan through SEARCH_DIRS for a wheel for each PROJECT in turn. Return
       
   917     a list of the first wheel found for each PROJECT
       
   918     """
       
   919 
       
   920     wheels = []
       
   921 
       
   922     # Look through SEARCH_DIRS for the first suitable wheel. Don't bother
       
   923     # about version checking here, as this is simply to get something we can
       
   924     # then use to install the correct version.
       
   925     for project in projects:
       
   926         for dirname in search_dirs:
       
   927             # This relies on only having "universal" wheels available.
       
   928             # The pattern could be tightened to require -py2.py3-none-any.whl.
       
   929             files = glob.glob(os.path.join(dirname, project + '-*.whl'))
       
   930             if files:
       
   931                 wheels.append(os.path.abspath(files[0]))
       
   932                 break
       
   933         else:
       
   934             # We're out of luck, so quit with a suitable error
       
   935             logger.fatal('Cannot find a wheel for %s' % (project,))
       
   936 
       
   937     return wheels
       
   938 
       
   939 def install_wheel(project_names, py_executable, search_dirs=None):
       
   940     if search_dirs is None:
       
   941         search_dirs = file_search_dirs()
       
   942 
       
   943     wheels = find_wheels(['setuptools', 'pip'], search_dirs)
       
   944     pythonpath = os.pathsep.join(wheels)
       
   945     findlinks = ' '.join(search_dirs)
       
   946 
       
   947     cmd = [
       
   948         py_executable, '-c',
       
   949         'import sys, pip; sys.exit(pip.main(["install", "--ignore-installed"] + sys.argv[1:]))',
       
   950     ] + project_names
       
   951     logger.start_progress('Installing %s...' % (', '.join(project_names)))
       
   952     logger.indent += 2
       
   953     try:
       
   954         call_subprocess(cmd, show_stdout=False,
       
   955             extra_env = {
       
   956                 'PYTHONPATH': pythonpath,
       
   957                 'PIP_FIND_LINKS': findlinks,
       
   958                 'PIP_USE_WHEEL': '1',
       
   959                 'PIP_PRE': '1',
       
   960                 'PIP_NO_INDEX': '1'
       
   961             }
       
   962         )
       
   963     finally:
       
   964         logger.indent -= 2
       
   965         logger.end_progress()
  1048 
   966 
  1049 def create_environment(home_dir, site_packages=False, clear=False,
   967 def create_environment(home_dir, site_packages=False, clear=False,
  1050                        unzip_setuptools=False, use_distribute=False,
   968                        unzip_setuptools=False,
  1051                        prompt=None, search_dirs=None, never_download=False):
   969                        prompt=None, search_dirs=None, never_download=False,
       
   970                        no_setuptools=False, no_pip=False, symlink=True):
  1052     """
   971     """
  1053     Creates a new environment in ``home_dir``.
   972     Creates a new environment in ``home_dir``.
  1054 
   973 
  1055     If ``site_packages`` is true, then the global ``site-packages/``
   974     If ``site_packages`` is true, then the global ``site-packages/``
  1056     directory will be on the path.
   975     directory will be on the path.
  1060     """
   979     """
  1061     home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
   980     home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
  1062 
   981 
  1063     py_executable = os.path.abspath(install_python(
   982     py_executable = os.path.abspath(install_python(
  1064         home_dir, lib_dir, inc_dir, bin_dir,
   983         home_dir, lib_dir, inc_dir, bin_dir,
  1065         site_packages=site_packages, clear=clear))
   984         site_packages=site_packages, clear=clear, symlink=symlink))
  1066 
   985 
  1067     install_distutils(home_dir)
   986     install_distutils(home_dir)
  1068 
   987 
  1069     if use_distribute:
   988     if not no_setuptools:
  1070         install_distribute(py_executable, unzip=unzip_setuptools,
   989         to_install = ['setuptools']
  1071                            search_dirs=search_dirs, never_download=never_download)
   990         if not no_pip:
  1072     else:
   991             to_install.append('pip')
  1073         install_setuptools(py_executable, unzip=unzip_setuptools,
   992         install_wheel(to_install, py_executable, search_dirs)
  1074                            search_dirs=search_dirs, never_download=never_download)
       
  1075 
       
  1076     install_pip(py_executable, search_dirs=search_dirs, never_download=never_download)
       
  1077 
   993 
  1078     install_activate(home_dir, bin_dir, prompt)
   994     install_activate(home_dir, bin_dir, prompt)
  1079 
   995 
  1080 def is_executable_file(fpath):
   996 def is_executable_file(fpath):
  1081     return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
   997     return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
  1164                 relpath = relpath[1:]
  1080                 relpath = relpath[1:]
  1165             return join(dst_prefix, relpath)
  1081             return join(dst_prefix, relpath)
  1166     assert False, "Filename %s does not start with any of these prefixes: %s" % \
  1082     assert False, "Filename %s does not start with any of these prefixes: %s" % \
  1167         (filename, prefixes)
  1083         (filename, prefixes)
  1168 
  1084 
  1169 def copy_required_modules(dst_prefix):
  1085 def copy_required_modules(dst_prefix, symlink):
  1170     import imp
  1086     import imp
  1171     # If we are running under -p, we need to remove the current
  1087     # If we are running under -p, we need to remove the current
  1172     # directory from sys.path temporarily here, so that we
  1088     # directory from sys.path temporarily here, so that we
  1173     # definitely get the modules from the site directory of
  1089     # definitely get the modules from the site directory of
  1174     # the interpreter we are running under, not the one
  1090     # the interpreter we are running under, not the one
  1187             except ImportError:
  1103             except ImportError:
  1188                 logger.info("Cannot import bootstrap module: %s" % modname)
  1104                 logger.info("Cannot import bootstrap module: %s" % modname)
  1189             else:
  1105             else:
  1190                 if f is not None:
  1106                 if f is not None:
  1191                     f.close()
  1107                     f.close()
  1192                 # special-case custom readline.so on OS X:
  1108                 # special-case custom readline.so on OS X, but not for pypy:
  1193                 if modname == 'readline' and sys.platform == 'darwin' and not filename.endswith(join('lib-dynload', 'readline.so')):
  1109                 if modname == 'readline' and sys.platform == 'darwin' and not (
       
  1110                         is_pypy or filename.endswith(join('lib-dynload', 'readline.so'))):
  1194                     dst_filename = join(dst_prefix, 'lib', 'python%s' % sys.version[:3], 'readline.so')
  1111                     dst_filename = join(dst_prefix, 'lib', 'python%s' % sys.version[:3], 'readline.so')
       
  1112                 elif modname == 'readline' and sys.platform == 'win32':
       
  1113                     # special-case for Windows, where readline is not a
       
  1114                     # standard module, though it may have been installed in
       
  1115                     # site-packages by a third-party package
       
  1116                     pass
  1195                 else:
  1117                 else:
  1196                     dst_filename = change_prefix(filename, dst_prefix)
  1118                     dst_filename = change_prefix(filename, dst_prefix)
  1197                 copyfile(filename, dst_filename)
  1119                 copyfile(filename, dst_filename, symlink)
  1198                 if filename.endswith('.pyc'):
  1120                 if filename.endswith('.pyc'):
  1199                     pyfile = filename[:-1]
  1121                     pyfile = filename[:-1]
  1200                     if os.path.exists(pyfile):
  1122                     if os.path.exists(pyfile):
  1201                         copyfile(pyfile, dst_filename[:-1])
  1123                         copyfile(pyfile, dst_filename[:-1], symlink)
  1202     finally:
  1124     finally:
  1203         sys.path = _prev_sys_path
  1125         sys.path = _prev_sys_path
  1204 
  1126 
  1205 
  1127 
  1206 def subst_path(prefix_path, prefix, home_dir):
  1128 def subst_path(prefix_path, prefix, home_dir):
  1211         logger.warn('Path not in prefix %r %r', prefix_path, prefix)
  1133         logger.warn('Path not in prefix %r %r', prefix_path, prefix)
  1212         return
  1134         return
  1213     return prefix_path.replace(prefix, home_dir, 1)
  1135     return prefix_path.replace(prefix, home_dir, 1)
  1214 
  1136 
  1215 
  1137 
  1216 def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear):
  1138 def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear, symlink=True):
  1217     """Install just the base environment, no distutils patches etc"""
  1139     """Install just the base environment, no distutils patches etc"""
  1218     if sys.executable.startswith(bin_dir):
  1140     if sys.executable.startswith(bin_dir):
  1219         print('Please use the *system* python to run this script')
  1141         print('Please use the *system* python to run this script')
  1220         return
  1142         return
  1221 
  1143 
  1232         logger.notify('Using base prefix %r' % sys.base_prefix)
  1154         logger.notify('Using base prefix %r' % sys.base_prefix)
  1233         prefix = sys.base_prefix
  1155         prefix = sys.base_prefix
  1234     else:
  1156     else:
  1235         prefix = sys.prefix
  1157         prefix = sys.prefix
  1236     mkdir(lib_dir)
  1158     mkdir(lib_dir)
  1237     fix_lib64(lib_dir)
  1159     fix_lib64(lib_dir, symlink)
  1238     stdlib_dirs = [os.path.dirname(os.__file__)]
  1160     stdlib_dirs = [os.path.dirname(os.__file__)]
  1239     if is_win:
  1161     if is_win:
  1240         stdlib_dirs.append(join(os.path.dirname(stdlib_dirs[0]), 'DLLs'))
  1162         stdlib_dirs.append(join(os.path.dirname(stdlib_dirs[0]), 'DLLs'))
  1241     elif is_darwin:
  1163     elif is_darwin:
  1242         stdlib_dirs.append(join(stdlib_dirs[0], 'site-packages'))
  1164         stdlib_dirs.append(join(stdlib_dirs[0], 'site-packages'))
  1251             if not os.path.isdir(stdlib_dir):
  1173             if not os.path.isdir(stdlib_dir):
  1252                 continue
  1174                 continue
  1253             for fn in os.listdir(stdlib_dir):
  1175             for fn in os.listdir(stdlib_dir):
  1254                 bn = os.path.splitext(fn)[0]
  1176                 bn = os.path.splitext(fn)[0]
  1255                 if fn != 'site-packages' and bn in REQUIRED_FILES:
  1177                 if fn != 'site-packages' and bn in REQUIRED_FILES:
  1256                     copyfile(join(stdlib_dir, fn), join(lib_dir, fn))
  1178                     copyfile(join(stdlib_dir, fn), join(lib_dir, fn), symlink)
  1257         # ...and modules
  1179         # ...and modules
  1258         copy_required_modules(home_dir)
  1180         copy_required_modules(home_dir, symlink)
  1259     finally:
  1181     finally:
  1260         logger.indent -= 2
  1182         logger.indent -= 2
  1261     mkdir(join(lib_dir, 'site-packages'))
  1183     mkdir(join(lib_dir, 'site-packages'))
  1262     import site
  1184     import site
  1263     site_filename = site.__file__
  1185     site_filename = site.__file__
  1276     if is_pypy or is_win:
  1198     if is_pypy or is_win:
  1277         stdinc_dir = join(prefix, 'include')
  1199         stdinc_dir = join(prefix, 'include')
  1278     else:
  1200     else:
  1279         stdinc_dir = join(prefix, 'include', py_version + abiflags)
  1201         stdinc_dir = join(prefix, 'include', py_version + abiflags)
  1280     if os.path.exists(stdinc_dir):
  1202     if os.path.exists(stdinc_dir):
  1281         copyfile(stdinc_dir, inc_dir)
  1203         copyfile(stdinc_dir, inc_dir, symlink)
  1282     else:
  1204     else:
  1283         logger.debug('No include dir %s' % stdinc_dir)
  1205         logger.debug('No include dir %s' % stdinc_dir)
  1284 
  1206 
  1285     platinc_dir = distutils.sysconfig.get_python_inc(plat_specific=1)
  1207     platinc_dir = distutils.sysconfig.get_python_inc(plat_specific=1)
  1286     if platinc_dir != stdinc_dir:
  1208     if platinc_dir != stdinc_dir:
  1293         if platinc_dest:
  1215         if platinc_dest:
  1294             # PyPy's stdinc_dir and prefix are relative to the original binary
  1216             # PyPy's stdinc_dir and prefix are relative to the original binary
  1295             # (traversing virtualenvs), whereas the platinc_dir is relative to
  1217             # (traversing virtualenvs), whereas the platinc_dir is relative to
  1296             # the inner virtualenv and ignores the prefix argument.
  1218             # the inner virtualenv and ignores the prefix argument.
  1297             # This seems more evolved than designed.
  1219             # This seems more evolved than designed.
  1298             copyfile(platinc_dir, platinc_dest)
  1220             copyfile(platinc_dir, platinc_dest, symlink)
  1299 
  1221 
  1300     # pypy never uses exec_prefix, just ignore it
  1222     # pypy never uses exec_prefix, just ignore it
  1301     if sys.exec_prefix != prefix and not is_pypy:
  1223     if sys.exec_prefix != prefix and not is_pypy:
  1302         if is_win:
  1224         if is_win:
  1303             exec_dir = join(sys.exec_prefix, 'lib')
  1225             exec_dir = join(sys.exec_prefix, 'lib')
  1304         elif is_jython:
  1226         elif is_jython:
  1305             exec_dir = join(sys.exec_prefix, 'Lib')
  1227             exec_dir = join(sys.exec_prefix, 'Lib')
  1306         else:
  1228         else:
  1307             exec_dir = join(sys.exec_prefix, 'lib', py_version)
  1229             exec_dir = join(sys.exec_prefix, 'lib', py_version)
  1308         for fn in os.listdir(exec_dir):
  1230         for fn in os.listdir(exec_dir):
  1309             copyfile(join(exec_dir, fn), join(lib_dir, fn))
  1231             copyfile(join(exec_dir, fn), join(lib_dir, fn), symlink)
  1310 
  1232 
  1311     if is_jython:
  1233     if is_jython:
  1312         # Jython has either jython-dev.jar and javalib/ dir, or just
  1234         # Jython has either jython-dev.jar and javalib/ dir, or just
  1313         # jython.jar
  1235         # jython.jar
  1314         for name in 'jython-dev.jar', 'javalib', 'jython.jar':
  1236         for name in 'jython-dev.jar', 'javalib', 'jython.jar':
  1315             src = join(prefix, name)
  1237             src = join(prefix, name)
  1316             if os.path.exists(src):
  1238             if os.path.exists(src):
  1317                 copyfile(src, join(home_dir, name))
  1239                 copyfile(src, join(home_dir, name), symlink)
  1318         # XXX: registry should always exist after Jython 2.5rc1
  1240         # XXX: registry should always exist after Jython 2.5rc1
  1319         src = join(prefix, 'registry')
  1241         src = join(prefix, 'registry')
  1320         if os.path.exists(src):
  1242         if os.path.exists(src):
  1321             copyfile(src, join(home_dir, 'registry'), symlink=False)
  1243             copyfile(src, join(home_dir, 'registry'), symlink=False)
  1322         copyfile(join(prefix, 'cachedir'), join(home_dir, 'cachedir'),
  1244         copyfile(join(prefix, 'cachedir'), join(home_dir, 'cachedir'),
  1326     py_executable = join(bin_dir, os.path.basename(sys.executable))
  1248     py_executable = join(bin_dir, os.path.basename(sys.executable))
  1327     if 'Python.framework' in prefix:
  1249     if 'Python.framework' in prefix:
  1328         # OS X framework builds cause validation to break
  1250         # OS X framework builds cause validation to break
  1329         # https://github.com/pypa/virtualenv/issues/322
  1251         # https://github.com/pypa/virtualenv/issues/322
  1330         if os.environ.get('__PYVENV_LAUNCHER__'):
  1252         if os.environ.get('__PYVENV_LAUNCHER__'):
  1331           os.unsetenv('__PYVENV_LAUNCHER__')
  1253             del os.environ["__PYVENV_LAUNCHER__"]
  1332         if re.search(r'/Python(?:-32|-64)*$', py_executable):
  1254         if re.search(r'/Python(?:-32|-64)*$', py_executable):
  1333             # The name of the python executable is not quite what
  1255             # The name of the python executable is not quite what
  1334             # we want, rename it.
  1256             # we want, rename it.
  1335             py_executable = os.path.join(
  1257             py_executable = os.path.join(
  1336                     os.path.dirname(py_executable), 'python')
  1258                     os.path.dirname(py_executable), 'python')
  1349             os.unlink(pyd_pth)
  1271             os.unlink(pyd_pth)
  1350 
  1272 
  1351     if sys.executable != py_executable:
  1273     if sys.executable != py_executable:
  1352         ## FIXME: could I just hard link?
  1274         ## FIXME: could I just hard link?
  1353         executable = sys.executable
  1275         executable = sys.executable
  1354         if is_cygwin and os.path.exists(executable + '.exe'):
       
  1355             # Cygwin misreports sys.executable sometimes
       
  1356             executable += '.exe'
       
  1357             py_executable += '.exe'
       
  1358             logger.info('Executable actually exists in %s' % executable)
       
  1359         shutil.copyfile(executable, py_executable)
  1276         shutil.copyfile(executable, py_executable)
  1360         make_exe(py_executable)
  1277         make_exe(py_executable)
  1361         if is_win or is_cygwin:
  1278         if is_win or is_cygwin:
  1362             pythonw = os.path.join(os.path.dirname(sys.executable), 'pythonw.exe')
  1279             pythonw = os.path.join(os.path.dirname(sys.executable), 'pythonw.exe')
  1363             if os.path.exists(pythonw):
  1280             if os.path.exists(pythonw):
  1393             # make a symlink python --> pypy-c
  1310             # make a symlink python --> pypy-c
  1394             python_executable = os.path.join(os.path.dirname(py_executable), 'python')
  1311             python_executable = os.path.join(os.path.dirname(py_executable), 'python')
  1395             if sys.platform in ('win32', 'cygwin'):
  1312             if sys.platform in ('win32', 'cygwin'):
  1396                 python_executable += '.exe'
  1313                 python_executable += '.exe'
  1397             logger.info('Also created executable %s' % python_executable)
  1314             logger.info('Also created executable %s' % python_executable)
  1398             copyfile(py_executable, python_executable)
  1315             copyfile(py_executable, python_executable, symlink)
  1399 
  1316 
  1400             if is_win:
  1317             if is_win:
  1401                 for name in 'libexpat.dll', 'libpypy.dll', 'libpypy-c.dll', 'libeay32.dll', 'ssleay32.dll', 'sqlite.dll':
  1318                 for name in 'libexpat.dll', 'libpypy.dll', 'libpypy-c.dll', 'libeay32.dll', 'ssleay32.dll', 'sqlite.dll':
  1402                     src = join(prefix, name)
  1319                     src = join(prefix, name)
  1403                     if os.path.exists(src):
  1320                     if os.path.exists(src):
  1404                         copyfile(src, join(bin_dir, name))
  1321                         copyfile(src, join(bin_dir, name), symlink)
  1405 
  1322 
  1406     if os.path.splitext(os.path.basename(py_executable))[0] != expected_exe:
  1323     if os.path.splitext(os.path.basename(py_executable))[0] != expected_exe:
  1407         secondary_exe = os.path.join(os.path.dirname(py_executable),
  1324         secondary_exe = os.path.join(os.path.dirname(py_executable),
  1408                                      expected_exe)
  1325                                      expected_exe)
  1409         py_executable_ext = os.path.splitext(py_executable)[1]
  1326         py_executable_ext = os.path.splitext(py_executable)[1]
  1410         if py_executable_ext == '.exe':
  1327         if py_executable_ext.lower() == '.exe':
  1411             # python2.4 gives an extension of '.4' :P
  1328             # python2.4 gives an extension of '.4' :P
  1412             secondary_exe += py_executable_ext
  1329             secondary_exe += py_executable_ext
  1413         if os.path.exists(secondary_exe):
  1330         if os.path.exists(secondary_exe):
  1414             logger.warn('Not overwriting existing %s script %s (you must use %s)'
  1331             logger.warn('Not overwriting existing %s script %s (you must use %s)'
  1415                         % (expected_exe, secondary_exe, py_executable))
  1332                         % (expected_exe, secondary_exe, py_executable))
  1439 
  1356 
  1440         if os.path.exists(virtual_lib):
  1357         if os.path.exists(virtual_lib):
  1441             os.unlink(virtual_lib)
  1358             os.unlink(virtual_lib)
  1442         copyfile(
  1359         copyfile(
  1443             os.path.join(prefix, 'Python'),
  1360             os.path.join(prefix, 'Python'),
  1444             virtual_lib)
  1361             virtual_lib,
       
  1362             symlink)
  1445 
  1363 
  1446         # And then change the install_name of the copied python executable
  1364         # And then change the install_name of the copied python executable
  1447         try:
  1365         try:
  1448             mach_o_change(py_executable,
  1366             mach_o_change(py_executable,
  1449                           os.path.join(prefix, 'Python'),
  1367                           os.path.join(prefix, 'Python'),
  1480 
  1398 
  1481         for pth in required_symlinks:
  1399         for pth in required_symlinks:
  1482             full_pth = join(bin_dir, pth)
  1400             full_pth = join(bin_dir, pth)
  1483             if os.path.exists(full_pth):
  1401             if os.path.exists(full_pth):
  1484                 os.unlink(full_pth)
  1402                 os.unlink(full_pth)
  1485             os.symlink(py_executable_base, full_pth)
  1403             if symlink:
       
  1404                 os.symlink(py_executable_base, full_pth)
       
  1405             else:
       
  1406                 copyfile(py_executable, full_pth, symlink)
  1486 
  1407 
  1487     if is_win and ' ' in py_executable:
  1408     if is_win and ' ' in py_executable:
  1488         # There's a bug with subprocess on Windows when using a first
  1409         # There's a bug with subprocess on Windows when using a first
  1489         # argument that has a space in it.  Instead we have to quote
  1410         # argument that has a space in it.  Instead we have to quote
  1490         # the value:
  1411         # the value:
  1533     if os.path.exists(pydistutils):
  1454     if os.path.exists(pydistutils):
  1534         logger.notify('Please make sure you remove any previous custom paths from '
  1455         logger.notify('Please make sure you remove any previous custom paths from '
  1535                       'your %s file.' % pydistutils)
  1456                       'your %s file.' % pydistutils)
  1536     ## FIXME: really this should be calculated earlier
  1457     ## FIXME: really this should be calculated earlier
  1537 
  1458 
  1538     fix_local_scheme(home_dir)
  1459     fix_local_scheme(home_dir, symlink)
  1539 
  1460 
  1540     if site_packages:
  1461     if site_packages:
  1541         if os.path.exists(site_packages_filename):
  1462         if os.path.exists(site_packages_filename):
  1542             logger.info('Deleting %s' % site_packages_filename)
  1463             logger.info('Deleting %s' % site_packages_filename)
  1543             os.unlink(site_packages_filename)
  1464             os.unlink(site_packages_filename)
  1594     ## FIXME: this is breaking things, removing for now:
  1515     ## FIXME: this is breaking things, removing for now:
  1595     #distutils_cfg = DISTUTILS_CFG + "\n[install]\nprefix=%s\n" % home_dir
  1516     #distutils_cfg = DISTUTILS_CFG + "\n[install]\nprefix=%s\n" % home_dir
  1596     writefile(os.path.join(distutils_path, '__init__.py'), DISTUTILS_INIT)
  1517     writefile(os.path.join(distutils_path, '__init__.py'), DISTUTILS_INIT)
  1597     writefile(os.path.join(distutils_path, 'distutils.cfg'), DISTUTILS_CFG, overwrite=False)
  1518     writefile(os.path.join(distutils_path, 'distutils.cfg'), DISTUTILS_CFG, overwrite=False)
  1598 
  1519 
  1599 def fix_local_scheme(home_dir):
  1520 def fix_local_scheme(home_dir, symlink=True):
  1600     """
  1521     """
  1601     Platforms that use the "posix_local" install scheme (like Ubuntu with
  1522     Platforms that use the "posix_local" install scheme (like Ubuntu with
  1602     Python 2.7) need to be given an additional "local" location, sigh.
  1523     Python 2.7) need to be given an additional "local" location, sigh.
  1603     """
  1524     """
  1604     try:
  1525     try:
  1611             if not os.path.exists(local_path):
  1532             if not os.path.exists(local_path):
  1612                 os.mkdir(local_path)
  1533                 os.mkdir(local_path)
  1613                 for subdir_name in os.listdir(home_dir):
  1534                 for subdir_name in os.listdir(home_dir):
  1614                     if subdir_name == 'local':
  1535                     if subdir_name == 'local':
  1615                         continue
  1536                         continue
  1616                     os.symlink(os.path.abspath(os.path.join(home_dir, subdir_name)), \
  1537                     copyfile(os.path.abspath(os.path.join(home_dir, subdir_name)), \
  1617                                                             os.path.join(local_path, subdir_name))
  1538                                                             os.path.join(local_path, subdir_name), symlink)
  1618 
  1539 
  1619 def fix_lib64(lib_dir):
  1540 def fix_lib64(lib_dir, symlink=True):
  1620     """
  1541     """
  1621     Some platforms (particularly Gentoo on x64) put things in lib64/pythonX.Y
  1542     Some platforms (particularly Gentoo on x64) put things in lib64/pythonX.Y
  1622     instead of lib/pythonX.Y.  If this is such a platform we'll just create a
  1543     instead of lib/pythonX.Y.  If this is such a platform we'll just create a
  1623     symlink so lib64 points to lib
  1544     symlink so lib64 points to lib
  1624     """
  1545     """
  1625     if [p for p in distutils.sysconfig.get_config_vars().values()
  1546     if [p for p in distutils.sysconfig.get_config_vars().values()
  1626         if isinstance(p, basestring) and 'lib64' in p]:
  1547         if isinstance(p, basestring) and 'lib64' in p]:
       
  1548         # PyPy's library path scheme is not affected by this.
       
  1549         # Return early or we will die on the following assert.
       
  1550         if is_pypy:
       
  1551             logger.debug('PyPy detected, skipping lib64 symlinking')
       
  1552             return
       
  1553 
  1627         logger.debug('This system uses lib64; symlinking lib64 to lib')
  1554         logger.debug('This system uses lib64; symlinking lib64 to lib')
       
  1555 
  1628         assert os.path.basename(lib_dir) == 'python%s' % sys.version[:3], (
  1556         assert os.path.basename(lib_dir) == 'python%s' % sys.version[:3], (
  1629             "Unexpected python lib dir: %r" % lib_dir)
  1557             "Unexpected python lib dir: %r" % lib_dir)
  1630         lib_parent = os.path.dirname(lib_dir)
  1558         lib_parent = os.path.dirname(lib_dir)
  1631         top_level = os.path.dirname(lib_parent)
  1559         top_level = os.path.dirname(lib_parent)
  1632         lib_dir = os.path.join(top_level, 'lib')
  1560         lib_dir = os.path.join(top_level, 'lib')
  1633         lib64_link = os.path.join(top_level, 'lib64')
  1561         lib64_link = os.path.join(top_level, 'lib64')
  1634         assert os.path.basename(lib_parent) == 'lib', (
  1562         assert os.path.basename(lib_parent) == 'lib', (
  1635             "Unexpected parent dir: %r" % lib_parent)
  1563             "Unexpected parent dir: %r" % lib_parent)
  1636         if os.path.lexists(lib64_link):
  1564         if os.path.lexists(lib64_link):
  1637             return
  1565             return
  1638         os.symlink('lib', lib64_link)
  1566         cp_or_ln = (os.symlink if symlink else copyfile)
       
  1567         cp_or_ln('lib', lib64_link)
  1639 
  1568 
  1640 def resolve_interpreter(exe):
  1569 def resolve_interpreter(exe):
  1641     """
  1570     """
  1642     If the executable given isn't an absolute path, search $PATH for the interpreter
  1571     If the executable given isn't an absolute path, search $PATH for the interpreter
  1643     """
  1572     """
       
  1573     # If the "executable" is a version number, get the installed executable for
       
  1574     # that version
       
  1575     python_versions = get_installed_pythons()
       
  1576     if exe in python_versions:
       
  1577         exe = python_versions[exe]
       
  1578 
  1644     if os.path.abspath(exe) != exe:
  1579     if os.path.abspath(exe) != exe:
  1645         paths = os.environ.get('PATH', '').split(os.pathsep)
  1580         paths = os.environ.get('PATH', '').split(os.pathsep)
  1646         for path in paths:
  1581         for path in paths:
  1647             if os.path.exists(os.path.join(path, exe)):
  1582             if os.path.exists(os.path.join(path, exe)):
  1648                 exe = os.path.join(path, exe)
  1583                 exe = os.path.join(path, exe)
  1671     activate_this = os.path.join(bin_dir, 'activate_this.py')
  1606     activate_this = os.path.join(bin_dir, 'activate_this.py')
  1672     if not os.path.exists(activate_this):
  1607     if not os.path.exists(activate_this):
  1673         logger.fatal(
  1608         logger.fatal(
  1674             'The environment doesn\'t have a file %s -- please re-run virtualenv '
  1609             'The environment doesn\'t have a file %s -- please re-run virtualenv '
  1675             'on this environment to update it' % activate_this)
  1610             'on this environment to update it' % activate_this)
  1676     fixup_scripts(home_dir)
  1611     fixup_scripts(home_dir, bin_dir)
  1677     fixup_pth_and_egg_link(home_dir)
  1612     fixup_pth_and_egg_link(home_dir)
  1678     ## FIXME: need to fix up distutils.cfg
  1613     ## FIXME: need to fix up distutils.cfg
  1679 
  1614 
  1680 OK_ABS_SCRIPTS = ['python', 'python%s' % sys.version[:3],
  1615 OK_ABS_SCRIPTS = ['python', 'python%s' % sys.version[:3],
  1681                   'activate', 'activate.bat', 'activate_this.py']
  1616                   'activate', 'activate.bat', 'activate_this.py',
  1682 
  1617                   'activate.fish', 'activate.csh']
  1683 def fixup_scripts(home_dir):
  1618 
       
  1619 def fixup_scripts(home_dir, bin_dir):
       
  1620     if is_win:
       
  1621         new_shebang_args = (
       
  1622             '%s /c' % os.path.normcase(os.environ.get('COMSPEC', 'cmd.exe')),
       
  1623             '', '.exe')
       
  1624     else:
       
  1625         new_shebang_args = ('/usr/bin/env', sys.version[:3], '')
       
  1626 
  1684     # This is what we expect at the top of scripts:
  1627     # This is what we expect at the top of scripts:
  1685     shebang = '#!%s/bin/python' % os.path.normcase(os.path.abspath(home_dir))
  1628     shebang = '#!%s' % os.path.normcase(os.path.join(
       
  1629         os.path.abspath(bin_dir), 'python%s' % new_shebang_args[2]))
  1686     # This is what we'll put:
  1630     # This is what we'll put:
  1687     new_shebang = '#!/usr/bin/env python%s' % sys.version[:3]
  1631     new_shebang = '#!%s python%s%s' % new_shebang_args
  1688     if is_win:
  1632 
  1689         bin_suffix = 'Scripts'
       
  1690     else:
       
  1691         bin_suffix = 'bin'
       
  1692     bin_dir = os.path.join(home_dir, bin_suffix)
       
  1693     home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
       
  1694     for filename in os.listdir(bin_dir):
  1633     for filename in os.listdir(bin_dir):
  1695         filename = os.path.join(bin_dir, filename)
  1634         filename = os.path.join(bin_dir, filename)
  1696         if not os.path.isfile(filename):
  1635         if not os.path.isfile(filename):
  1697             # ignore subdirs, e.g. .svn ones.
  1636             # ignore subdirs, e.g. .svn ones.
  1698             continue
  1637             continue
  1707         finally:
  1646         finally:
  1708             f.close()
  1647             f.close()
  1709         if not lines:
  1648         if not lines:
  1710             logger.warn('Script %s is an empty file' % filename)
  1649             logger.warn('Script %s is an empty file' % filename)
  1711             continue
  1650             continue
  1712         if not lines[0].strip().startswith(shebang):
  1651 
       
  1652         old_shebang = lines[0].strip()
       
  1653         old_shebang = old_shebang[0:2] + os.path.normcase(old_shebang[2:])
       
  1654 
       
  1655         if not old_shebang.startswith(shebang):
  1713             if os.path.basename(filename) in OK_ABS_SCRIPTS:
  1656             if os.path.basename(filename) in OK_ABS_SCRIPTS:
  1714                 logger.debug('Cannot make script %s relative' % filename)
  1657                 logger.debug('Cannot make script %s relative' % filename)
  1715             elif lines[0].strip() == new_shebang:
  1658             elif lines[0].strip() == new_shebang:
  1716                 logger.info('Script %s has already been made relative' % filename)
  1659                 logger.info('Script %s has already been made relative' % filename)
  1717             else:
  1660             else:
  1724         f.write('\n'.join(script).encode('utf-8'))
  1667         f.write('\n'.join(script).encode('utf-8'))
  1725         f.close()
  1668         f.close()
  1726 
  1669 
  1727 def relative_script(lines):
  1670 def relative_script(lines):
  1728     "Return a script that'll work in a relocatable environment."
  1671     "Return a script that'll work in a relocatable environment."
  1729     activate = "import os; activate_this=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this"
  1672     activate = "import os; activate_this=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'activate_this.py'); exec(compile(open(activate_this).read(), activate_this, 'exec'), dict(__file__=activate_this)); del os, activate_this"
  1730     # Find the last future statement in the script. If we insert the activation
  1673     # Find the last future statement in the script. If we insert the activation
  1731     # line before a future statement, Python will raise a SyntaxError.
  1674     # line before a future statement, Python will raise a SyntaxError.
  1732     activate_at = None
  1675     activate_at = None
  1733     for idx, line in reversed(list(enumerate(lines))):
  1676     for idx, line in reversed(list(enumerate(lines))):
  1734         if line.split()[:3] == ['from', '__future__', 'import']:
  1677         if line.split()[:3] == ['from', '__future__', 'import']:
  1899     b = base64.b64decode(s.encode('ascii'))
  1842     b = base64.b64decode(s.encode('ascii'))
  1900     return zlib.decompress(b).decode('utf-8')
  1843     return zlib.decompress(b).decode('utf-8')
  1901 
  1844 
  1902 ##file site.py
  1845 ##file site.py
  1903 SITE_PY = convert("""
  1846 SITE_PY = convert("""
  1904 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
  2040 CP4PNIke9w==
  1983 hv3Sycbceamk052YpRxTuh7u1ZyQsG5x5UBln2Db3qZTkrJl/2PyHBjSwHvfHzIzPbyr9wdtTC3r
  2041 """)
  1984 HcGUxPCJGtG0nCIejbt9MupOt1FbXSBckPQAIB0VCLAQTEc3OgmiG87yHj7Xu8FpTdfxuidMoSMV
  2042 
  1985 lCzmcwT3ML5fg1+7OxUSP6g7o2j6c4M2B+olB+Fm34FbjbxQyHaT0J56wwdbXACuye7v/+IB/btp
  2043 ##file ez_setup.py
  1986 jLb74S6/2rZ62VsHyL4sZr5iZlCLROZxBEYG9OaQtDWWSxhBx2toGjq6DNXMDfkCHT/KpsXLtmmD
  2044 EZ_SETUP_PY = convert("""
  1987 Qc7sRHsA1igE/wfVIOdx
  2045 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
       
  2111 qL7+C1AkCcw=
       
  2112 """)
       
  2113 
       
  2114 ##file distribute_from_egg.py
       
  2115 DISTRIBUTE_FROM_EGG_PY = convert("""
       
  2116 eJw9j8tqAzEMRfcG/4MgmxQyptkGusonZBmGoGTUGYFfWPKE6dfXTkM3gqt7rh47OKP3NMF3SQFW
       
  2117 LlrRU1zhybpAxoKBlIqcrNnBdRjQP3GTocYfzmNrrCPQPN9iwzpxSQfQhWBi0cL3qtRtYIG/4Mv0
       
  2118 KApY5hooqrOGQ05FQTaxptF9Fnx16Rq0XofjaE1XGXVxHIWK7j8P8EY/rHndLqQ1a0pe3COFgHFy
       
  2119 hLLdWkDbi/DeEpCjNb3u/zccT2Ob8gtnwVyI
       
  2120 """)
       
  2121 
       
  2122 ##file distribute_setup.py
       
  2123 DISTRIBUTE_SETUP_PY = convert("""
       
  2124 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
       
  2211 """)
  1988 """)
  2212 
  1989 
  2213 ##file activate.sh
  1990 ##file activate.sh
  2214 ACTIVATE_SH = convert("""
  1991 ACTIVATE_SH = convert("""
  2215 eJytVVFvokAQfudXTLEPtTlLeo9tvMSmJpq02hSvl7u2wRUG2QR2DSxSe7n/frOACEVNLlceRHa+
  1992 eJytVVFvokAQfudXTLEPtTlLeo9tvMSmJpq02hSvl7u2wRUG2QR2DSxSe7n/frOACEVNLlceRHa+
  2229 +n8O9H8f5vsGOWXsL1+1k3g=
  2006 +n8O9H8f5vsGOWXsL1+1k3g=
  2230 """)
  2007 """)
  2231 
  2008 
  2232 ##file activate.fish
  2009 ##file activate.fish
  2233 ACTIVATE_FISH = convert("""
  2010 ACTIVATE_FISH = convert("""
  2234 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
       
  2026 32XS1ITj/qLjN72ob0hc5C9bzw8MhfmL
  2249 """)
  2027 """)
  2250 
  2028 
  2251 ##file activate.csh
  2029 ##file activate.csh
  2252 ACTIVATE_CSH = convert("""
  2030 ACTIVATE_CSH = convert("""
  2253 eJx9VG1P2zAQ/u5fcYQKNgTNPtN1WxlIQ4KCUEGaxuQ6yYVYSuzKdhqVX7+zk3bpy5YPUXL3PPfc
  2031 eJx9VG1P2zAQ/u5fcYQKNgTNPtN1WxlIQ4KCUEGaxuQ6yYVYSuzKdhqVX7+zk3bpy5YPUXL3PPfc
  2271 0QcvC8Lfaj0emsVKYF2rhL5L3fCkVjV76kShi59NHwDniAHzkgDgqBcwOgTMx+gDQQqXCw==
  2049 0QcvC8Lfaj0emsVKYF2rhL5L3fCkVjV76kShi59NHwDniAHzkgDgqBcwOgTMx+gDQQqXCw==
  2272 """)
  2050 """)
  2273 
  2051 
  2274 ##file deactivate.bat
  2052 ##file deactivate.bat
  2275 DEACTIVATE_BAT = convert("""
  2053 DEACTIVATE_BAT = convert("""
  2276 eJxzSE3OyFfIT0vj4spMU0hJTcvMS01RiPf3cYkP8wwKCXX0iQ8I8vcNCFHQ4FIAguLUEgUliIit
  2054 eJxzSE3OyFfIT0vj4ipOLVEI8wwKCXX0iXf1C7Pl4spMU0hJTcvMS01RiPf3cYmHyQYE+fsGhCho
  2277 KhZlqkpcnCA1WKRsuTTxWBIZ4uHv5+Hv64piEVwU3TK4BNBCmHIcKvDb6xjigWIjkI9uF1AIu7dA
  2055 cCkAAUibEkTEVhWLMlUlLk6QGixStlyaeCyJDPHw9/Pw93VFsQguim4ZXAJoIUw5DhX47XUM8UCx
  2278 akGGW7n6uXABALCXXUI=
  2056 EchHtwsohN1bILUgw61c/Vy4AJYPYm4=
  2279 """)
  2057 """)
  2280 
  2058 
  2281 ##file activate.ps1
  2059 ##file activate.ps1
  2282 ACTIVATE_PS = convert("""
  2060 ACTIVATE_PS = convert("""
  2283 eJylWdmS40Z2fVeE/oHT6rCloNUEAXDThB6wAyQAEjsB29GBjdgXYiWgmC/zgz/Jv+AEWNVd3S2N
  2061 eJylWdmS40Z2fVeE/oHT6rCloNUEAXDThB6wAyQAEjsB29GBjdgXYiWgmC/zgz/Jv+AEWNVd3S2N