virtualenv/web/virtualenv.py
author ymh <ymh.work@gmail.com>
Tue, 27 Oct 2015 14:37:20 +0100
changeset 669 0d9b16a45733
parent 653 f90aa05732cc
permissions -rw-r--r--
increment version
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
     1
#!/usr/bin/env python
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
     2
"""Create a "virtual" Python installation
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
     3
"""
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
     4
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
     5
__version__ = "13.1.2"
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
     6
virtualenv_version = __version__  # legacy
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
     7
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
     8
import base64
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
     9
import sys
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    10
import os
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    11
import codecs
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    12
import optparse
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    13
import re
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    14
import shutil
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    15
import logging
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    16
import tempfile
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    17
import zlib
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    18
import errno
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    19
import glob
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    20
import distutils.sysconfig
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    21
from distutils.util import strtobool
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    22
import struct
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    23
import subprocess
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    24
import tarfile
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    25
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    26
if sys.version_info < (2, 6):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    27
    print('ERROR: %s' % sys.exc_info()[1])
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    28
    print('ERROR: this script requires Python 2.6 or greater.')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    29
    sys.exit(101)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    30
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    31
try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    32
    basestring
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    33
except NameError:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    34
    basestring = str
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    35
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    36
try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    37
    import ConfigParser
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    38
except ImportError:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    39
    import configparser as ConfigParser
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    40
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    41
join = os.path.join
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    42
py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    43
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    44
is_jython = sys.platform.startswith('java')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    45
is_pypy = hasattr(sys, 'pypy_version_info')
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    46
is_win = (sys.platform == 'win32')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    47
is_cygwin = (sys.platform == 'cygwin')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    48
is_darwin = (sys.platform == 'darwin')
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    49
abiflags = getattr(sys, 'abiflags', '')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    50
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    51
user_dir = os.path.expanduser('~')
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    52
if is_win:
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    53
    default_storage_dir = os.path.join(user_dir, 'virtualenv')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    54
else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    55
    default_storage_dir = os.path.join(user_dir, '.virtualenv')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    56
default_config_file = os.path.join(default_storage_dir, 'virtualenv.ini')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    57
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    58
if is_pypy:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    59
    expected_exe = 'pypy'
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    60
elif is_jython:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    61
    expected_exe = 'jython'
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    62
else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    63
    expected_exe = 'python'
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
    64
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    65
# Return a mapping of version -> Python executable
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    66
# Only provided for Windows, where the information in the registry is used
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    67
if not is_win:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    68
    def get_installed_pythons():
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    69
        return {}
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    70
else:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    71
    try:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    72
        import winreg
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    73
    except ImportError:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    74
        import _winreg as winreg
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    75
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    76
    def get_installed_pythons():
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
    77
        try:
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
    78
            python_core = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE,
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
    79
                    "Software\\Python\\PythonCore")
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
    80
        except WindowsError:
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
    81
            # No registered Python installations
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
    82
            return {}
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    83
        i = 0
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    84
        versions = []
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    85
        while True:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    86
            try:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    87
                versions.append(winreg.EnumKey(python_core, i))
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    88
                i = i + 1
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    89
            except WindowsError:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    90
                break
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    91
        exes = dict()
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    92
        for ver in versions:
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
    93
            try:
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
    94
                path = winreg.QueryValue(python_core, "%s\\InstallPath" % ver)
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
    95
            except WindowsError:
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
    96
                continue
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    97
            exes[ver] = join(path, "python.exe")
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    98
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
    99
        winreg.CloseKey(python_core)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   100
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   101
        # Add the major versions
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   102
        # Sort the keys, then repeatedly update the major version entry
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   103
        # Last executable (i.e., highest version) wins with this approach
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   104
        for ver in sorted(exes):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   105
            exes[ver[0]] = exes[ver]
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   106
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   107
        return exes
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   108
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   109
REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'nt', 'ntpath', 'genericpath',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   110
                    'fnmatch', 'locale', 'encodings', 'codecs',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   111
                    'stat', 'UserDict', 'readline', 'copy_reg', 'types',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   112
                    're', 'sre', 'sre_parse', 'sre_constants', 'sre_compile',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   113
                    'zlib']
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   114
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   115
REQUIRED_FILES = ['lib-dynload', 'config']
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   116
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   117
majver, minver = sys.version_info[:2]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   118
if majver == 2:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   119
    if minver >= 6:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   120
        REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc'])
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   121
    if minver >= 7:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   122
        REQUIRED_MODULES.extend(['_weakrefset'])
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   123
elif majver == 3:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   124
    # Some extra modules are needed for Python 3, but different ones
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   125
    # for different versions.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   126
    REQUIRED_MODULES.extend(['_abcoll', 'warnings', 'linecache', 'abc', 'io',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   127
                             '_weakrefset', 'copyreg', 'tempfile', 'random',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   128
                             '__future__', 'collections', 'keyword', 'tarfile',
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   129
                             'shutil', 'struct', 'copy', 'tokenize', 'token',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   130
                             'functools', 'heapq', 'bisect', 'weakref',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   131
                             'reprlib'])
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   132
    if minver >= 2:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   133
        REQUIRED_FILES[-1] = 'config-%s' % majver
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   134
    if minver >= 3:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   135
        import sysconfig
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   136
        platdir = sysconfig.get_config_var('PLATDIR')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   137
        REQUIRED_FILES.append(platdir)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   138
        # The whole list of 3.3 modules is reproduced below - the current
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   139
        # uncommented ones are required for 3.3 as of now, but more may be
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   140
        # added as 3.3 development continues.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   141
        REQUIRED_MODULES.extend([
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   142
            #"aifc",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   143
            #"antigravity",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   144
            #"argparse",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   145
            #"ast",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   146
            #"asynchat",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   147
            #"asyncore",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   148
            "base64",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   149
            #"bdb",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   150
            #"binhex",
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   151
            #"bisect",
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   152
            #"calendar",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   153
            #"cgi",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   154
            #"cgitb",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   155
            #"chunk",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   156
            #"cmd",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   157
            #"codeop",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   158
            #"code",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   159
            #"colorsys",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   160
            #"_compat_pickle",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   161
            #"compileall",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   162
            #"concurrent",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   163
            #"configparser",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   164
            #"contextlib",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   165
            #"cProfile",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   166
            #"crypt",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   167
            #"csv",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   168
            #"ctypes",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   169
            #"curses",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   170
            #"datetime",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   171
            #"dbm",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   172
            #"decimal",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   173
            #"difflib",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   174
            #"dis",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   175
            #"doctest",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   176
            #"dummy_threading",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   177
            "_dummy_thread",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   178
            #"email",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   179
            #"filecmp",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   180
            #"fileinput",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   181
            #"formatter",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   182
            #"fractions",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   183
            #"ftplib",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   184
            #"functools",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   185
            #"getopt",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   186
            #"getpass",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   187
            #"gettext",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   188
            #"glob",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   189
            #"gzip",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   190
            "hashlib",
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   191
            #"heapq",
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   192
            "hmac",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   193
            #"html",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   194
            #"http",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   195
            #"idlelib",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   196
            #"imaplib",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   197
            #"imghdr",
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   198
            "imp",
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   199
            "importlib",
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   200
            #"inspect",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   201
            #"json",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   202
            #"lib2to3",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   203
            #"logging",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   204
            #"macpath",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   205
            #"macurl2path",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   206
            #"mailbox",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   207
            #"mailcap",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   208
            #"_markupbase",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   209
            #"mimetypes",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   210
            #"modulefinder",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   211
            #"multiprocessing",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   212
            #"netrc",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   213
            #"nntplib",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   214
            #"nturl2path",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   215
            #"numbers",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   216
            #"opcode",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   217
            #"optparse",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   218
            #"os2emxpath",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   219
            #"pdb",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   220
            #"pickle",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   221
            #"pickletools",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   222
            #"pipes",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   223
            #"pkgutil",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   224
            #"platform",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   225
            #"plat-linux2",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   226
            #"plistlib",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   227
            #"poplib",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   228
            #"pprint",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   229
            #"profile",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   230
            #"pstats",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   231
            #"pty",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   232
            #"pyclbr",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   233
            #"py_compile",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   234
            #"pydoc_data",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   235
            #"pydoc",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   236
            #"_pyio",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   237
            #"queue",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   238
            #"quopri",
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   239
            #"reprlib",
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   240
            "rlcompleter",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   241
            #"runpy",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   242
            #"sched",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   243
            #"shelve",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   244
            #"shlex",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   245
            #"smtpd",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   246
            #"smtplib",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   247
            #"sndhdr",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   248
            #"socket",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   249
            #"socketserver",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   250
            #"sqlite3",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   251
            #"ssl",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   252
            #"stringprep",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   253
            #"string",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   254
            #"_strptime",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   255
            #"subprocess",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   256
            #"sunau",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   257
            #"symbol",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   258
            #"symtable",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   259
            #"sysconfig",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   260
            #"tabnanny",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   261
            #"telnetlib",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   262
            #"test",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   263
            #"textwrap",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   264
            #"this",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   265
            #"_threading_local",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   266
            #"threading",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   267
            #"timeit",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   268
            #"tkinter",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   269
            #"tokenize",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   270
            #"token",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   271
            #"traceback",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   272
            #"trace",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   273
            #"tty",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   274
            #"turtledemo",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   275
            #"turtle",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   276
            #"unittest",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   277
            #"urllib",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   278
            #"uuid",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   279
            #"uu",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   280
            #"wave",
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   281
            #"weakref",
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   282
            #"webbrowser",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   283
            #"wsgiref",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   284
            #"xdrlib",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   285
            #"xml",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   286
            #"xmlrpc",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   287
            #"zipfile",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   288
        ])
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   289
    if minver >= 4:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   290
        REQUIRED_MODULES.extend([
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   291
            'operator',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   292
            '_collections_abc',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   293
            '_bootlocale',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   294
        ])
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   295
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   296
if is_pypy:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   297
    # these are needed to correctly display the exceptions that may happen
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   298
    # during the bootstrap
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   299
    REQUIRED_MODULES.extend(['traceback', 'linecache'])
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   300
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   301
class Logger(object):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   302
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   303
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   304
    Logging object for use in command-line script.  Allows ranges of
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   305
    levels, to avoid some redundancy of displayed information.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   306
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   307
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   308
    DEBUG = logging.DEBUG
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   309
    INFO = logging.INFO
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   310
    NOTIFY = (logging.INFO+logging.WARN)/2
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   311
    WARN = WARNING = logging.WARN
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   312
    ERROR = logging.ERROR
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   313
    FATAL = logging.FATAL
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   314
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   315
    LEVELS = [DEBUG, INFO, NOTIFY, WARN, ERROR, FATAL]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   316
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   317
    def __init__(self, consumers):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   318
        self.consumers = consumers
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   319
        self.indent = 0
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   320
        self.in_progress = None
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   321
        self.in_progress_hanging = False
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   322
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   323
    def debug(self, msg, *args, **kw):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   324
        self.log(self.DEBUG, msg, *args, **kw)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   325
    def info(self, msg, *args, **kw):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   326
        self.log(self.INFO, msg, *args, **kw)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   327
    def notify(self, msg, *args, **kw):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   328
        self.log(self.NOTIFY, msg, *args, **kw)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   329
    def warn(self, msg, *args, **kw):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   330
        self.log(self.WARN, msg, *args, **kw)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   331
    def error(self, msg, *args, **kw):
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   332
        self.log(self.ERROR, msg, *args, **kw)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   333
    def fatal(self, msg, *args, **kw):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   334
        self.log(self.FATAL, msg, *args, **kw)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   335
    def log(self, level, msg, *args, **kw):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   336
        if args:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   337
            if kw:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   338
                raise TypeError(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   339
                    "You may give positional or keyword arguments, not both")
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   340
        args = args or kw
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   341
        rendered = None
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   342
        for consumer_level, consumer in self.consumers:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   343
            if self.level_matches(level, consumer_level):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   344
                if (self.in_progress_hanging
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   345
                    and consumer in (sys.stdout, sys.stderr)):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   346
                    self.in_progress_hanging = False
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   347
                    sys.stdout.write('\n')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   348
                    sys.stdout.flush()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   349
                if rendered is None:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   350
                    if args:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   351
                        rendered = msg % args
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   352
                    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   353
                        rendered = msg
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   354
                    rendered = ' '*self.indent + rendered
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   355
                if hasattr(consumer, 'write'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   356
                    consumer.write(rendered+'\n')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   357
                else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   358
                    consumer(rendered)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   359
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   360
    def start_progress(self, msg):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   361
        assert not self.in_progress, (
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   362
            "Tried to start_progress(%r) while in_progress %r"
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   363
            % (msg, self.in_progress))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   364
        if self.level_matches(self.NOTIFY, self._stdout_level()):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   365
            sys.stdout.write(msg)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   366
            sys.stdout.flush()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   367
            self.in_progress_hanging = True
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   368
        else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   369
            self.in_progress_hanging = False
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   370
        self.in_progress = msg
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   371
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   372
    def end_progress(self, msg='done.'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   373
        assert self.in_progress, (
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   374
            "Tried to end_progress without start_progress")
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   375
        if self.stdout_level_matches(self.NOTIFY):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   376
            if not self.in_progress_hanging:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   377
                # Some message has been printed out since start_progress
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   378
                sys.stdout.write('...' + self.in_progress + msg + '\n')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   379
                sys.stdout.flush()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   380
            else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   381
                sys.stdout.write(msg + '\n')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   382
                sys.stdout.flush()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   383
        self.in_progress = None
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   384
        self.in_progress_hanging = False
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   385
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   386
    def show_progress(self):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   387
        """If we are in a progress scope, and no log messages have been
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   388
        shown, write out another '.'"""
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   389
        if self.in_progress_hanging:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   390
            sys.stdout.write('.')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   391
            sys.stdout.flush()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   392
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   393
    def stdout_level_matches(self, level):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   394
        """Returns true if a message at this level will go to stdout"""
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   395
        return self.level_matches(level, self._stdout_level())
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   396
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   397
    def _stdout_level(self):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   398
        """Returns the level that stdout runs at"""
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   399
        for level, consumer in self.consumers:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   400
            if consumer is sys.stdout:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   401
                return level
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   402
        return self.FATAL
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   403
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   404
    def level_matches(self, level, consumer_level):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   405
        """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   406
        >>> l = Logger([])
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   407
        >>> l.level_matches(3, 4)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   408
        False
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   409
        >>> l.level_matches(3, 2)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   410
        True
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   411
        >>> l.level_matches(slice(None, 3), 3)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   412
        False
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   413
        >>> l.level_matches(slice(None, 3), 2)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   414
        True
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   415
        >>> l.level_matches(slice(1, 3), 1)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   416
        True
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   417
        >>> l.level_matches(slice(2, 3), 1)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   418
        False
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   419
        """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   420
        if isinstance(level, slice):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   421
            start, stop = level.start, level.stop
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   422
            if start is not None and start > consumer_level:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   423
                return False
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   424
            if stop is not None and stop <= consumer_level:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   425
                return False
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   426
            return True
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   427
        else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   428
            return level >= consumer_level
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   429
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   430
    #@classmethod
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   431
    def level_for_integer(cls, level):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   432
        levels = cls.LEVELS
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   433
        if level < 0:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   434
            return levels[0]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   435
        if level >= len(levels):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   436
            return levels[-1]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   437
        return levels[level]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   438
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   439
    level_for_integer = classmethod(level_for_integer)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   440
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   441
# create a silent logger just to prevent this from being undefined
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   442
# will be overridden with requested verbosity main() is called.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   443
logger = Logger([(Logger.LEVELS[-1], sys.stdout)])
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   444
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   445
def mkdir(path):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   446
    if not os.path.exists(path):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   447
        logger.info('Creating %s', path)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   448
        os.makedirs(path)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   449
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   450
        logger.info('Directory %s already exists', path)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   451
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   452
def copyfileordir(src, dest, symlink=True):
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   453
    if os.path.isdir(src):
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   454
        shutil.copytree(src, dest, symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   455
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   456
        shutil.copy2(src, dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   457
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   458
def copyfile(src, dest, symlink=True):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   459
    if not os.path.exists(src):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   460
        # Some bad symlink in the src
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   461
        logger.warn('Cannot find file %s (bad symlink)', src)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   462
        return
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   463
    if os.path.exists(dest):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   464
        logger.debug('File %s already exists', dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   465
        return
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   466
    if not os.path.exists(os.path.dirname(dest)):
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   467
        logger.info('Creating parent directories for %s', os.path.dirname(dest))
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   468
        os.makedirs(os.path.dirname(dest))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   469
    if not os.path.islink(src):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   470
        srcpath = os.path.abspath(src)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   471
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   472
        srcpath = os.readlink(src)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   473
    if symlink and hasattr(os, 'symlink') and not is_win:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   474
        logger.info('Symlinking %s', dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   475
        try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   476
            os.symlink(srcpath, dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   477
        except (OSError, NotImplementedError):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   478
            logger.info('Symlinking failed, copying to %s', dest)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   479
            copyfileordir(src, dest, symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   480
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   481
        logger.info('Copying to %s', dest)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   482
        copyfileordir(src, dest, symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   483
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   484
def writefile(dest, content, overwrite=True):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   485
    if not os.path.exists(dest):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   486
        logger.info('Writing %s', dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   487
        f = open(dest, 'wb')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   488
        f.write(content.encode('utf-8'))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   489
        f.close()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   490
        return
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   491
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   492
        f = open(dest, 'rb')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   493
        c = f.read()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   494
        f.close()
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   495
        if c != content.encode("utf-8"):
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   496
            if not overwrite:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   497
                logger.notify('File %s exists with different content; not overwriting', dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   498
                return
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   499
            logger.notify('Overwriting %s with new content', dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   500
            f = open(dest, 'wb')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   501
            f.write(content.encode('utf-8'))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   502
            f.close()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   503
        else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   504
            logger.info('Content %s already in place', dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   505
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   506
def rmtree(dir):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   507
    if os.path.exists(dir):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   508
        logger.notify('Deleting tree %s', dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   509
        shutil.rmtree(dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   510
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   511
        logger.info('Do not need to delete %s; already gone', dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   512
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   513
def make_exe(fn):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   514
    if hasattr(os, 'chmod'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   515
        oldmode = os.stat(fn).st_mode & 0xFFF # 0o7777
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   516
        newmode = (oldmode | 0x16D) & 0xFFF # 0o555, 0o7777
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   517
        os.chmod(fn, newmode)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   518
        logger.info('Changed mode of %s to %s', fn, oct(newmode))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   519
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   520
def _find_file(filename, dirs):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   521
    for dir in reversed(dirs):
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   522
        files = glob.glob(os.path.join(dir, filename))
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   523
        if files and os.path.isfile(files[0]):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   524
            return True, files[0]
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   525
    return False, filename
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   526
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   527
def file_search_dirs():
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   528
    here = os.path.dirname(os.path.abspath(__file__))
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   529
    dirs = [here, join(here, 'virtualenv_support')]
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   530
    if os.path.splitext(os.path.dirname(__file__))[0] != 'virtualenv':
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   531
        # Probably some boot script; just in case virtualenv is installed...
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   532
        try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   533
            import virtualenv
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   534
        except ImportError:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   535
            pass
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   536
        else:
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   537
            dirs.append(os.path.join(
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   538
                os.path.dirname(virtualenv.__file__), 'virtualenv_support'))
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   539
    return [d for d in dirs if os.path.isdir(d)]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   540
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   541
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   542
class UpdatingDefaultsHelpFormatter(optparse.IndentedHelpFormatter):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   543
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   544
    Custom help formatter for use in ConfigOptionParser that updates
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   545
    the defaults before expanding them, allowing them to show up correctly
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   546
    in the help listing
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   547
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   548
    def expand_default(self, option):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   549
        if self.parser is not None:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   550
            self.parser.update_defaults(self.parser.defaults)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   551
        return optparse.IndentedHelpFormatter.expand_default(self, option)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   552
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   553
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   554
class ConfigOptionParser(optparse.OptionParser):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   555
    """
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   556
    Custom option parser which updates its defaults by checking the
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   557
    configuration files and environmental variables
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   558
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   559
    def __init__(self, *args, **kwargs):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   560
        self.config = ConfigParser.RawConfigParser()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   561
        self.files = self.get_config_files()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   562
        self.config.read(self.files)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   563
        optparse.OptionParser.__init__(self, *args, **kwargs)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   564
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   565
    def get_config_files(self):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   566
        config_file = os.environ.get('VIRTUALENV_CONFIG_FILE', False)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   567
        if config_file and os.path.exists(config_file):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   568
            return [config_file]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   569
        return [default_config_file]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   570
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   571
    def update_defaults(self, defaults):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   572
        """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   573
        Updates the given defaults with values from the config files and
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   574
        the environ. Does a little special handling for certain types of
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   575
        options (lists).
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   576
        """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   577
        # Then go and look for the other sources of configuration:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   578
        config = {}
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   579
        # 1. config files
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   580
        config.update(dict(self.get_config_section('virtualenv')))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   581
        # 2. environmental variables
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   582
        config.update(dict(self.get_environ_vars()))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   583
        # Then set the options with those values
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   584
        for key, val in config.items():
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   585
            key = key.replace('_', '-')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   586
            if not key.startswith('--'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   587
                key = '--%s' % key  # only prefer long opts
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   588
            option = self.get_option(key)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   589
            if option is not None:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   590
                # ignore empty values
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   591
                if not val:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   592
                    continue
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   593
                # handle multiline configs
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   594
                if option.action == 'append':
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   595
                    val = val.split()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   596
                else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   597
                    option.nargs = 1
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   598
                if option.action == 'store_false':
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   599
                    val = not strtobool(val)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   600
                elif option.action in ('store_true', 'count'):
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   601
                    val = strtobool(val)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   602
                try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   603
                    val = option.convert_value(key, val)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   604
                except optparse.OptionValueError:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   605
                    e = sys.exc_info()[1]
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   606
                    print("An error occurred during configuration: %s" % e)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   607
                    sys.exit(3)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   608
                defaults[option.dest] = val
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   609
        return defaults
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   610
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   611
    def get_config_section(self, name):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   612
        """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   613
        Get a section of a configuration
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   614
        """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   615
        if self.config.has_section(name):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   616
            return self.config.items(name)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   617
        return []
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   618
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   619
    def get_environ_vars(self, prefix='VIRTUALENV_'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   620
        """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   621
        Returns a generator with all environmental vars with prefix VIRTUALENV
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   622
        """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   623
        for key, val in os.environ.items():
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   624
            if key.startswith(prefix):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   625
                yield (key.replace(prefix, '').lower(), val)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   626
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   627
    def get_default_values(self):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   628
        """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   629
        Overridding to make updating the defaults after instantiation of
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   630
        the option parser possible, update_defaults() does the dirty work.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   631
        """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   632
        if not self.process_default_values:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   633
            # Old, pre-Optik 1.5 behaviour.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   634
            return optparse.Values(self.defaults)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   635
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   636
        defaults = self.update_defaults(self.defaults.copy())  # ours
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   637
        for option in self._get_all_options():
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   638
            default = defaults.get(option.dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   639
            if isinstance(default, basestring):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   640
                opt_str = option.get_opt_string()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   641
                defaults[option.dest] = option.check_value(opt_str, default)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   642
        return optparse.Values(defaults)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   643
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   644
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   645
def main():
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   646
    parser = ConfigOptionParser(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   647
        version=virtualenv_version,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   648
        usage="%prog [OPTIONS] DEST_DIR",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   649
        formatter=UpdatingDefaultsHelpFormatter())
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   650
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   651
    parser.add_option(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   652
        '-v', '--verbose',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   653
        action='count',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   654
        dest='verbose',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   655
        default=0,
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   656
        help="Increase verbosity.")
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   657
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   658
    parser.add_option(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   659
        '-q', '--quiet',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   660
        action='count',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   661
        dest='quiet',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   662
        default=0,
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   663
        help='Decrease verbosity.')
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   664
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   665
    parser.add_option(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   666
        '-p', '--python',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   667
        dest='python',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   668
        metavar='PYTHON_EXE',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   669
        help='The Python interpreter to use, e.g., --python=python2.5 will use the python2.5 '
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   670
        'interpreter to create the new environment.  The default is the interpreter that '
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   671
        'virtualenv was installed with (%s)' % sys.executable)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   672
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   673
    parser.add_option(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   674
        '--clear',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   675
        dest='clear',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   676
        action='store_true',
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   677
        help="Clear out the non-root install and start from scratch.")
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   678
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   679
    parser.set_defaults(system_site_packages=False)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   680
    parser.add_option(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   681
        '--no-site-packages',
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   682
        dest='system_site_packages',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   683
        action='store_false',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   684
        help="DEPRECATED. Retained only for backward compatibility. "
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   685
             "Not having access to global site-packages is now the default behavior.")
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   686
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   687
    parser.add_option(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   688
        '--system-site-packages',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   689
        dest='system_site_packages',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   690
        action='store_true',
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   691
        help="Give the virtual environment access to the global site-packages.")
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   692
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   693
    parser.add_option(
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   694
        '--always-copy',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   695
        dest='symlink',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   696
        action='store_false',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   697
        default=True,
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   698
        help="Always copy files rather than symlinking.")
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   699
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   700
    parser.add_option(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   701
        '--unzip-setuptools',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   702
        dest='unzip_setuptools',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   703
        action='store_true',
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   704
        help="Unzip Setuptools when installing it.")
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   705
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   706
    parser.add_option(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   707
        '--relocatable',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   708
        dest='relocatable',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   709
        action='store_true',
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   710
        help='Make an EXISTING virtualenv environment relocatable. '
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   711
             'This fixes up scripts and makes all .pth files relative.')
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   712
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   713
    parser.add_option(
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   714
        '--no-setuptools',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   715
        dest='no_setuptools',
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   716
        action='store_true',
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   717
        help='Do not install setuptools (or pip) in the new virtualenv.')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   718
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   719
    parser.add_option(
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   720
        '--no-pip',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   721
        dest='no_pip',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   722
        action='store_true',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   723
        help='Do not install pip in the new virtualenv.')
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   724
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   725
    parser.add_option(
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   726
        '--no-wheel',
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   727
        dest='no_wheel',
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   728
        action='store_true',
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   729
        help='Do not install wheel in the new virtualenv.')
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   730
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   731
    default_search_dirs = file_search_dirs()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   732
    parser.add_option(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   733
        '--extra-search-dir',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   734
        dest="search_dirs",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   735
        action="append",
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   736
        metavar='DIR',
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   737
        default=default_search_dirs,
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   738
        help="Directory to look for setuptools/pip distributions in. "
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   739
              "This option can be used multiple times.")
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   740
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   741
    parser.add_option(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   742
        '--never-download',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   743
        dest="never_download",
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   744
        action="store_true",
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   745
        default=True,
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   746
        help="DEPRECATED. Retained only for backward compatibility. This option has no effect. "
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   747
              "Virtualenv never downloads pip or setuptools.")
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   748
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   749
    parser.add_option(
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   750
        '--prompt',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   751
        dest='prompt',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   752
        help='Provides an alternative prompt prefix for this environment.')
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   753
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   754
    parser.add_option(
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   755
        '--setuptools',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   756
        dest='setuptools',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   757
        action='store_true',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   758
        help="DEPRECATED. Retained only for backward compatibility. This option has no effect.")
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   759
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   760
    parser.add_option(
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   761
        '--distribute',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   762
        dest='distribute',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   763
        action='store_true',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   764
        help="DEPRECATED. Retained only for backward compatibility. This option has no effect.")
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   765
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   766
    if 'extend_parser' in globals():
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   767
        extend_parser(parser)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   768
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   769
    options, args = parser.parse_args()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   770
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   771
    global logger
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   772
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   773
    if 'adjust_options' in globals():
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   774
        adjust_options(options, args)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   775
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   776
    verbosity = options.verbose - options.quiet
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   777
    logger = Logger([(Logger.level_for_integer(2 - verbosity), sys.stdout)])
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   778
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   779
    if options.python and not os.environ.get('VIRTUALENV_INTERPRETER_RUNNING'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   780
        env = os.environ.copy()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   781
        interpreter = resolve_interpreter(options.python)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   782
        if interpreter == sys.executable:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   783
            logger.warn('Already using interpreter %s' % interpreter)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   784
        else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   785
            logger.notify('Running virtualenv with interpreter %s' % interpreter)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   786
            env['VIRTUALENV_INTERPRETER_RUNNING'] = 'true'
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   787
            file = __file__
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   788
            if file.endswith('.pyc'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   789
                file = file[:-1]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   790
            popen = subprocess.Popen([interpreter, file] + sys.argv[1:], env=env)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   791
            raise SystemExit(popen.wait())
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   792
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   793
    if not args:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   794
        print('You must provide a DEST_DIR')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   795
        parser.print_help()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   796
        sys.exit(2)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   797
    if len(args) > 1:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   798
        print('There must be only one argument: DEST_DIR (you gave %s)' % (
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   799
            ' '.join(args)))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   800
        parser.print_help()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   801
        sys.exit(2)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   802
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   803
    home_dir = args[0]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   804
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   805
    if os.environ.get('WORKING_ENV'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   806
        logger.fatal('ERROR: you cannot run virtualenv while in a workingenv')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   807
        logger.fatal('Please deactivate your workingenv, then re-run this script')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   808
        sys.exit(3)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   809
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   810
    if 'PYTHONHOME' in os.environ:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   811
        logger.warn('PYTHONHOME is set.  You *must* activate the virtualenv before using it')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   812
        del os.environ['PYTHONHOME']
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   813
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   814
    if options.relocatable:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   815
        make_environment_relocatable(home_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   816
        return
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   817
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   818
    if not options.never_download:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   819
        logger.warn('The --never-download option is for backward compatibility only.')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   820
        logger.warn('Setting it to false is no longer supported, and will be ignored.')
243
1f2840354865 correct filter on tag completion to avoid tags that are not translated
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   822
    create_environment(home_dir,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   823
                       site_packages=options.system_site_packages,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   824
                       clear=options.clear,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   825
                       unzip_setuptools=options.unzip_setuptools,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   826
                       prompt=options.prompt,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   827
                       search_dirs=options.search_dirs,
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   828
                       never_download=True,
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   829
                       no_setuptools=options.no_setuptools,
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   830
                       no_pip=options.no_pip,
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   831
                       no_wheel=options.no_wheel,
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   832
                       symlink=options.symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   833
    if 'after_install' in globals():
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   834
        after_install(options, home_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   835
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   836
def call_subprocess(cmd, show_stdout=True,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   837
                    filter_stdout=None, cwd=None,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   838
                    raise_on_returncode=True, extra_env=None,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   839
                    remove_from_env=None):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   840
    cmd_parts = []
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   841
    for part in cmd:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   842
        if len(part) > 45:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   843
            part = part[:20]+"..."+part[-20:]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   844
        if ' ' in part or '\n' in part or '"' in part or "'" in part:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   845
            part = '"%s"' % part.replace('"', '\\"')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   846
        if hasattr(part, 'decode'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   847
            try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   848
                part = part.decode(sys.getdefaultencoding())
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   849
            except UnicodeDecodeError:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   850
                part = part.decode(sys.getfilesystemencoding())
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   851
        cmd_parts.append(part)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   852
    cmd_desc = ' '.join(cmd_parts)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   853
    if show_stdout:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   854
        stdout = None
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   855
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   856
        stdout = subprocess.PIPE
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   857
    logger.debug("Running command %s" % cmd_desc)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   858
    if extra_env or remove_from_env:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   859
        env = os.environ.copy()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   860
        if extra_env:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   861
            env.update(extra_env)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   862
        if remove_from_env:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   863
            for varname in remove_from_env:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   864
                env.pop(varname, None)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   865
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   866
        env = None
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   867
    try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   868
        proc = subprocess.Popen(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   869
            cmd, stderr=subprocess.STDOUT, stdin=None, stdout=stdout,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   870
            cwd=cwd, env=env)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   871
    except Exception:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   872
        e = sys.exc_info()[1]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   873
        logger.fatal(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   874
            "Error %s while executing command %s" % (e, cmd_desc))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   875
        raise
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   876
    all_output = []
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   877
    if stdout is not None:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   878
        stdout = proc.stdout
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   879
        encoding = sys.getdefaultencoding()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   880
        fs_encoding = sys.getfilesystemencoding()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   881
        while 1:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   882
            line = stdout.readline()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   883
            try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   884
                line = line.decode(encoding)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   885
            except UnicodeDecodeError:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   886
                line = line.decode(fs_encoding)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   887
            if not line:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   888
                break
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   889
            line = line.rstrip()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   890
            all_output.append(line)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   891
            if filter_stdout:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   892
                level = filter_stdout(line)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   893
                if isinstance(level, tuple):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   894
                    level, line = level
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   895
                logger.log(level, line)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   896
                if not logger.stdout_level_matches(level):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   897
                    logger.show_progress()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   898
            else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   899
                logger.info(line)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   900
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   901
        proc.communicate()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   902
    proc.wait()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   903
    if proc.returncode:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   904
        if raise_on_returncode:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   905
            if all_output:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   906
                logger.notify('Complete output from command %s:' % cmd_desc)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   907
                logger.notify('\n'.join(all_output) + '\n----------------------------------------')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   908
            raise OSError(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   909
                "Command %s failed with error code %s"
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   910
                % (cmd_desc, proc.returncode))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   911
        else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   912
            logger.warn(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   913
                "Command %s had error code %s"
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   914
                % (cmd_desc, proc.returncode))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   915
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   916
def filter_install_output(line):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   917
    if line.strip().startswith('running'):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   918
        return Logger.INFO
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   919
    return Logger.DEBUG
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   920
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   921
def find_wheels(projects, search_dirs):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   922
    """Find wheels from which we can import PROJECTS.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   923
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   924
    Scan through SEARCH_DIRS for a wheel for each PROJECT in turn. Return
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   925
    a list of the first wheel found for each PROJECT
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   926
    """
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   927
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   928
    wheels = []
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   929
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   930
    # Look through SEARCH_DIRS for the first suitable wheel. Don't bother
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   931
    # about version checking here, as this is simply to get something we can
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   932
    # then use to install the correct version.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   933
    for project in projects:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   934
        for dirname in search_dirs:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   935
            # This relies on only having "universal" wheels available.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   936
            # The pattern could be tightened to require -py2.py3-none-any.whl.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   937
            files = glob.glob(os.path.join(dirname, project + '-*.whl'))
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   938
            if files:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   939
                wheels.append(os.path.abspath(files[0]))
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   940
                break
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   941
        else:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   942
            # We're out of luck, so quit with a suitable error
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   943
            logger.fatal('Cannot find a wheel for %s' % (project,))
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   944
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   945
    return wheels
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   946
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   947
def install_wheel(project_names, py_executable, search_dirs=None):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   948
    if search_dirs is None:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   949
        search_dirs = file_search_dirs()
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   950
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   951
    wheels = find_wheels(['setuptools', 'pip'], search_dirs)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   952
    pythonpath = os.pathsep.join(wheels)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   953
    findlinks = ' '.join(search_dirs)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   954
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   955
    cmd = [
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   956
        py_executable, '-c',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   957
        'import sys, pip; sys.exit(pip.main(["install", "--ignore-installed"] + sys.argv[1:]))',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   958
    ] + project_names
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   959
    logger.start_progress('Installing %s...' % (', '.join(project_names)))
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   960
    logger.indent += 2
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   961
    try:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   962
        call_subprocess(cmd, show_stdout=False,
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   963
            extra_env = {
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   964
                'PYTHONPATH': pythonpath,
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   965
                'JYTHONPATH': pythonpath,  # for Jython < 3.x
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   966
                'PIP_FIND_LINKS': findlinks,
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   967
                'PIP_USE_WHEEL': '1',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   968
                'PIP_PRE': '1',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   969
                'PIP_NO_INDEX': '1'
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   970
            }
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   971
        )
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   972
    finally:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   973
        logger.indent -= 2
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   974
        logger.end_progress()
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   975
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   976
def create_environment(home_dir, site_packages=False, clear=False,
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   977
                       unzip_setuptools=False,
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   978
                       prompt=None, search_dirs=None, never_download=False,
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   979
                       no_setuptools=False, no_pip=False, no_wheel=False,
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
   980
                       symlink=True):
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   981
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   982
    Creates a new environment in ``home_dir``.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   983
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   984
    If ``site_packages`` is true, then the global ``site-packages/``
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   985
    directory will be on the path.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   986
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   987
    If ``clear`` is true (default False) then the environment will
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   988
    first be cleared.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   989
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   990
    home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   991
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   992
    py_executable = os.path.abspath(install_python(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   993
        home_dir, lib_dir, inc_dir, bin_dir,
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   994
        site_packages=site_packages, clear=clear, symlink=symlink))
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   995
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   996
    install_distutils(home_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
   997
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   998
    if not no_setuptools:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
   999
        to_install = ['setuptools']
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1000
        if not no_pip:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1001
            to_install.append('pip')
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1002
        if not no_wheel:
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1003
            to_install.append('wheel')
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1004
        install_wheel(to_install, py_executable, search_dirs)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1005
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1006
    install_activate(home_dir, bin_dir, prompt)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1007
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1008
def is_executable_file(fpath):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1009
    return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1010
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1011
def path_locations(home_dir):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1012
    """Return the path locations for the environment (where libraries are,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1013
    where scripts go, etc)"""
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1014
    # XXX: We'd use distutils.sysconfig.get_python_inc/lib but its
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1015
    # prefix arg is broken: http://bugs.python.org/issue3386
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1016
    if is_win:
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1017
        # Windows has lots of problems with executables with spaces in
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1018
        # the name; this function will remove them (using the ~1
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1019
        # format):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1020
        mkdir(home_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1021
        if ' ' in home_dir:
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1022
            import ctypes
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1023
            GetShortPathName = ctypes.windll.kernel32.GetShortPathNameW
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1024
            size = max(len(home_dir)+1, 256)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1025
            buf = ctypes.create_unicode_buffer(size)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1026
            try:
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1027
                u = unicode
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1028
            except NameError:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1029
                u = str
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1030
            ret = GetShortPathName(u(home_dir), buf, size)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1031
            if not ret:
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1032
                print('Error: the path "%s" has a space in it' % home_dir)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1033
                print('We could not determine the short pathname for it.')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1034
                print('Exiting.')
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1035
                sys.exit(3)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1036
            home_dir = str(buf.value)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1037
        lib_dir = join(home_dir, 'Lib')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1038
        inc_dir = join(home_dir, 'Include')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1039
        bin_dir = join(home_dir, 'Scripts')
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1040
    if is_jython:
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1041
        lib_dir = join(home_dir, 'Lib')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1042
        inc_dir = join(home_dir, 'Include')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1043
        bin_dir = join(home_dir, 'bin')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1044
    elif is_pypy:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1045
        lib_dir = home_dir
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1046
        inc_dir = join(home_dir, 'include')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1047
        bin_dir = join(home_dir, 'bin')
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1048
    elif not is_win:
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1049
        lib_dir = join(home_dir, 'lib', py_version)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1050
        multiarch_exec = '/usr/bin/multiarch-platform'
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1051
        if is_executable_file(multiarch_exec):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1052
            # In Mageia (2) and Mandriva distros the include dir must be like:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1053
            # virtualenv/include/multiarch-x86_64-linux/python2.7
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1054
            # instead of being virtualenv/include/python2.7
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1055
            p = subprocess.Popen(multiarch_exec, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1056
            stdout, stderr = p.communicate()
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1057
            # stdout.strip is needed to remove newline character
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1058
            inc_dir = join(home_dir, 'include', stdout.strip(), py_version + abiflags)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1059
        else:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1060
            inc_dir = join(home_dir, 'include', py_version + abiflags)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1061
        bin_dir = join(home_dir, 'bin')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1062
    return home_dir, lib_dir, inc_dir, bin_dir
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1063
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1064
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1065
def change_prefix(filename, dst_prefix):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1066
    prefixes = [sys.prefix]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1067
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1068
    if is_darwin:
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1069
        prefixes.extend((
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1070
            os.path.join("/Library/Python", sys.version[:3], "site-packages"),
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1071
            os.path.join(sys.prefix, "Extras", "lib", "python"),
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1072
            os.path.join("~", "Library", "Python", sys.version[:3], "site-packages"),
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1073
            # Python 2.6 no-frameworks
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1074
            os.path.join("~", ".local", "lib","python", sys.version[:3], "site-packages"),
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1075
            # System Python 2.7 on OSX Mountain Lion
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1076
            os.path.join("~", "Library", "Python", sys.version[:3], "lib", "python", "site-packages")))
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1077
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1078
    if hasattr(sys, 'real_prefix'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1079
        prefixes.append(sys.real_prefix)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1080
    if hasattr(sys, 'base_prefix'):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1081
        prefixes.append(sys.base_prefix)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1082
    prefixes = list(map(os.path.expanduser, prefixes))
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1083
    prefixes = list(map(os.path.abspath, prefixes))
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1084
    # Check longer prefixes first so we don't split in the middle of a filename
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1085
    prefixes = sorted(prefixes, key=len, reverse=True)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1086
    filename = os.path.abspath(filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1087
    for src_prefix in prefixes:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1088
        if filename.startswith(src_prefix):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1089
            _, relpath = filename.split(src_prefix, 1)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1090
            if src_prefix != os.sep: # sys.prefix == "/"
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1091
                assert relpath[0] == os.sep
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1092
                relpath = relpath[1:]
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1093
            return join(dst_prefix, relpath)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1094
    assert False, "Filename %s does not start with any of these prefixes: %s" % \
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1095
        (filename, prefixes)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1096
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1097
def copy_required_modules(dst_prefix, symlink):
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1098
    import imp
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1099
    # If we are running under -p, we need to remove the current
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1100
    # directory from sys.path temporarily here, so that we
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1101
    # definitely get the modules from the site directory of
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1102
    # the interpreter we are running under, not the one
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1103
    # virtualenv.py is installed under (which might lead to py2/py3
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1104
    # incompatibility issues)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1105
    _prev_sys_path = sys.path
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1106
    if os.environ.get('VIRTUALENV_INTERPRETER_RUNNING'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1107
        sys.path = sys.path[1:]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1108
    try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1109
        for modname in REQUIRED_MODULES:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1110
            if modname in sys.builtin_module_names:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1111
                logger.info("Ignoring built-in bootstrap module: %s" % modname)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1112
                continue
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1113
            try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1114
                f, filename, _ = imp.find_module(modname)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1115
            except ImportError:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1116
                logger.info("Cannot import bootstrap module: %s" % modname)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1117
            else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1118
                if f is not None:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1119
                    f.close()
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1120
                # special-case custom readline.so on OS X, but not for pypy:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1121
                if modname == 'readline' and sys.platform == 'darwin' and not (
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1122
                        is_pypy or filename.endswith(join('lib-dynload', 'readline.so'))):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1123
                    dst_filename = join(dst_prefix, 'lib', 'python%s' % sys.version[:3], 'readline.so')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1124
                elif modname == 'readline' and sys.platform == 'win32':
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1125
                    # special-case for Windows, where readline is not a
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1126
                    # standard module, though it may have been installed in
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1127
                    # site-packages by a third-party package
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1128
                    pass
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1129
                else:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1130
                    dst_filename = change_prefix(filename, dst_prefix)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1131
                copyfile(filename, dst_filename, symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1132
                if filename.endswith('.pyc'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1133
                    pyfile = filename[:-1]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1134
                    if os.path.exists(pyfile):
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1135
                        copyfile(pyfile, dst_filename[:-1], symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1136
    finally:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1137
        sys.path = _prev_sys_path
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1138
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1139
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1140
def subst_path(prefix_path, prefix, home_dir):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1141
    prefix_path = os.path.normpath(prefix_path)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1142
    prefix = os.path.normpath(prefix)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1143
    home_dir = os.path.normpath(home_dir)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1144
    if not prefix_path.startswith(prefix):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1145
        logger.warn('Path not in prefix %r %r', prefix_path, prefix)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1146
        return
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1147
    return prefix_path.replace(prefix, home_dir, 1)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1148
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1149
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1150
def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear, symlink=True):
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1151
    """Install just the base environment, no distutils patches etc"""
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1152
    if sys.executable.startswith(bin_dir):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1153
        print('Please use the *system* python to run this script')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1154
        return
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1155
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1156
    if clear:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1157
        rmtree(lib_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1158
        ## FIXME: why not delete it?
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1159
        ## Maybe it should delete everything with #!/path/to/venv/python in it
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1160
        logger.notify('Not deleting %s', bin_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1161
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1162
    if hasattr(sys, 'real_prefix'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1163
        logger.notify('Using real prefix %r' % sys.real_prefix)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1164
        prefix = sys.real_prefix
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1165
    elif hasattr(sys, 'base_prefix'):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1166
        logger.notify('Using base prefix %r' % sys.base_prefix)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1167
        prefix = sys.base_prefix
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1168
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1169
        prefix = sys.prefix
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1170
    mkdir(lib_dir)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1171
    fix_lib64(lib_dir, symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1172
    stdlib_dirs = [os.path.dirname(os.__file__)]
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1173
    if is_win:
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1174
        stdlib_dirs.append(join(os.path.dirname(stdlib_dirs[0]), 'DLLs'))
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1175
    elif is_darwin:
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1176
        stdlib_dirs.append(join(stdlib_dirs[0], 'site-packages'))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1177
    if hasattr(os, 'symlink'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1178
        logger.info('Symlinking Python bootstrap modules')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1179
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1180
        logger.info('Copying Python bootstrap modules')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1181
    logger.indent += 2
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1182
    try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1183
        # copy required files...
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1184
        for stdlib_dir in stdlib_dirs:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1185
            if not os.path.isdir(stdlib_dir):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1186
                continue
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1187
            for fn in os.listdir(stdlib_dir):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1188
                bn = os.path.splitext(fn)[0]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1189
                if fn != 'site-packages' and bn in REQUIRED_FILES:
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1190
                    copyfile(join(stdlib_dir, fn), join(lib_dir, fn), symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1191
        # ...and modules
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1192
        copy_required_modules(home_dir, symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1193
    finally:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1194
        logger.indent -= 2
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1195
    mkdir(join(lib_dir, 'site-packages'))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1196
    import site
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1197
    site_filename = site.__file__
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1198
    if site_filename.endswith('.pyc'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1199
        site_filename = site_filename[:-1]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1200
    elif site_filename.endswith('$py.class'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1201
        site_filename = site_filename.replace('$py.class', '.py')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1202
    site_filename_dst = change_prefix(site_filename, home_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1203
    site_dir = os.path.dirname(site_filename_dst)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1204
    writefile(site_filename_dst, SITE_PY)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1205
    writefile(join(site_dir, 'orig-prefix.txt'), prefix)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1206
    site_packages_filename = join(site_dir, 'no-global-site-packages.txt')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1207
    if not site_packages:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1208
        writefile(site_packages_filename, '')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1209
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1210
    if is_pypy or is_win:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1211
        stdinc_dir = join(prefix, 'include')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1212
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1213
        stdinc_dir = join(prefix, 'include', py_version + abiflags)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1214
    if os.path.exists(stdinc_dir):
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1215
        copyfile(stdinc_dir, inc_dir, symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1216
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1217
        logger.debug('No include dir %s' % stdinc_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1218
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1219
    platinc_dir = distutils.sysconfig.get_python_inc(plat_specific=1)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1220
    if platinc_dir != stdinc_dir:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1221
        platinc_dest = distutils.sysconfig.get_python_inc(
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1222
            plat_specific=1, prefix=home_dir)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1223
        if platinc_dir == platinc_dest:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1224
            # Do platinc_dest manually due to a CPython bug;
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1225
            # not http://bugs.python.org/issue3386 but a close cousin
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1226
            platinc_dest = subst_path(platinc_dir, prefix, home_dir)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1227
        if platinc_dest:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1228
            # PyPy's stdinc_dir and prefix are relative to the original binary
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1229
            # (traversing virtualenvs), whereas the platinc_dir is relative to
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1230
            # the inner virtualenv and ignores the prefix argument.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1231
            # This seems more evolved than designed.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1232
            copyfile(platinc_dir, platinc_dest, symlink)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1233
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1234
    # pypy never uses exec_prefix, just ignore it
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1235
    if sys.exec_prefix != prefix and not is_pypy:
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1236
        if is_win:
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1237
            exec_dir = join(sys.exec_prefix, 'lib')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1238
        elif is_jython:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1239
            exec_dir = join(sys.exec_prefix, 'Lib')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1240
        else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1241
            exec_dir = join(sys.exec_prefix, 'lib', py_version)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1242
        for fn in os.listdir(exec_dir):
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1243
            copyfile(join(exec_dir, fn), join(lib_dir, fn), symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1244
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1245
    if is_jython:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1246
        # Jython has either jython-dev.jar and javalib/ dir, or just
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1247
        # jython.jar
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1248
        for name in 'jython-dev.jar', 'javalib', 'jython.jar':
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1249
            src = join(prefix, name)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1250
            if os.path.exists(src):
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1251
                copyfile(src, join(home_dir, name), symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1252
        # XXX: registry should always exist after Jython 2.5rc1
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1253
        src = join(prefix, 'registry')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1254
        if os.path.exists(src):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1255
            copyfile(src, join(home_dir, 'registry'), symlink=False)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1256
        copyfile(join(prefix, 'cachedir'), join(home_dir, 'cachedir'),
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1257
                 symlink=False)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1258
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1259
    mkdir(bin_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1260
    py_executable = join(bin_dir, os.path.basename(sys.executable))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1261
    if 'Python.framework' in prefix:
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1262
        # OS X framework builds cause validation to break
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1263
        # https://github.com/pypa/virtualenv/issues/322
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1264
        if os.environ.get('__PYVENV_LAUNCHER__'):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1265
            del os.environ["__PYVENV_LAUNCHER__"]
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1266
        if re.search(r'/Python(?:-32|-64)*$', py_executable):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1267
            # The name of the python executable is not quite what
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1268
            # we want, rename it.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1269
            py_executable = os.path.join(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1270
                    os.path.dirname(py_executable), 'python')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1271
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1272
    logger.notify('New %s executable in %s', expected_exe, py_executable)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1273
    pcbuild_dir = os.path.dirname(sys.executable)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1274
    pyd_pth = os.path.join(lib_dir, 'site-packages', 'virtualenv_builddir_pyd.pth')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1275
    if is_win and os.path.exists(os.path.join(pcbuild_dir, 'build.bat')):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1276
        logger.notify('Detected python running from build directory %s', pcbuild_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1277
        logger.notify('Writing .pth file linking to build directory for *.pyd files')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1278
        writefile(pyd_pth, pcbuild_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1279
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1280
        pcbuild_dir = None
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1281
        if os.path.exists(pyd_pth):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1282
            logger.info('Deleting %s (not Windows env or not build directory python)' % pyd_pth)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1283
            os.unlink(pyd_pth)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1284
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1285
    if sys.executable != py_executable:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1286
        ## FIXME: could I just hard link?
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1287
        executable = sys.executable
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1288
        shutil.copyfile(executable, py_executable)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1289
        make_exe(py_executable)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1290
        if is_win or is_cygwin:
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1291
            pythonw = os.path.join(os.path.dirname(sys.executable), 'pythonw.exe')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1292
            if os.path.exists(pythonw):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1293
                logger.info('Also created pythonw.exe')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1294
                shutil.copyfile(pythonw, os.path.join(os.path.dirname(py_executable), 'pythonw.exe'))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1295
            python_d = os.path.join(os.path.dirname(sys.executable), 'python_d.exe')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1296
            python_d_dest = os.path.join(os.path.dirname(py_executable), 'python_d.exe')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1297
            if os.path.exists(python_d):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1298
                logger.info('Also created python_d.exe')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1299
                shutil.copyfile(python_d, python_d_dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1300
            elif os.path.exists(python_d_dest):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1301
                logger.info('Removed python_d.exe as it is no longer at the source')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1302
                os.unlink(python_d_dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1303
            # we need to copy the DLL to enforce that windows will load the correct one.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1304
            # may not exist if we are cygwin.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1305
            py_executable_dll = 'python%s%s.dll' % (
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1306
                sys.version_info[0], sys.version_info[1])
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1307
            py_executable_dll_d = 'python%s%s_d.dll' % (
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1308
                sys.version_info[0], sys.version_info[1])
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1309
            pythondll = os.path.join(os.path.dirname(sys.executable), py_executable_dll)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1310
            pythondll_d = os.path.join(os.path.dirname(sys.executable), py_executable_dll_d)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1311
            pythondll_d_dest = os.path.join(os.path.dirname(py_executable), py_executable_dll_d)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1312
            if os.path.exists(pythondll):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1313
                logger.info('Also created %s' % py_executable_dll)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1314
                shutil.copyfile(pythondll, os.path.join(os.path.dirname(py_executable), py_executable_dll))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1315
            if os.path.exists(pythondll_d):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1316
                logger.info('Also created %s' % py_executable_dll_d)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1317
                shutil.copyfile(pythondll_d, pythondll_d_dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1318
            elif os.path.exists(pythondll_d_dest):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1319
                logger.info('Removed %s as the source does not exist' % pythondll_d_dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1320
                os.unlink(pythondll_d_dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1321
        if is_pypy:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1322
            # make a symlink python --> pypy-c
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1323
            python_executable = os.path.join(os.path.dirname(py_executable), 'python')
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1324
            if sys.platform in ('win32', 'cygwin'):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1325
                python_executable += '.exe'
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1326
            logger.info('Also created executable %s' % python_executable)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1327
            copyfile(py_executable, python_executable, symlink)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1328
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1329
            if is_win:
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1330
                for name in ['libexpat.dll', 'libpypy.dll', 'libpypy-c.dll',
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1331
                            'libeay32.dll', 'ssleay32.dll', 'sqlite3.dll',
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1332
                            'tcl85.dll', 'tk85.dll']:
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1333
                    src = join(prefix, name)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1334
                    if os.path.exists(src):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1335
                        copyfile(src, join(bin_dir, name), symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1336
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1337
                for d in sys.path:
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1338
                    if d.endswith('lib_pypy'):
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1339
                        break
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1340
                else:
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1341
                    logger.fatal('Could not find lib_pypy in sys.path')
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1342
                    raise SystemExit(3)
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1343
                logger.info('Copying lib_pypy')
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1344
                copyfile(d, os.path.join(home_dir, 'lib_pypy'), symlink)
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1345
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1346
    if os.path.splitext(os.path.basename(py_executable))[0] != expected_exe:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1347
        secondary_exe = os.path.join(os.path.dirname(py_executable),
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1348
                                     expected_exe)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1349
        py_executable_ext = os.path.splitext(py_executable)[1]
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1350
        if py_executable_ext.lower() == '.exe':
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1351
            # python2.4 gives an extension of '.4' :P
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1352
            secondary_exe += py_executable_ext
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1353
        if os.path.exists(secondary_exe):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1354
            logger.warn('Not overwriting existing %s script %s (you must use %s)'
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1355
                        % (expected_exe, secondary_exe, py_executable))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1356
        else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1357
            logger.notify('Also creating executable in %s' % secondary_exe)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1358
            shutil.copyfile(sys.executable, secondary_exe)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1359
            make_exe(secondary_exe)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1360
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1361
    if '.framework' in prefix:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1362
        if 'Python.framework' in prefix:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1363
            logger.debug('MacOSX Python framework detected')
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1364
            # Make sure we use the embedded interpreter inside
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1365
            # the framework, even if sys.executable points to
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1366
            # the stub executable in ${sys.prefix}/bin
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1367
            # See http://groups.google.com/group/python-virtualenv/
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1368
            #                              browse_thread/thread/17cab2f85da75951
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1369
            original_python = os.path.join(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1370
                prefix, 'Resources/Python.app/Contents/MacOS/Python')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1371
        if 'EPD' in prefix:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1372
            logger.debug('EPD framework detected')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1373
            original_python = os.path.join(prefix, 'bin/python')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1374
        shutil.copy(original_python, py_executable)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1375
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1376
        # Copy the framework's dylib into the virtual
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1377
        # environment
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1378
        virtual_lib = os.path.join(home_dir, '.Python')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1379
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1380
        if os.path.exists(virtual_lib):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1381
            os.unlink(virtual_lib)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1382
        copyfile(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1383
            os.path.join(prefix, 'Python'),
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1384
            virtual_lib,
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1385
            symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1386
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1387
        # And then change the install_name of the copied python executable
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1388
        try:
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1389
            mach_o_change(py_executable,
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1390
                          os.path.join(prefix, 'Python'),
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1391
                          '@executable_path/../.Python')
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1392
        except:
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1393
            e = sys.exc_info()[1]
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1394
            logger.warn("Could not call mach_o_change: %s. "
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1395
                        "Trying to call install_name_tool instead." % e)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1396
            try:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1397
                call_subprocess(
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1398
                    ["install_name_tool", "-change",
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1399
                     os.path.join(prefix, 'Python'),
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1400
                     '@executable_path/../.Python',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1401
                     py_executable])
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1402
            except:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1403
                logger.fatal("Could not call install_name_tool -- you must "
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1404
                             "have Apple's development tools installed")
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1405
                raise
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1406
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1407
    if not is_win:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1408
        # Ensure that 'python', 'pythonX' and 'pythonX.Y' all exist
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1409
        py_exe_version_major = 'python%s' % sys.version_info[0]
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1410
        py_exe_version_major_minor = 'python%s.%s' % (
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1411
            sys.version_info[0], sys.version_info[1])
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1412
        py_exe_no_version = 'python'
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1413
        required_symlinks = [ py_exe_no_version, py_exe_version_major,
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1414
                         py_exe_version_major_minor ]
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1415
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1416
        py_executable_base = os.path.basename(py_executable)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1417
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1418
        if py_executable_base in required_symlinks:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1419
            # Don't try to symlink to yourself.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1420
            required_symlinks.remove(py_executable_base)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1421
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1422
        for pth in required_symlinks:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1423
            full_pth = join(bin_dir, pth)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1424
            if os.path.exists(full_pth):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1425
                os.unlink(full_pth)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1426
            if symlink:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1427
                os.symlink(py_executable_base, full_pth)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1428
            else:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1429
                copyfile(py_executable, full_pth, symlink)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1430
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1431
    if is_win and ' ' in py_executable:
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1432
        # There's a bug with subprocess on Windows when using a first
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1433
        # argument that has a space in it.  Instead we have to quote
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1434
        # the value:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1435
        py_executable = '"%s"' % py_executable
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1436
    # NOTE: keep this check as one line, cmd.exe doesn't cope with line breaks
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1437
    cmd = [py_executable, '-c', 'import sys;out=sys.stdout;'
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1438
        'getattr(out, "buffer", out).write(sys.prefix.encode("utf-8"))']
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1439
    logger.info('Testing executable with %s %s "%s"' % tuple(cmd))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1440
    try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1441
        proc = subprocess.Popen(cmd,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1442
                            stdout=subprocess.PIPE)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1443
        proc_stdout, proc_stderr = proc.communicate()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1444
    except OSError:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1445
        e = sys.exc_info()[1]
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1446
        if e.errno == errno.EACCES:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1447
            logger.fatal('ERROR: The executable %s could not be run: %s' % (py_executable, e))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1448
            sys.exit(100)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1449
        else:
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1450
            raise e
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1451
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1452
    proc_stdout = proc_stdout.strip().decode("utf-8")
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1453
    proc_stdout = os.path.normcase(os.path.abspath(proc_stdout))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1454
    norm_home_dir = os.path.normcase(os.path.abspath(home_dir))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1455
    if hasattr(norm_home_dir, 'decode'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1456
        norm_home_dir = norm_home_dir.decode(sys.getfilesystemencoding())
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1457
    if proc_stdout != norm_home_dir:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1458
        logger.fatal(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1459
            'ERROR: The executable %s is not functioning' % py_executable)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1460
        logger.fatal(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1461
            'ERROR: It thinks sys.prefix is %r (should be %r)'
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1462
            % (proc_stdout, norm_home_dir))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1463
        logger.fatal(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1464
            'ERROR: virtualenv is not compatible with this system or executable')
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1465
        if is_win:
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1466
            logger.fatal(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1467
                'Note: some Windows users have reported this error when they '
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1468
                'installed Python for "Only this user" or have multiple '
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1469
                'versions of Python installed. Copying the appropriate '
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1470
                'PythonXX.dll to the virtualenv Scripts/ directory may fix '
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1471
                'this problem.')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1472
        sys.exit(100)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1473
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1474
        logger.info('Got sys.prefix result: %r' % proc_stdout)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1475
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1476
    pydistutils = os.path.expanduser('~/.pydistutils.cfg')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1477
    if os.path.exists(pydistutils):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1478
        logger.notify('Please make sure you remove any previous custom paths from '
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1479
                      'your %s file.' % pydistutils)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1480
    ## FIXME: really this should be calculated earlier
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1481
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1482
    fix_local_scheme(home_dir, symlink)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1483
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1484
    if site_packages:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1485
        if os.path.exists(site_packages_filename):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1486
            logger.info('Deleting %s' % site_packages_filename)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1487
            os.unlink(site_packages_filename)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1488
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1489
    return py_executable
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1490
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1491
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1492
def install_activate(home_dir, bin_dir, prompt=None):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1493
    home_dir = os.path.abspath(home_dir)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1494
    if is_win or is_jython and os._name == 'nt':
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1495
        files = {
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1496
            'activate.bat': ACTIVATE_BAT,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1497
            'deactivate.bat': DEACTIVATE_BAT,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1498
            'activate.ps1': ACTIVATE_PS,
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1499
        }
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1500
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1501
        # MSYS needs paths of the form /c/path/to/file
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1502
        drive, tail = os.path.splitdrive(home_dir.replace(os.sep, '/'))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1503
        home_dir_msys = (drive and "/%s%s" or "%s%s") % (drive[:1], tail)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1504
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1505
        # Run-time conditional enables (basic) Cygwin compatibility
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1506
        home_dir_sh = ("""$(if [ "$OSTYPE" "==" "cygwin" ]; then cygpath -u '%s'; else echo '%s'; fi;)""" %
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1507
                       (home_dir, home_dir_msys))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1508
        files['activate'] = ACTIVATE_SH.replace('__VIRTUAL_ENV__', home_dir_sh)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1509
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1510
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1511
        files = {'activate': ACTIVATE_SH}
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1512
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1513
        # suppling activate.fish in addition to, not instead of, the
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1514
        # bash script support.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1515
        files['activate.fish'] = ACTIVATE_FISH
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1516
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1517
        # same for csh/tcsh support...
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1518
        files['activate.csh'] = ACTIVATE_CSH
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1519
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1520
    files['activate_this.py'] = ACTIVATE_THIS
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1521
    if hasattr(home_dir, 'decode'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1522
        home_dir = home_dir.decode(sys.getfilesystemencoding())
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1523
    vname = os.path.basename(home_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1524
    for name, content in files.items():
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1525
        content = content.replace('__VIRTUAL_PROMPT__', prompt or '')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1526
        content = content.replace('__VIRTUAL_WINPROMPT__', prompt or '(%s)' % vname)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1527
        content = content.replace('__VIRTUAL_ENV__', home_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1528
        content = content.replace('__VIRTUAL_NAME__', vname)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1529
        content = content.replace('__BIN_NAME__', os.path.basename(bin_dir))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1530
        writefile(os.path.join(bin_dir, name), content)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1531
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1532
def install_distutils(home_dir):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1533
    distutils_path = change_prefix(distutils.__path__[0], home_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1534
    mkdir(distutils_path)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1535
    ## FIXME: maybe this prefix setting should only be put in place if
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1536
    ## there's a local distutils.cfg with a prefix setting?
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1537
    home_dir = os.path.abspath(home_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1538
    ## FIXME: this is breaking things, removing for now:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1539
    #distutils_cfg = DISTUTILS_CFG + "\n[install]\nprefix=%s\n" % home_dir
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1540
    writefile(os.path.join(distutils_path, '__init__.py'), DISTUTILS_INIT)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1541
    writefile(os.path.join(distutils_path, 'distutils.cfg'), DISTUTILS_CFG, overwrite=False)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1542
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1543
def fix_local_scheme(home_dir, symlink=True):
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1544
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1545
    Platforms that use the "posix_local" install scheme (like Ubuntu with
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1546
    Python 2.7) need to be given an additional "local" location, sigh.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1547
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1548
    try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1549
        import sysconfig
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1550
    except ImportError:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1551
        pass
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1552
    else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1553
        if sysconfig._get_default_scheme() == 'posix_local':
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1554
            local_path = os.path.join(home_dir, 'local')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1555
            if not os.path.exists(local_path):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1556
                os.mkdir(local_path)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1557
                for subdir_name in os.listdir(home_dir):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1558
                    if subdir_name == 'local':
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1559
                        continue
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1560
                    copyfile(os.path.abspath(os.path.join(home_dir, subdir_name)), \
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1561
                                                            os.path.join(local_path, subdir_name), symlink)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1562
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1563
def fix_lib64(lib_dir, symlink=True):
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1564
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1565
    Some platforms (particularly Gentoo on x64) put things in lib64/pythonX.Y
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1566
    instead of lib/pythonX.Y.  If this is such a platform we'll just create a
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1567
    symlink so lib64 points to lib
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1568
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1569
    if [p for p in distutils.sysconfig.get_config_vars().values()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1570
        if isinstance(p, basestring) and 'lib64' in p]:
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1571
        # PyPy's library path scheme is not affected by this.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1572
        # Return early or we will die on the following assert.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1573
        if is_pypy:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1574
            logger.debug('PyPy detected, skipping lib64 symlinking')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1575
            return
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1576
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1577
        logger.debug('This system uses lib64; symlinking lib64 to lib')
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1578
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1579
        assert os.path.basename(lib_dir) == 'python%s' % sys.version[:3], (
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1580
            "Unexpected python lib dir: %r" % lib_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1581
        lib_parent = os.path.dirname(lib_dir)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1582
        top_level = os.path.dirname(lib_parent)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1583
        lib_dir = os.path.join(top_level, 'lib')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1584
        lib64_link = os.path.join(top_level, 'lib64')
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1585
        assert os.path.basename(lib_parent) == 'lib', (
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1586
            "Unexpected parent dir: %r" % lib_parent)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1587
        if os.path.lexists(lib64_link):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1588
            return
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1589
        if symlink:
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1590
            os.symlink('lib', lib64_link)
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1591
        else:
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1592
            copyfile('lib', lib64_link)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1593
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1594
def resolve_interpreter(exe):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1595
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1596
    If the executable given isn't an absolute path, search $PATH for the interpreter
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1597
    """
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1598
    # If the "executable" is a version number, get the installed executable for
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1599
    # that version
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1600
    python_versions = get_installed_pythons()
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1601
    if exe in python_versions:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1602
        exe = python_versions[exe]
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1603
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1604
    if os.path.abspath(exe) != exe:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1605
        paths = os.environ.get('PATH', '').split(os.pathsep)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1606
        for path in paths:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1607
            if os.path.exists(os.path.join(path, exe)):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1608
                exe = os.path.join(path, exe)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1609
                break
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1610
    if not os.path.exists(exe):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1611
        logger.fatal('The executable %s (from --python=%s) does not exist' % (exe, exe))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1612
        raise SystemExit(3)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1613
    if not is_executable(exe):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1614
        logger.fatal('The executable %s (from --python=%s) is not executable' % (exe, exe))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1615
        raise SystemExit(3)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1616
    return exe
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1617
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1618
def is_executable(exe):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1619
    """Checks a file is executable"""
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1620
    return os.access(exe, os.X_OK)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1621
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1622
############################################################
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1623
## Relocating the environment:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1624
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1625
def make_environment_relocatable(home_dir):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1626
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1627
    Makes the already-existing environment use relative paths, and takes out
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1628
    the #!-based environment selection in scripts.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1629
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1630
    home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1631
    activate_this = os.path.join(bin_dir, 'activate_this.py')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1632
    if not os.path.exists(activate_this):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1633
        logger.fatal(
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1634
            'The environment doesn\'t have a file %s -- please re-run virtualenv '
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1635
            'on this environment to update it' % activate_this)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1636
    fixup_scripts(home_dir, bin_dir)
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1637
    fixup_pth_and_egg_link(home_dir)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1638
    ## FIXME: need to fix up distutils.cfg
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1639
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1640
OK_ABS_SCRIPTS = ['python', 'python%s' % sys.version[:3],
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1641
                  'activate', 'activate.bat', 'activate_this.py',
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1642
                  'activate.fish', 'activate.csh']
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1643
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1644
def fixup_scripts(home_dir, bin_dir):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1645
    if is_win:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1646
        new_shebang_args = (
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1647
            '%s /c' % os.path.normcase(os.environ.get('COMSPEC', 'cmd.exe')),
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1648
            '', '.exe')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1649
    else:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1650
        new_shebang_args = ('/usr/bin/env', sys.version[:3], '')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1651
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1652
    # This is what we expect at the top of scripts:
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1653
    shebang = '#!%s' % os.path.normcase(os.path.join(
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1654
        os.path.abspath(bin_dir), 'python%s' % new_shebang_args[2]))
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1655
    # This is what we'll put:
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1656
    new_shebang = '#!%s python%s%s' % new_shebang_args
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1657
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1658
    for filename in os.listdir(bin_dir):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1659
        filename = os.path.join(bin_dir, filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1660
        if not os.path.isfile(filename):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1661
            # ignore subdirs, e.g. .svn ones.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1662
            continue
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1663
        f = open(filename, 'rb')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1664
        try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1665
            try:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1666
                lines = f.read().decode('utf-8').splitlines()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1667
            except UnicodeDecodeError:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1668
                # This is probably a binary program instead
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1669
                # of a script, so just ignore it.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1670
                continue
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1671
        finally:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1672
            f.close()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1673
        if not lines:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1674
            logger.warn('Script %s is an empty file' % filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1675
            continue
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1676
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1677
        old_shebang = lines[0].strip()
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1678
        old_shebang = old_shebang[0:2] + os.path.normcase(old_shebang[2:])
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1679
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1680
        if not old_shebang.startswith(shebang):
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1681
            if os.path.basename(filename) in OK_ABS_SCRIPTS:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1682
                logger.debug('Cannot make script %s relative' % filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1683
            elif lines[0].strip() == new_shebang:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1684
                logger.info('Script %s has already been made relative' % filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1685
            else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1686
                logger.warn('Script %s cannot be made relative (it\'s not a normal script that starts with %s)'
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1687
                            % (filename, shebang))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1688
            continue
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1689
        logger.notify('Making script %s relative' % filename)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1690
        script = relative_script([new_shebang] + lines[1:])
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1691
        f = open(filename, 'wb')
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1692
        f.write('\n'.join(script).encode('utf-8'))
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1693
        f.close()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1694
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1695
def relative_script(lines):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1696
    "Return a script that'll work in a relocatable environment."
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1697
    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"
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1698
    # Find the last future statement in the script. If we insert the activation
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1699
    # line before a future statement, Python will raise a SyntaxError.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1700
    activate_at = None
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1701
    for idx, line in reversed(list(enumerate(lines))):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1702
        if line.split()[:3] == ['from', '__future__', 'import']:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1703
            activate_at = idx + 1
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1704
            break
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1705
    if activate_at is None:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1706
        # Activate after the shebang.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1707
        activate_at = 1
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1708
    return lines[:activate_at] + ['', activate, ''] + lines[activate_at:]
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1709
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1710
def fixup_pth_and_egg_link(home_dir, sys_path=None):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1711
    """Makes .pth and .egg-link files use relative paths"""
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1712
    home_dir = os.path.normcase(os.path.abspath(home_dir))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1713
    if sys_path is None:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1714
        sys_path = sys.path
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1715
    for path in sys_path:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1716
        if not path:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1717
            path = '.'
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1718
        if not os.path.isdir(path):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1719
            continue
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1720
        path = os.path.normcase(os.path.abspath(path))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1721
        if not path.startswith(home_dir):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1722
            logger.debug('Skipping system (non-environment) directory %s' % path)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1723
            continue
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1724
        for filename in os.listdir(path):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1725
            filename = os.path.join(path, filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1726
            if filename.endswith('.pth'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1727
                if not os.access(filename, os.W_OK):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1728
                    logger.warn('Cannot write .pth file %s, skipping' % filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1729
                else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1730
                    fixup_pth_file(filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1731
            if filename.endswith('.egg-link'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1732
                if not os.access(filename, os.W_OK):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1733
                    logger.warn('Cannot write .egg-link file %s, skipping' % filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1734
                else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1735
                    fixup_egg_link(filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1736
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1737
def fixup_pth_file(filename):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1738
    lines = []
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1739
    prev_lines = []
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1740
    f = open(filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1741
    prev_lines = f.readlines()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1742
    f.close()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1743
    for line in prev_lines:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1744
        line = line.strip()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1745
        if (not line or line.startswith('#') or line.startswith('import ')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1746
            or os.path.abspath(line) != line):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1747
            lines.append(line)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1748
        else:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1749
            new_value = make_relative_path(filename, line)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1750
            if line != new_value:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1751
                logger.debug('Rewriting path %s as %s (in %s)' % (line, new_value, filename))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1752
            lines.append(new_value)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1753
    if lines == prev_lines:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1754
        logger.info('No changes to .pth file %s' % filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1755
        return
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1756
    logger.notify('Making paths in .pth file %s relative' % filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1757
    f = open(filename, 'w')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1758
    f.write('\n'.join(lines) + '\n')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1759
    f.close()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1760
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1761
def fixup_egg_link(filename):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1762
    f = open(filename)
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1763
    link = f.readline().strip()
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1764
    f.close()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1765
    if os.path.abspath(link) != link:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1766
        logger.debug('Link in %s already relative' % filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1767
        return
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1768
    new_link = make_relative_path(filename, link)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1769
    logger.notify('Rewriting link %s in %s as %s' % (link, filename, new_link))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1770
    f = open(filename, 'w')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1771
    f.write(new_link)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1772
    f.close()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1773
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1774
def make_relative_path(source, dest, dest_is_directory=True):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1775
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1776
    Make a filename relative, where the filename is dest, and it is
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1777
    being referred to from the filename source.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1778
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1779
        >>> make_relative_path('/usr/share/something/a-file.pth',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1780
        ...                    '/usr/share/another-place/src/Directory')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1781
        '../another-place/src/Directory'
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1782
        >>> make_relative_path('/usr/share/something/a-file.pth',
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1783
        ...                    '/home/user/src/Directory')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1784
        '../../../home/user/src/Directory'
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1785
        >>> make_relative_path('/usr/share/a-file.pth', '/usr/share/')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1786
        './'
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1787
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1788
    source = os.path.dirname(source)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1789
    if not dest_is_directory:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1790
        dest_filename = os.path.basename(dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1791
        dest = os.path.dirname(dest)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1792
    dest = os.path.normpath(os.path.abspath(dest))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1793
    source = os.path.normpath(os.path.abspath(source))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1794
    dest_parts = dest.strip(os.path.sep).split(os.path.sep)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1795
    source_parts = source.strip(os.path.sep).split(os.path.sep)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1796
    while dest_parts and source_parts and dest_parts[0] == source_parts[0]:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1797
        dest_parts.pop(0)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1798
        source_parts.pop(0)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1799
    full_parts = ['..']*len(source_parts) + dest_parts
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1800
    if not dest_is_directory:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1801
        full_parts.append(dest_filename)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1802
    if not full_parts:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1803
        # Special case for the current directory (otherwise it'd be '')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1804
        return './'
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1805
    return os.path.sep.join(full_parts)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1806
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1807
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1808
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1809
############################################################
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1810
## Bootstrap script creation:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1811
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1812
def create_bootstrap_script(extra_text, python_version=''):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1813
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1814
    Creates a bootstrap script, which is like this script but with
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1815
    extend_parser, adjust_options, and after_install hooks.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1816
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1817
    This returns a string that (written to disk of course) can be used
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1818
    as a bootstrap script with your own customizations.  The script
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1819
    will be the standard virtualenv.py script, with your extra text
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1820
    added (your extra text should be Python code).
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1821
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1822
    If you include these functions, they will be called:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1823
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1824
    ``extend_parser(optparse_parser)``:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1825
        You can add or remove options from the parser here.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1826
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1827
    ``adjust_options(options, args)``:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1828
        You can change options here, or change the args (if you accept
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1829
        different kinds of arguments, be sure you modify ``args`` so it is
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1830
        only ``[DEST_DIR]``).
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1831
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1832
    ``after_install(options, home_dir)``:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1833
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1834
        After everything is installed, this function is called.  This
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1835
        is probably the function you are most likely to use.  An
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1836
        example would be::
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1837
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1838
            def after_install(options, home_dir):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1839
                subprocess.call([join(home_dir, 'bin', 'easy_install'),
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1840
                                 'MyPackage'])
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1841
                subprocess.call([join(home_dir, 'bin', 'my-package-script'),
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1842
                                 'setup', home_dir])
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1843
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1844
        This example immediately installs a package, and runs a setup
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1845
        script from that package.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1846
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1847
    If you provide something like ``python_version='2.5'`` then the
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1848
    script will start with ``#!/usr/bin/env python2.5`` instead of
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1849
    ``#!/usr/bin/env python``.  You can use this when the script must
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1850
    be run with a particular Python version.
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1851
    """
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1852
    filename = __file__
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1853
    if filename.endswith('.pyc'):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1854
        filename = filename[:-1]
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  1855
    f = codecs.open(filename, 'r', encoding='utf-8')
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1856
    content = f.read()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1857
    f.close()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1858
    py_exe = 'python%s' % python_version
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1859
    content = (('#!/usr/bin/env %s\n' % py_exe)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1860
               + '## WARNING: This file is generated\n'
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1861
               + content)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1862
    return content.replace('##EXT' 'END##', extra_text)
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1863
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1864
##EXTEND##
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1865
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1866
def convert(s):
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1867
    b = base64.b64decode(s.encode('ascii'))
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1868
    return zlib.decompress(b).decode('utf-8')
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1869
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1870
##file site.py
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  1871
SITE_PY = convert("""
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1872
eJzFPf1z2zaWv/OvwMqToZTKdOJ0e3tO3RsncVrfuYm3yc7m1vXoKAmyWFMkS5C2tTd3f/u9DwAE
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1873
+CHb2+6cphNLJPDw8PC+8PAeOhqNTopCZkuxyZd1KoWScblYiyKu1kqs8lJU66Rc7hdxWW3h6eIm
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1874
vpZKVLlQWxVhqygInv/GT/BcfF4nyqAA3+K6yjdxlSziNN2KZFPkZSWXYlmXSXYtkiypkjhN/g4t
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1875
8iwSz387BsFZJmDmaSJLcStLBXCVyFfiYlut80yM6wLn/DL6Y/xqMhVqUSZFBQ1KjTNQZB1XQSbl
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1876
EtCElrUCUiaV3FeFXCSrZGEb3uV1uhRFGi+k+K//4qlR0zAMVL6Rd2tZSpEBMgBTAqwC8YCvSSkW
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1877
+VJGQryRixgH4OcNsQKGNsU1U0jGLBdpnl3DnDK5kErF5VaM53VFgAhlscwBpwQwqJI0De7y8kZN
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1878
YElpPe7gkYiZPfzJMHvAPHH8LucAjh+z4C9Zcj9l2MA9CK5aM9uUcpXcixjBwk95Lxcz/WycrMQy
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1879
Wa2ABlk1wSYBI6BEmswPClqOb/UKfXdAWFmujGEMiShzY35JPaLgrBJxqoBt6wJppAjzd3KexBlQ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1880
I7uF4QAikDToG2eZqMqOQ7MTOQAocR0rkJKNEuNNnGTArD/GC0L7r0m2zO/UhCgAq6XEL7Wq3PmP
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1881
ewgArR0CTANcLLOadZYmNzLdTgCBz4B9KVWdVigQy6SUiyovE6kIAKC2FfIekJ6KuJSahMyZRm6n
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1882
RH+iSZLhwqKAocDjSyTJKrmuS5IwsUqAc4Er3n/8Sbw7fXN28kHzmAHGMnu9AZwBCi20gxMMIA5q
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1883
VR6kOQh0FJzjHxEvlyhk1zg+4NU0OHhwpYMxzL2I2n2cBQey68XVw8AcK1AmNFZA/f4bukzVGujz
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1884
Pw+sdxCcDFGFJs7f7tY5yGQWb6RYx8xfyBnBtxrOd1FRrV8DNyiEUwGpFC4OIpggPCCJS7NxnklR
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1885
AIulSSYnAVBoTm39VQRW+JBn+7TWLU4ACGWQwUvn2YRGzCRMtAvrNeoL03hLM9NNArvOm7wkxQH8
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1886
ny1IF6VxdkM4KmIo/jaX10mWIULIC0G4F9LA6iYBTlxG4pxakV4wjUTI2otbokjUwEvIdMCT8j7e
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1887
FKmcsviibt2tRmgwWQmz1ilzHLSsSL3SqjVT7eW9w+hLi+sIzWpdSgBezz2hW+X5VMxBZxM2Rbxh
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1888
8arucuKcoEeeqBPyBLWEvvgdKHqiVL2R9iXyCmgWYqhgladpfgckOwoCIfawkTHKPnPCW3gH/wJc
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1889
/DeV1WIdBM5IFrAGhcgPgUIgYBJkprlaI+Fxm2bltpJJMtYUebmUJQ31OGIfMOKPbIxzDT7klTZq
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1890
PF1c5XyTVKiS5tpkJmzxsrBi/fia5w3TAMutiGamaUOnDU4vLdbxXBqXZC5XKAl6kV7bZYcxg54x
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1891
yRZXYsNWBt4BWWTCFqRfsaDSWVWSnACAwcIXZ0lRp9RIIYOJGAbaFAR/E6NJz7WzBOzNZjlAhcTm
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1892
ewH2B3D7O4jR3ToB+iwAAmgY1FKwfPOkKtFBaPRR4Bt905/HB049W2nbxEOu4iTVVj7OgjN6eFqW
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1893
JL4LWWCvqSaGghlmFbp21xnQEcV8NBoFgXGHtsp8zVVQldsjYAVhxpnN5nWChm82Q1Ovf6iARxHO
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1894
wF43287CAw1hOn0AKjldVmW+wdd2bp9AmcBY2CPYExekZSQ7yB4nvkbyuSq9ME3RdjvsLFAPBRc/
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1895
nb4/+3L6SRyLy0alTdv67ArGPM1iYGuyCMBUrWEbXQYtUfElqPvEezDvxBRgz6g3ia+Mqxp4F1D/
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1896
XNb0Gqax8F4Gpx9O3pyfzv7y6fSn2aezz6eAINgZGezRlNE81uAwqgiEA7hyqSJtX4NOD3rw5uST
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1897
fRDMEjX75mtgN3gyvpYVMHE5hhlPRbiJ7xUwaDilphPEsdMALHg4mYjvxOHz568OCVqxLbYADMyu
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1898
0xQfzrRFnyXZKg8n1PgXdumPWUlp/+3y6OsrcXwswl/i2zgMwIdqmjJL/Eji9HlbSOhawZ9xriZB
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1899
sJQrEL0biQI6fk5+8YQ7wJJAy1zb6V/yJDPvmSvdIUh/jKkH4DCbLdJYKWw8m4VABOrQ84EOETvX
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1900
KHVj6Fhs3a4TjQp+SgkLm2GXKf7Tg2I8p36IBqPodjGNQFw3i1hJbkXTh36zGeqs2WysBwRhJokB
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1901
h4vVUChME9RZZQJ+LXEe6rC5ylP8ifBRC5AA4tYKtSQukt46RbdxWks1diYFRByPW2RERZso4kdw
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1902
UcZgiZulm0za1DQ8A82AfGkOWrRsUQ4/e+DvgLoymzjc6PHei2mGmP477zQIB3A5Q1T3SrWgsHYU
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1903
F6cX4tWLw310Z2DPubTU8ZqjhU6yWtqHK1gtIw+MMPcy8uLSZYV6Fp8e7Ya5iezKdFlhpZe4lJv8
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1904
Vi4BW2RgZ5XFT/QGduYwj0UMqwh6nfwBVqHGb4xxH8qzB2lB3wGotyEoZv3N0u9xMEBmChQRb6yJ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1905
1HrXz6awKPPbBJ2N+Va/BFsJyhItpnFsAmfhPCZDkwgaArzgDCl1J0NQh2XNDivhjSDRXiwbxRoR
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1906
uHPU1Ff09SbL77IZ74SPUemOJ5Z1UbA082KDZgn2xHuwQoBkDhu7hmgMBVx+gbK1D8jD9GG6QFna
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1907
WwAgMPSKtmsOLLPVoynyrhGHRRiT14KEt5ToL9yaIWirZYjhQKK3kX1gtARCgslZBWdVg2YylDXT
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1908
DAZ2SOJz3XnEW1AfQIuKEZjNsYbGjQz9Lo9AOYtzVyk5/dAif/nyhdlGrSm+gojNcdLoQqzIWEbF
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1909
FgxrAjrBeGQcrSE2uAPnFsDUSrOm2P8k8oK9MVjPCy3b4AfA7q6qiqODg7u7u0hHF/Ly+kCtDv74
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1910
p2+++dML1onLJfEPTMeRFh1qiw7oHXq00bfGAn1nVq7Fj0nmcyPBGkvyysgVRfy+r5NlLo72J1Z/
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1911
Ihc3Zhr/Na4MKJCZGZSpDLQdNRg9U/vPoldqJJ6RdbZtxxP2S7RJtVbMt7rQo8rBEwC/ZZHXaKob
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1912
TlDiK7BusENfynl9HdrBPRtpfsBUUU7Hlgf2X14hBj5nGL4ypniGWoLYAi2+Q/qfmG1i8o60hkDy
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1913
oonq7J63/VrMEHf5eHm3vqYjNGaGiULuQInwmzxaAG3jruTgR7u2aPcc19Z8PENgLH1gmFc7lmMU
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1914
HMIF12LqSp3D1ejxgjTdsWoGBeOqRlDQ4CTOmdoaHNnIEEGid2M2+7ywugXQqRU5NPEBswrQwh2n
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1915
Y+3arOB4QsgDx+IlPZHgIh913r3gpa3TlAI6LR71qMKAvYVGO50DX44NgKkYlX8ZcUuzTfnYWhRe
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1916
gx5gOceAkMFWHWbCN64PONob9bBTx+oP9WYa94HARRpzLOpR0AnlYx6hVCBNxdjvOcTilrjdwXZa
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1917
HGIqs0wk0mpAuNrKo1eodhqmVZKh7nUWKVqkOXjFVisSIzXvfWeB9kH4uM+YaQnUZGjI4TQ6Jm/P
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1918
E8BQt8Pw2XWNgQY3DoMYbRJF1g3JtIZ/wK2g+AYFo4CWBM2CeayU+RP7HWTOzld/GWAPS2hkCLfp
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1919
kBvSsRgajnm/J5CMOhoDUpABCbvCSK4jq4MUOMxZIE+44bUclG6CESmQM8eCkJoB3Omlt8HBJxGe
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1920
gJCEIuT7SslCfCVGsHxtUX2c7v5dudQEIcZOA3IVdPTi2I1sOFGN41aUw2doP75BZyVFDhw8B5fH
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1921
DfS7bG6Y1gZdwFn3FbdFCjQyxWFGExfVK0MYN5j8h2OnRUMsM4hhKG8g70jHjDQJ7HJr0LDgBoy3
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1922
5u2x9GM3YoF9x2GuDuXmHvZ/YZmoRa5Cipm0YxfuR3NFlzYW2/NkPoI/3gKMJlceJJnq+AVGWf6B
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1923
QUIPetgH3ZsshkWWcXmXZCEpME2/Y39pOnhYUnpG7uATbacOYKIY8Tx4X4KA0NHnAYgTagLYlctQ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1924
abe/C3bnFEcWLncfeW7z5dGrqy5xp0MRHvvpX6rT+6qMFa5WyovGQoGr1TXgqHRhcnG21YeX+nAb
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1925
twllrmAXKT5++iKQEBzXvYu3T5t6w/CIzYNz8j4GddBrD5KrNTtiF0AEtSIyykH4dI58PLJPndyO
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1926
iT0ByJMYZseiGEiaT/4ROLsWCsbYX24zjKO1VQZ+4PU3X896IqMukt98PXpglBYx+sR+3PIE7cic
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1927
VLBrtqWMU3I1nD4UVMwa1rFtignrc9r+aR676vE5NVo29t3fAj8GCobUJfgIL6YN2bpTxY/vTg3C
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1928
03ZqB7DObtV89mgRYG+fz3+BHbLSQbXbOEnpXAEmv7+PytVs7jle0a89PEg7FYxDgr79l7p8AdwQ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1929
cjRh0p2OdsZOTMC5ZxdsPkWsuqjs6RyC5gjMywtwjz+HFU6ve+B7Bge/r7p8IiBvTqMeMmpbbIZ4
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1930
wQclhz1K9gnzfvqMf9dZP27mw4L1/zHLF/+cST5hKgaaNh4+rH5iuXbXAHuEeRpwO3e4hd2h+axy
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1931
ZZw7VklKPEfd9VzcUboCxVbxpAigLNnv64GDUqoPvd/WZclH16QCC1nu43HsVGCmlvH8ek3Mnjj4
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1932
ICvExDZbUKzayevJ+4Qv1NFnO5Ow2Tf0c+c6NzErmd0mJfQFhTsOf/j442nYb0IwjgudHm9FHu83
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1933
INwnMG6oiRM+pQ9T6Cld/nH10d66+AQ1GQEmIqzJ1iVsJxBs4gj9a/BARMg7sOVjdtyhL9ZycTOT
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1934
lDqAbIpdnaD4W3yNmNiMAj//S8UrSmKDmSzSGmnFjjdmH67qbEHnI5UE/0qnCmPqECUEcPhvlcbX
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1935
Ykydlxh60txI0anbuNTeZ1HmmJwq6mR5cJ0shfy1jlPc1svVCnDBwyv9KuLhKQIl3nFOAyctKrmo
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1936
y6TaAglileuzP0p/cBrOtzzRsYckH/MwATEh4kh8wmnjeybc0pDLBAf8Ew+cJO67sYOTrBDRc3if
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1937
5TMcdUY5vlNGqnsuT4+D9gg5ABgBUJj/aKIjd/4bSa/cA0Zac5eoqCU9UrqRhpycMYQynmCkg3/T
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1938
T58RXd4awPJ6GMvr3Vhet7G87sXy2sfyejeWrkjgwtqglZGEvsBV+1ijN9/GjTnxMKfxYs3tMPcT
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1939
czwBoijMBtvIFKdAe5EtPt8jIKS2nQNnetjkzyScVFrmHALXIJH78RBLb+ZN8rrTmbJxdGeeinFn
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1940
h3KI/L4HUUSpYnPqzvK2jKs48uTiOs3nILYW3WkDYCra6UQcK81uZ3OO7rYs1ejiPz//8PEDNkdQ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1941
I5PeQN1wEdGw4FTGz+PyWnWlqdn8FcCO1NJPxKFuGuDeIyNrPMoe//OOMjyQccQdZSjkogAPgLK6
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1942
bDM39ykMW891kpR+zkzOh03HYpRVo2ZSA0Q6ubh4d/L5ZEQhv9H/jlyBMbT1pcPFx7SwDbr+m9vc
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1943
Uhz7gFDr2FZj/Nw5ebRuOOJhG2vAdjzf1oPDxxjs3jCBP8t/KqVgSYBQkQ7+PoVQj945/Kb9UIc+
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1944
hhE7yX/uyRo7K/adI3uOi+KIft+xQ3sA/7AT9xgzIIB2ocZmZ9DslVtK35rXHRR1gD7S1/vNe832
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1945
1qu9k/EpaifR4wA6lLXNht0/75yGjZ6S1ZvT788+nJ+9uTj5/IPjAqIr9/HTwaE4/fGLoPwQNGDs
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1946
E8WYGlFhJhIYFrfQSSxz+K/GyM+yrjhIDL3enZ/rk5oNlrpg7jPanAiecxqThcZBM45C24c6/wgx
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1947
SvUGyakponQdqjnC/dKG61lUrvOjqVRpjs5qrbdeulbM1JTRuXYE0geNXVIwCE4xg1eUxV6ZXWHJ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1948
J4C6zqoHKW2jbWJISkHBTrqAc/5lTle8QCl1hidNZ63oL0MX1/AqUkWawE7udWhlSXfD9JiGcfRD
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1949
e8DNePVpQKc7jKwb8qwHsUCr9Trkuen+k4bRfq0Bw4bB3sG8M0npIZSBjcltIsRGfJITynv4apde
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1950
r4GCBcODvgoX0TBdArOPYXMt1glsIIAn12B9cZ8AEFor4R8IHDnRAZljdkb4drPc/3OoCeK3/vnn
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1951
nuZVme7/TRSwCxKcShT2ENNt/A42PpGMxOnH95OQkaPUXPHnGssDwCGhAKgj7ZS/xCfos7GS6Urn
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1952
l/j6AF9oP4Fet7qXsih1937XOEQJeKbG5DU8U4Z+IaZ7WdhTnMqkBRorHyxmWEHopiGYz574tJZp
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1953
qvPdz96dn4LviMUYKEF87nYKw3G8BI/QdfIdVzi2QOEBO7wukY1LdGEpyWIZec16g9YoctTby8uw
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1954
60SB4W6vThS4jBPloj3GaTMsU04QISvDWphlZdZutUEKu22I4igzzBKzi5ISWH2eAF6mpzFviWCv
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1955
hKUeJgLPp8hJVpmMxTRZgB4FlQsKdQpCgsTFekbivDzjGHheKlMGBQ+LbZlcrys83YDOEZVgYPMf
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1956
T76cn32gsoTDV43X3cOcU9oJTDmJ5BhTBDHaAV/ctD/kqtmsj2f1K4SB2gf+tF9xdsoxD9Dpx4FF
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1957
/NN+xXVox85OkGcACqou2uKBGwCnW5/cNLLAuNp9MH7cFMAGMx8MxSKx7EUnerjz63KibdkyJRT3
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1958
MS+fcICzKmxKmu7spqS1P3qOqwLPuZbj/kbwtk+2zGcOXW86b4aS39xPRwqxJBYw6rb2xzDZYZ2m
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1959
ejoOsw1xC21rtY39OXNipU67RYaiDEQcu50nLpP1K2HdnDnQS6PuABPfanSNJPaq8tHP2Uh7GB4m
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1960
ltidfYrpSGUsZAQwkiF17U8NPhRaBFAglP07diR3Onl+6M3RsQYPz1HrLrCNP4Ai1Lm4VOORl8CJ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1961
8OVXdhz5FaGFevRIhI6nkskst3li+Llbo1f50p9jrwxQEBPFroyzazlmWFMD8yuf2AMhWNK2Hqkv
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1962
k6s+wyLOwDm9H+Dwrlz0H5wY1FqM0Gl3I7dtdeSTBxv0loLsJJgPvozvQPcXdTXmlRw4h+6tpRuG
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1963
+jBEzD6Epvr0fRxiOObXcGB9GsC91NCw0MP7deDsktfGOLLWPraqmkL7QnuwixK2ZpWiYxmnONH4
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1964
otYLaAzucWPyR/apThSyv3vqxJyYkAXKg7sgvbmNdINWOGHE5UpcOZpQOnxTTaPfLeWtTMFogJEd
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1965
Y7XDL7baYRLZcEpvHthvxu5ie7Htx43eNJgdmXIMRIAKMXoDPbsQanDAFf5Z70Ti7Iac47d/PZuK
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1966
tx9+gn/fyI9gQbHmcSr+BqOLt3kJ20ou2qXbFLCAo+L9Yl4rLIwkaHRCwRdPoLd24ZEXT0N0ZYlf
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1967
UmIVpMBk2nLDt50AijxBKmRv3ANTLwG/TUFXywk1DmLfWoz0S6TBcI0L1oUc6JbRutqkaCac4Eiz
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1968
iJej87O3px8+nUbVPTK2+Tlygid+HhZORx8Nl3gMNhX2yaLGJ1eOv/yDTIsed1nvNU29DO41RQjb
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1969
kcLuL/kmjdjuKeISAwai2C7zRYQtgdO5RK+6A/954mwrH7TvnnFFWOOJPjxrnHh8DNQQP7f1zwga
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1970
Uh89J+pJCMVzrBXjx9Go3wJPBUW04c/zm7ulGxDXRT80wTamzazHfnerAtdMZw3PchLhdWyXwdSB
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1971
pkmsNvOFWx/4MRP6IhRQbnS8IVdxnVZCZrCVor093UgBCt4t6WMJYVZhK0Z1bhSdSe/irXJyj2Il
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1972
RjjqiIrq8RyGAoWw9f4xvmEzgLWGouYSaIBOiNK2KXe6qnqxZgnmnRBRryff4C7JXrnJL5rCPChv
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1973
jBeN/wrzRG+RMbqWlZ4/PxhPLl82CQ4UjF54Bb2LAoydyyZ7oDGL58+fj8S/Pez0MCpRmuc34I0B
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1974
7F5n5ZxeDxhsPTm7Wl2H3ryJgB8Xa3kJD64oaG6f1xlFJHd0pQWR9q+BEeLahJYZTfuWOeZYXcnn
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1975
y9yCz6m0wfhLltB1RxhRkqhs9a1RGG0y0kQsCYohjNUiSUKOTsB6bPMaa/Ewuqj5Rd4DxycIZopv
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1976
8WCMd9hrdCwpb9Zyj0XnWIwI8IhSyng0KmamajTAc3ax1WjOzrKkaspIXrhnpvoKgMreYqT5SsR3
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1977
KBlmHi1iOGWdHqs2jnW+k0W9jUq+uHTjjK1Z8uuHcAfWBknLVyuDKTw0i7TIZbkw5hRXLFkklQPG
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1978
tEM43JkubyLrEwU9KI1AvZNVWFqJtm//YNfFxfQjHR/vm5F01lBlL8TimFCctfIKo6gZn6JPlpCW
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1979
b82XCYzygaLZ2hPwxhJ/0LFUrCHw7u1wyxnrTN/HwWkbzSUdAIfugLIK0rKjpyOci8csfGbagVs0
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1980
8EM7c8LtNimrOk5n+tqHGfppM3uervG0ZXA7CzyttwK+fQ6O777O2AfHwSTXID0x49ZUZByLlY5M
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1981
RG5lmV+EVeTo5R2yrwQ+BVJmOTP10CZ2dGnZ1Raa6gRHR8UjqK9M8dKAQ26qZjoFJy7mU0pvMuUO
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1982
A86zn29JV1eI78T41VQctnY+i2KLNzkBss+Woe+KUTeYihMMMHNs34shvjsW45dT8ccd0KOBAY4O
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1983
3RHa+9gWhEEgr66eTMY0mRPZwr4U9of76hxG0PSM4+SqTf4umb4lKv1ri0pcIagTlV+2E5VbYw/u
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1984
WzsfH8lwA4pjlcjl/jOFJNRIN7p5mMEJPyyg37M5Wrp2vKmoocK5OWxG7ho96GhE4zbbQUxRulZf
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1985
XL+LuoYNp71zwKTJtFIV7S1zmMao0WsRFQDM+o7S8Bve7QLvNSlc/2zwiFUXAViwPREEXenJB2ZN
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1986
w0ZQH3QEn6QBHmAUEeJhaqMoXMl6goiEdA8OMdFXrUNsh+N/d+bhEoOho9AOlt98vQtPVzB7izp6
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1987
FnR3pYUnsra8ollu8+kPzHmM0tf1NwmMA6URHXBWzVWV5GYeYfYy30GT2yzmDV4GSSfTaBJT6bpN
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1988
vJXmW7/Qj6HYASWTwVqAJ1Wv8CD5lu62PFGU9IZX1Hx9+HJqKoMZkJ7Aq+jVV/oKSOpmLj/wfeyp
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1989
3rvBS93vMPoXB1hS+b3tq85uhqZ13LoLyh8spOjZJJpZOjSG6eE6kGbNYoF3JjbEZN/aXgDyHryd
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1990
Ofg55vLTHBw22JBGfei6GqOR3iHVNiDAD5uMIcl5VNdGkSLSu4RtSHnuUpxPFgXdq9+CYAgBOX8d
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1991
8xt0BeviyIbYjE3Bk8+xm82Jn+qmt+6M7Qka2+om3DV97r9r7rpFYGdukhk6c/frS10a6L7DVrSP
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1992
Bhze0IR4VIlEo/H7jYlrB6Y6h6Y/Qq8/SH63E850wKw8BMZk7GC8n9hTY2/M/iZeuN8xIWyfL2R2
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1993
y4l7nY3WtDs2o83xj/EUOPkFn9sbBiijaak5kPdLdMPejHNkZ/L6Ws1ivN1xRptsyufq7J7Mtu09
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1994
Xc4nY7U1uy28tAhAGG7Smbducj0wBuhKvmWa06Gc22kEDU1Jw04WskqWbBL01g7ARRwxpf4mEM9p
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1995
xKNUYqBb1WVRwm54pO8i5jydvtTmBqgJ4G1idWNQNz2m+mpaUqyUHGZKkDlO20ryASKwEe+YhtnM
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1996
vgNeedFcs5BMLTPIrN7IMq6aK4b8jIAENl3NCFR0jovrhOcaqWxxiYtYYnnDQQoDZPb7V7Cx9DbV
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1997
O+5VmFht93h2oh465PuUKxscY2S4OLm31wu611ot6Wpr1zu0zRqus1cqwTKYu/JIR+pYGb/V93fx
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1998
HbMcyUf/0uEfkHe38tLPQrfqjL1bi4bzzFUI3Qub8MYAMs599zB2OKB742JrA2zH9/WFZZSOhznQ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  1999
2FJR++S9CqcZbdJEkDBh9IEIkl8U8MQIkgf/kREkfWsmGBqNj9YDvWUCD4SaWD24V1A2jAB9ZkAk
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2000
PMBuXWBoTOXYTbovcpXcj+yF0qwrnUo+Yx6QI7t3kxEIvmpSuRnK3lVwuyJIvnTR4+/PP745OSda
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2001
zC5O3v7HyfeUlIXHJS1b9egQW5bvM7X3vfRvN9ymE2n6Bm+w7bkhlmuYNITO+04OQg+E/nq1vgVt
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2002
KzL39VCHTt1PtxMgvnvaLahDKrsXcscv0zUmbvpMK0870E85qdb8cjITzCNzUsfi0JzEmffN4YmW
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2003
0U5seWjhnPTWrjrR/qq+BXQg7j2xSda0Anhmgvxlj0xMxYwNzLOD0v7ffFBmOFYbmht0QAoX0rnJ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2004
kS5xZFCV//8TKUHZxbi3Y0dxau/mpnZ8PKTspfN49ruQkSGIV+436s7PFfalTAeoEASs8PQ9hYyI
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2005
0X/6QNWmHzxT4nKfCov3Udlc2V+4Ztq5/WuCSQaVve9LcYISH7NC41WduokDtk+nAzl9dBqVr5xK
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2006
FtB8B0DnRjwVsDf6S6wQ51sRwsZRu2SYHEt01Jf1Ocij3XSwN7R6IfaHyk7dskshXg43XLYqO3WP
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2007
Q+6hHuihalPc51hgzNIcqicV3xFkPs4UdMGX53zgGbre9sPX28uXR/ZwAfkdXzuKhLLJRo5hv3Sy
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2008
MXdeKul0J2Ypp5Suh3s1JySsW1w5UNknGNrbdEpSBvY/Js+BIY289/0hM9PDu3p/1MbUst4RTEmM
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2009
n6kJTcsp4tG42yeT7nQbtdUFwgVJjwDSUYEAC8F0dKOTILrlLO/xC70bnNd0Ha97whQ6UkHJYj5H
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2010
cA/j+zX4tbtTIfGjujOKpj83aHOgXnIQbvYduNXEC4UMm4T21Bs+GHABuCa7v//LR/TvpjHa7oe7
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2011
/Grb6lVvHSD7spj5iplBLRKZxxEYGdCbY9LWWC5hBB2voWno6DJUMzfkC3T8KJsWL9umDQY5szPt
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2012
AVijEPwfucjncQ==
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2013
""")
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2014
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2015
##file activate.sh
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2016
ACTIVATE_SH = convert("""
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2017
eJytVVFv2jAQfs+vuIY+lGo0Yo+tmEQ1JJBaqBrWaWurYJKDWAo2ShxSWvW/7+yEEAhl0tY8EOI7
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2018
332++75zA8YhT2DGI4RFmiiYIqQJBpBxFYKdyDT2EaZcOMxXfMUU2nA+i+UCpiwJz60GrGUKPhNC
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2019
KohTAVxBwGP0VbS2rAA3u+CsCW8W0JOKBBUs14H0LbPQgBj1kowCQLHisRQLFApWLOZsGmFivPgM
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2020
HqElwD5980Y3372Hwf34R/fGu+uO+613G57hClSIwjjrRxs69mnN2S498GUpY2Ucy7UcXW2Tsc/4
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2021
cSS/xv3RsD+67R3GU5prqEpLHVtpOopw14twFoU1vU1CmVJpA1TUFdM2YCKA1yT8AlnI/RBCtkJg
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2022
9CKTLxcLbVYhU4YRRSjihc+iiJihJMwJATWa/s1krD+WjKhTbE0uAH4Se2SqCrPiYl6E2XHUBYJT
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2023
XV/wQybmmEBGNGSB/lmDphSlJXYsCTkG+9W/7rqm9S1ZLPx2+95D794djIYHW2AO2Irh6zcnwJUj
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2024
0ijaKdiHnXXbh1vqtmu9dNv1Jrrto90rzBsUucvG2hs+bLGdaGgGSwdsIUWAiYpTLTHcg9cAF6MZ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2025
bBxO9gC0tGmjzU32d4vknNt5HGOEK7Yjw4qad3NbVgVtx/a8yqfn2VZRh+qRrJrEqJK5PIuPirfj
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2026
edeDoTfs3vY877Jwq6q3xL1Vgi4YrZBFaRFkPIpgxnik16teifbSTNZcxMVSrYHORYSFs1wc5DFl
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2027
AUlmnbF1k+L5Rk40JGFCsc5MOdMruCQml3GbcDUBLozarAqtjsyIDxSty7I3H/aPamnm5EledZJq
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2028
9b8P3O71Tc+7ux/d3o3/ktTQuWSwiWi/bLuZx6CGwkkHXj6QQ919GxGjBCuhJ1QdFGyB8LTT7id7
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2029
YgiuM9WSNEBPA84iGkfUAhow0KUVQRNjzv3i7pExL66NYgsihEotLx0ny7KLV1Q0Y1YXNIecRM5U
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2030
xmJ0mI7i7B7msQJxQqEPgn2aTJ7hwCHLKGdHDtrcbiyul+JVmR26vSziLMlvzY69XNN0FdBa5Au2
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2031
5v+njPpPGPP/OeL/dbwfGu1Utz87Sp7q
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2032
""")
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2033
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2034
##file activate.fish
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2035
ACTIVATE_FISH = convert("""
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2036
eJydVW2P2jgQ/s6vmAZQoVpA9/WkqqJaTou0u6x2uZVOVWWZZEKsS+yc7UDpr+84bziQbauLxEvs
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2037
eXnsZ56ZIWwTYSAWKUJWGAs7hMJgBEdhEwiMKnSIsBNywUMrDtziPBYmCeBDrFUG7v8HmCTW5n8u
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2038
Fu7NJJim81Bl08EQTqqAkEupLOhCgrAQCY2hTU+DQVxIiqgkRNiEBphFEKy+kd1BaFvwFOUBuIxA
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2039
oy20BKtAKp3xFMo0QNtCK5mhtMEA6BmSpUELKo38TThwLfguRVNaiRgs0llnEoIR29zfstf18/bv
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2040
5T17Wm7vAiiN3ONCzfbfwC3DtWXXDqHfAGX0q6z/bO82j3ebh1VwnbrduwTQbvwcRtesAfMGor/W
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2041
L3fs6Xnz8LRlm9fV8/P61sM0LDNwCZjl9gSpCokJRzpryGQ5t8kNGFUt51QjOZGu0Mj35FlYlXEr
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2042
yC09EVOp4lEXfF84Lz1qbhBsgl59vDedXI3rTV03xipduSgt9kLytI3XmBp3aV6MPoMQGNUU62T6
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2043
uQdeefTy1Hfj10zVHg2pq8fXDoHBiOv94csfXwN49xECqWREy7pwukKfvxdMY2j23vXDPuuxxeE+
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2044
JOdCOhxCE3N44B1ZeSLuZh8Mmkr2wEPAmPfKWHA2uxIRjEopdbQYjDz3BWOf14/scfmwoki1eQvX
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2045
ExBdF60Mqh+Y/QcX4uiH4Amwzx79KOVFtbL63sXJbtcvy8/3q5rupmO5CnE91wBviQAhjUUegYpL
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2046
vVEbpLt2/W+PklRgq5Ku6mp+rpMhhCo/lXthQTxJ2ysO4Ka0ad97S7VT/n6YXus6fzk3fLnBZW5C
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2047
KDC6gSO62QDqgFqLCCtPmjegjnLeAdArtSE8VYGbAJ/aLb+vnQutFhk768E9uRbSxhCMzdgEveYw
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2048
IZ5ZqFKl6+kz7UR4U+buqQZXu9SIujrAfD7f0FXpozB4Q0gwp31H9mVTZGGC4b871/wm7lvyDLu1
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2049
FUyvTj/yvD66k3UPTs08x1AQQaGziOl0S1qRkPG9COtBTSTWM9NzQ4R64B+Px/l3tDzCgxv5C6Ni
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2050
e+QaF9xFWrxx0V/G5uvYQOdiZzvYpQUVQSIsTr1TTghI33GnPbTA7/GCqcE3oE3GZurq4HeQXQD6
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2051
32XS1ITj/qLjN72ob0hc5C9bzw8MhfmL
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2052
""")
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2053
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2054
##file activate.csh
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2055
ACTIVATE_CSH = convert("""
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2056
eJx9VG1P2zAQ/u5fcYQKNgTNPtN1WxlIQ4KCUEGaxuQ6yYVYSuzKdhqVX7+zk3bpy5YPUXL3PPfc
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2057
ne98DLNCWshliVDV1kGCUFvMoJGugMjq2qQIiVSxSJ1cCofD1BYRnOVGV0CfZ0N2DD91DalQSjsw
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2058
tQLpIJMGU1euvPe7QeJlkKzgWixlhnAt4aoUVsLnLBiy5NtbJWQ5THX1ZciYKKWwkOFaE04dUm6D
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2059
r/zh7pq/3D7Nnid3/HEy+wFHY/gEJydg0aFaQrBFgz1c5DG1IhTs+UZgsBC2GMFBlaeH+8dZXwcW
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2060
VPvCjXdlAvCfQsE7al0+07XjZvrSCUevR5dnkVeKlFYZmUztG4BdzL2u9KyLVabTU0bdfg7a0hgs
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2061
cSmUg6UwUiQl2iHrcbcVGNvPCiLOe7+cRwG13z9qRGgx2z6DHjfm/Op2yqeT+xvOLzs0PTKHDz2V
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2062
tkckFHoQfQRXoGJAj9el0FyJCmEMhzgMS4sB7KPOE2ExoLcSieYwDvR+cP8cg11gKkVJc2wRcm1g
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2063
QhYFlXiTaTfO2ki0fQoiFM4tLuO4aZrhOzqR4dIPcWx17hphMBY+Srwh7RTyN83XOWkcSPh1Pg/k
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2064
TXX/jbJTbMtUmcxZ+/bbqOsy82suFQg/BhdSOTRhMNBHlUarCpU7JzBhmkKmRejKOQzayQe6MWoa
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2065
n1wqWmuh6LZAaHxcdeqIlVLhIBJdO9/kbl0It2oEXQj+eGjJOuvOIR/YGRqvFhttUB2XTvLXYN2H
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2066
37CBdbW2W7j2r2+VsCn0doVWcFG1/4y1VwBjfwAyoZhD
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2067
""")
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2068
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2069
##file activate.bat
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2070
ACTIVATE_BAT = convert("""
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2071
eJx9UdEKgjAUfW6wfxjiIH+hEDKUFHSKLCMI7kNOEkIf9P9pTJ3OLJ/03HPPPed4Es9XS9qqwqgT
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2072
PbGKKOdXL4aAFS7A4gvAwgijuiKlqOpGlATS2NeMLE+TjJM9RkQ+SmqAXLrBo1LLIeLdiWlD6jZt
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2073
r7VNubWkndkXaxg5GO3UaOOKS6drO3luDDiO5my3iA0YAKGzPRV1ack8cOdhysI0CYzIPzjSiH5X
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2074
0QcvC8Lfaj0emsVKYF2rhL5L3fCkVjV76kShi59NHwDniAHzkgDgqBcwOgTMx+gDQQqXCw==
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2075
""")
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2076
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2077
##file deactivate.bat
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2078
DEACTIVATE_BAT = convert("""
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2079
eJxzSE3OyFfIT0vj4ipOLVEI8wwKCXX0iXf1C7Pl4spMU0hJTcvMS01RiPf3cYmHyQYE+fsGhCho
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2080
cCkAAUibEkTEVhWLMlUlLk6QGixStlyaeCyJDPHw9/Pw93VFsQguim4ZXAJoIUw5DhX47XUM8UCx
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2081
EchHtwsohN1bILUgw61c/Vy4AJYPYm4=
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2082
""")
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2083
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2084
##file activate.ps1
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2085
ACTIVATE_PS = convert("""
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2086
eJylWdmO41hyfW+g/0FTU7C7IXeJIqmtB/3AnZRIStxF2kaBm7gv4ipyMF/mB3+Sf8GXVGVl1tLT
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2087
43ECSqR4b5wbETeWE8z/+a///vNCDaN6cYtSf5G1dbNw/IVXNIu6aCvX9xa3qsgWl0IJ/7IYinbh
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2088
2nkOVqs2X0TNjz/8eeFFle826fBhQRaLBkD9uviw+LCy3Sbq7Mb/UNbrH3+YNtLcVaB+Xbipb+eL
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2089
tly0eVsD/M6u6g8//vC+dquobH5VWU75eMFUdvHb4n02RHlXuHYTFfmHbHCLLLNz70NpN+GrBI4p
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2090
1EeSk4FAXaZR88u0vPip8usi7fznt3fvP+OuPnx49/Pil4td+XnzigIAPoqYQH2J8v4z+C+8b98m
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2091
Q25t7k76LIK0cOz0V89/MXXx0+Lf6z5q3PA/F+/FIif9uqnaadFf/PzXSXYBfqIb2NeApecJwPzI
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2092
dlL/149nnvyoc7KqYfzTAT8v/voUmX7e+3n364tffl/oVaDyswKY/7J18e6bve8Wv9RuUfqfLHmK
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2093
/u139Hwx+9ePRep97KKqae30YwmCo2y+0vTz1k+rv7159B3pb1SOGj97Pe8/flfkC1Vn/7xYR4n6
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2094
lypNEGDDV5f7lcjil3S+4++p881Wv6qKyn5GQg1yJwcp4BZ5E+Wt/z1P/umbiHir4J8Xip/eFt6n
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2095
9T/9gU9eY+7zUX97Jlmb136ziKrKT/3OzpvP8VX/+MObSP0lL3LvVZlJ9v1b8357jXyw8rXxYPXN
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2096
11n4UzJ8G8S/vUbuJ6RPj999DbtS5kys//JusXwrNLnvT99cFlBNwXCe+niRz8JF/ezNr9Pze+H6
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2097
18W7d5PPvozW7+387Zto/v4pL8BvbxTzvIW9KCv/Fj0WzVQb/YXbVlPZWTz3/9vCaRtQbPN/Bb+j
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2098
2rUrDxTVD68gfQXu/ZewAFX53U/vf/rD2P3558W7+W79Po1y/xXoX/6RFHyNIoVjgAG4H0RTcAe5
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2099
3bSVv3DSwk2mZYHjFB8zj6fC4sLOFTHJJQrwzFYJgso0ApOoBzFiRzzQKjIQCCbQMIFJGCKqGUyS
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2100
8AkjiF2wTwmMEbcEUvq8Nj+X0f4YcCQmYRiOY7eRbAJDqzm1chOoNstbJ8oTBhZQ2NcfgaB6QjLp
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2101
U4+SWFjQGCZpyqby8V4JkPGs9eH1BscXIrTG24QxXLIgCLYNsIlxSYLA6SjAeg7HAg4/kpiIB8k9
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2102
TCLm0EM4gKIxEj8IUj2dQeqSxEwYVH88qiRlCLjEYGuNIkJB1BA5dHOZdGAoUFk54WOqEojkuf4Q
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2103
Ig3WY+96TDlKLicMC04h0+gDCdYHj0kz2xBDj9ECDU5zJ0tba6RKgXBneewhBG/xJ5m5FX+WSzsn
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2104
wnHvKhcOciw9NunZ0BUF0n0IJAcJMdcLqgQb0zP19dl8t9PzmMBjkuIF7KkvHgqEovUPOsY0PBB1
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2105
HCtUUhch83qEJPjQcNQDsgj0cRqx2ZbnnlrlUjE1EX2wFJyyDa/0GLrmKDEFepdWlsbmVU45Wiwt
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2106
eFM6mfs4kxg8yc4YmKDy67dniLV5FUeO5AKNPZaOQQ++gh+dXE7dbJ1aTDr7S4WPd8sQoQkDyODg
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2107
XnEu/voeKRAXZxB/e2xaJ4LTFLPYEJ15Ltb87I45l+P6OGFA5F5Ix8A4ORV6M1NH1uMuZMnmFtLi
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2108
VpYed+gSq9JDBoHc05J4OhKetrk1p0LYiKipxLMe3tYS7c5V7O1KcPU8BJGdLfcswhoFCSGQqJ8f
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2109
ThyQKy5EWFtHVuNhvTnkeTc8JMpN5li3buURh0+3ZGuzdwM55kon+8urbintjdQJf9U1D0ah+hNh
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2110
i1XNu4fSKbTC5AikGEaj0CYM1dpuli7EoqUt7929f1plxGGNZnixFSFP2qzhlZMonu2bB9OWSqYx
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2111
VuHKWNGJI8kqUhMTRtk0vJ5ycZ60JlodlmN3D9XiEj/cG2lSt+WV3OtMgt1Tf4/Z+1BaCus740kx
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2112
Nvj78+jMd9tq537Xz/mNFyiHb0HdwHytJ3uQUzKkYhK7wjGtx3oKX43YeYoJVtqDSrCnQFzMemCS
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2113
2bPSvP+M4yZFi/iZhAjL4UOeMfa7Ex8HKBqw4umOCPh+imOP6yVTwG2MplB+wtg97olEtykNZ6wg
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2114
FJBNXSTJ3g0CCTEEMdUjjcaBDjhJ9fyINXgQVHhA0bjk9lhhhhOGzcqQSxYdj3iIN2xGEOODx4qj
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2115
Q2xikJudC1ujCVOtiRwhga5nPdhe1gSa649bLJ0wCuLMcEYIeSy25YcDQHJb95nfowv3rQnin0fE
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2116
zIXFkM/EwSGxvCCMgEPNcDp/wph1gMEa8Xd1qAWOwWZ/KhjlqzgisBpDDDXz9Cmov46GYBKHC4zZ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2117
84HJnXoTxyWNBbXV4LK/r+OEwSN45zBp7Cub3gIYIvYlxon5BzDgtPUYfXAMPbENGrI+YVGSeTQ5
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2118
i8NMB5UCcC+YRGIBhgs0xhAGwSgYwywpbu4vpCSTdEKrsy8osXMUnHQYenQHbOBofLCNNTg3CRRj
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2119
A1nXY2MZcjnXI+oQ2Zk+561H4CqoW61tbPKv65Y7fqc3TDUF9CA3F3gM0e0JQ0TPADJFJXVzphpr
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2120
2FzwAY8apGCju1QGOiUVO5KV6/hKbtgVN6hRVwpRYtu+/OC6w2bCcGzZQ8NCc4WejNEjFxOIgR3o
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2121
QqR1ZK0IaUxZ9nbL7GWJIjxBARUhAMnYrq/S0tVOjzlOSYRqeIZxaSaOBX5HSR3MFekOXVdUPbjX
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2122
nru61fDwI8HRYPUS7a6Inzq9JLjokU6P6OzT4UCH+Nha+JrU4VqEo4rRHQJhVuulAnvFhYz5NWFT
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2123
aS/bKxW6J3e46y4PLagGrCDKcq5B9EmP+s1QMCaxHNeM7deGEV3WPn3CeKjndlygdPyoIcNaL3dd
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2124
bdqPs47frcZ3aNWQ2Tk+rjFR01Ul4XnQQB6CSKA+cZusD0CP3F2Ph0e78baybgioepG12luSpFXi
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2125
bHbI6rGLDsGEodMObDG7uyxfCeU+1OiyXYk8fnGu0SpbpRoEuWdSUlNi5bd9nBxYqZGrq7Qa7zV+
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2126
VLazLcelzzP9+n6+xUtWx9OVJZW3gk92XGGkstTJ/LreFVFF2feLpXGGuQqq6/1QbWPyhJXIXIMs
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2127
7ySVlzMYqoPmnmrobbeauMIxrCr3sM+qs5HpwmmFt7SM3aRNQWpCrmeAXY28EJ9uc966urGKBL9H
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2128
18MtDE5OX97GDOHxam11y5LCAzcwtkUu8wqWI1dWgHyxGZdY8mC3lXzbzncLZ2bIUxTD2yW7l9eY
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2129
gBUo7uj02ZI3ydUViL7oAVFag37JsjYG8o4Csc5R7SeONGF8yZP+7xxi9scnHvHPcogJ44VH/LMc
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2130
Yu6Vn3jEzCFw9Eqq1ENQAW8aqbUwSiAqi+nZ+OkZJKpBL66Bj8z+ATqb/8qDIJUeNRTwrI0YrVmb
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2131
9FArKVEbCWUNSi8ipfVv+STgkpSsUhcBg541eeKLoBpLGaiHTNoK0r4nn3tZqrcIULtq20Df+FVQ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2132
Sa0MnWxTugMuzD410sQygF4qdntbswiJMqjs014Irz/tm+pd5oygJ0fcdNbMg165Pqi7EkYGAXcB
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2133
dwxioCDA3+BY9+JjuOmJu/xyX2GJtaKSQcOZxyqFzTaa6/ot21sez0BtKjirROKRm2zuai02L0N+
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2134
ULaX8H5P6VwsGPbYOY7sAy5FHBROMrMzFVPYhFHZ7M3ZCZa2hsT4jGow6TGtG8Nje9405uMUjdF4
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2135
PtKQjw6yZOmPUmO8LjFWS4aPCfE011N+l3EdYq09O3iQJ9a01B3KXiMF1WmtZ+l1gmyJ/ibAHZil
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2136
vQzdOl6g9PoSJ4TM4ghTnTndEVMOmsSSu+SCVlGCOLQRaw9oLzamSWP62VuxPZ77mZYdfTRGuNBi
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2137
KyhZL32S2YckO/tU7y4Bf+QKKibQSKCTDWPUwWaE8yCBeL5FjpbQuAlb53mGX1jptLeRotREbx96
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2138
gnicYz0496dYauCjpTCA4VA0cdLJewzRmZeTwuXWD0talJsSF9J1Pe72nkaHSpULgNeK1+o+9yi0
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2139
YpYwXZyvaZatK2eL0U0ZY6ekZkFPdC8JTF4Yo1ytawNfepqUKEhwznp6HO6+2l7L2R9Q3N49JMIe
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2140
Z+ax1mVaWussz98QbNTRPo1xu4W33LJpd9H14dd66ype7UktfEDi3oUTccJ4nODjwBKFxS7lYWiq
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2141
XoHu/b7ZVcK5TbRD0F/2GShg2ywwUl07k4LLqhofKxFBNd1grWY+Zt/cPtacBpV9ys2z1moMLrT3
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2142
W0Elrjtt5y/dvDQYtObYS97pqj0eqmwvD3jCPRqamGthLiF0XkgB6IdHLBBwDGPiIDh7oPaRmTrN
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2143
tYA/yQKFxRiok+jM6ciJq/ZgiOi5+W4DEmufPEubeSuYJaM3/JHEevM08yJAXUQwb9LS2+8FOfds
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2144
FfOe3Bel6EDSjIEIKs4o9tyt67L1ylQlzhe0Q+7ue/bJnWMcD3q6wDSIQi8ThnRM65aqLWesi/ZM
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2145
xhHmQvfKBbWcC194IPjbBLYR9JTPITbzwRcu+OSFHDHNSYCLt29sAHO6Gf0h/2UO9Xwvhrjhczyx
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2146
Ygz6CqP4IwxQj5694Q1Pe2IR+KF/yy+5PvCL/vgwv5mPp9n4kx7fnY/nmV++410qF/ZVCMyv5nAP
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2147
pkeOSce53yJ6ahF4aMJi52by1HcCj9mDT5i+7TF6RoPaLL+cN1hXem2DmX/mdIbeeqwQOLD5lKO/
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2148
6FM4x77w6D5wMx3g0IAfa2D/pgY9a7bFQbinLDPz5dZi9ATIrd0cB5xfC0BfCCZO7TKP0jQ2Meih
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2149
nRXhkA3smTAnDN9IW2vA++lsgNuZ2QP0UhqyjUPrDmgfWP2bWWiKA+YiEK7xou8cY0+d3/bk0oHR
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2150
QLrq4KzDYF/ljQDmNhBHtkVNuoDey6TTeaD3SHO/Bf4d3IwGdqQp6FuhmwFbmbQBssDXVKDBYOpk
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2151
Jy7wxOaSRwr0rDmGbsFdCM+7XU/84JPu3D/gW7QXgzlvbjixn99/8CpWFUQWHFEz/RyXvzNXTTOd
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2152
OXLNNFc957Jn/YikNzEpUdRNxXcC6b76ccTwMGoKj5X7c7TvHFgc3Tf4892+5A+iR+D8OaaE6ACe
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2153
gdgHcyCoPm/xiDCWP+OZRjpzfj5/2u0i4qQfmIEOsTV9Hw6jZ3Agnh6hiwjDtGYxWvt5TiWEuabN
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2154
77YCyRXwO8P8wdzG/8489KwfFBZWI6Vvx76gmlOc03JI1HEfXYZEL4sNFQ3+bqf7e2hdSWQknwKF
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2155
ICJjGyDs3fdmnnxubKXebpQYLjPgEt9GTzKkUgTvOoQa1J7N3nv4sR6uvYFLhkXZ+pbCoU3K9bfq
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2156
gF7W82tNutRRZExad+k4GYYsCfmEbvizS4jsRr3fdzqjEthpEwm7pmN7OgVzRbrktjrFw1lc0vM8
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2157
V7dyTJ71qlsd7v3KhmHzeJB35pqEOk2pEe5uPeCToNkmedmxcKbIj+MZzjFSsvCmimaMQB1uJJKa
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2158
+hoWUi7aEFLvIxKxJavqpggXBIk2hr0608dIgnfG5ZEprqmH0b0YSy6jVXTCuIB+WER4d5BPVy9Q
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2159
M4taX0RIlDYxQ2CjBuq78AAcHQf5qoKP8BXHnDnd/+ed5fS+csL4g3eWqECaL+8suy9r8hx7c+4L
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2160
EegEWdqAWN1w1NezP34xsxLkvRRI0DRzKOg0U+BKfQY128YlYsbwSczEg2LqKxRmcgiwHdhc9MQJ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2161
IwKQHlgBejWeMGDYYxTOQUiJOmIjJbzIzHH6lAMP+y/fR0v1g4wx4St8fcqTt3gz5wc+xXFZZ3qI
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2162
JpXI5iJk7xmNL2tYsDpcqu0375Snd5EKsIvg8u5szTOyZ4v06Ny2TZXRpHUSinh4IFp8Eoi7GINJ
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2163
02lPJnS/9jSxolJwp2slPMIEbjleWw3eec4XaetyEnSSqTPRZ9fVA0cPXMqzrPYQQyrRux3LaAh1
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2164
wujbgcObg1nt4iiJ5IMbc/WNPc280I2T4nTkdwG8H6iS5xO2WfsFsruBwf2QkgZlb6w7om2G65Lr
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2165
r2Gl4dk63F8rCEHoUJ3fW+pU2Srjlmcbp+JXY3DMifEI22HcHAvT7zzXiMTr7VbUR5a2lZtJkk4k
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2166
1heZZFdru8ucCWMTr3Z4eNnjLm7LW7rcN7QjMpxrsCzjxndeyFUX7deIs3PQkgyH8k6luI0uUyLr
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2167
va47TBjM4JmNHFzGPcP6BV6cYgQy8VQYZe5GmzZHMxyBYhGiUdekZQ/qwyxC3WGylQGdUpSf9ZCP
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2168
a7qPdJd31fPRC0TOgzupO7nLuBGr2A02yuUQwt2KQG31sW8Gd9tQiHq+hPDt4OzJuY4pS8XRsepY
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2169
tsd7dVEfJFmc15IYqwHverrpWyS1rFZibDPW1hUUb+85CGUzSBSTK8hpvee/ZxonW51TUXekMy3L
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2170
uy25tMTg4mqbSLQQJ+skiQu2toIfBFYrOWql+EQipgfT15P1aq6FDK3xgSjIGWde0BPftYchDTdM
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2171
i4QdudHFkN0u6fSKiT09QLv2mtSblt5nNzBR6UReePNs+khE4rHcXuoK21igUKHl1c3MXMgPu7y8
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2172
rKQDxR6N/rffXv+lROXet/9Q+l9I4D1U
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2173
""")
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2174
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2175
##file distutils-init.py
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2176
DISTUTILS_INIT = convert("""
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2177
eJytV1uL4zYUfvevOE0ottuMW9q3gVDa3aUMXXbLMlDKMBiNrSTqOJKRlMxkf33PkXyRbGe7Dw2E
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2178
UXTu37lpxLFV2oIyifAncxmOL0xLIfcG+gv80x9VW6maw7o/CANSWWBwFtqeWMPlGY6qPjV8A0bB
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2179
C4eKSTgZ5LRgFeyErMEeOBhbN+Ipgeizhjtnhkn7DdyjuNLPoCS0l/ayQTG0djwZC08cLXozeMss
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2180
aG5EzQ0IScpnWtHSTXuxByV/QCmxE7y+eS0uxWeoheaVVfqSJHiU7Mhhi6gULbOHorshkrEnKxpT
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2181
0n3A8Y8SMpuwZx6aoix3ouFlmW8gHRSkeSJ2g7hU+kiHLDaQw3bmRDaTGfTnty7gPm0FHbIBg9U9
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2182
oh1kZzAFLaue2R6htPCtAda2nGlDSUJ4PZBgCJBGVcwKTAMz/vJiLD+Oin5Z5QlvDPdulC6EsiyE
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2183
NFzb7McNTKJzbJqzphx92VKRFY1idenzmq3K0emRcbWBD0ryqc4NZGmKOOOX9Pz5x+/l27tP797c
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2184
f/z0d+4NruGNai8uAM0bfsYaw8itFk8ny41jsfpyO+BWlpqfhcG4yxLdi/0tQqoT4a8Vby382mt8
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2185
p7XSo7aWGdPBc+b6utaBmCQ7rQKQoWtAuthQCiold2KfJIPTT8xwg9blPumc+YDZC/wYGdAyHpJk
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2186
vUbHbHWAp5No6pK/WhhLEWrFjUwtPEv1Agf8YmnsuXUQYkeZoHm8ogP16gt2uHoxcEMdf2C6pmbw
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2187
hUMsWGhanboh4IzzmsIpWs134jVPqD/c74bZHdY69UKKSn/+KfVhxLgUlToemayLMYQOqfEC61bh
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2188
cbhwaqoGUzIyZRFHPmau5juaWqwRn3mpWmoEA5nhzS5gog/5jbcFQqOZvmBasZtwYlG93k5GEiyw
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2189
buHhMWLjDarEGpMGB2LFs5nIJkhp/nUmZneFaRth++lieJtHepIvKgx6PJqIlD9X2j6pG1i9x3pZ
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2190
5bHuCPFiirGHeO7McvoXkz786GaKVzC9DSpnOxJdc4xm6NSVq7lNEnKdVlnpu9BNYoKX2Iq3wvgh
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2191
gGEUM66kK6j4NiyoneuPLSwaCWDxczgaolEWpiMyDVDb7dNuLAbriL8ig8mmeju31oNvQdpnvEPC
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2192
1vAXbWacGRVrGt/uXN/gU0CDDwgooKRrHfTBb1/s9lYZ8ZqOBU0yLvpuP6+K9hLFsvIjeNhBi0KL
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2193
MlOuWRn3FRwx5oHXjl0YImUx0+gLzjGchrgzca026ETmYJzPD+IpuKzNi8AFn048Thd63OdD86M6
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2194
84zE8yQm0VqXdbbgvub2pKVnS76icBGdeTHHXTKspUmr4NYo/furFLKiMdQzFjHJNcdAnMhltBJK
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2195
0/IKX3DVFqvPJ2dLE7bDBkH0l/PJ29074+F0CsGYOxsb7U3myTUncYfXqnLLfa6sJybX4g+hmcjO
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2196
kMRBfA1JellfRRKJcyRpxdS4rIl6FdmQCWjo/o9Qz7yKffoP4JHjOvABcRn4CZIT2RH4jnxmfpVG
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2197
qgLaAvQBNfuO6X0/Ux02nb4FKx3vgP+XnkX0QW9pLy/NsXgdN24dD3LxO2Nwil7Zlc1dqtP3d7/h
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2198
kzp1/+7hGBuY4pk0XD/0Ao/oTe/XGrfyM773aB7iUhgkpy+dwAMalxMP0DrBcsVw/6p25+/hobP9
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2199
GBknrWExDhLJ1bwt1NcCNblaFbMKCyvmX0PeRaQ=
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2200
""")
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2201
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2202
##file distutils.cfg
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2203
DISTUTILS_CFG = convert("""
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2204
eJxNj00KwkAMhfc9xYNuxe4Ft57AjYiUtDO1wXSmNJnK3N5pdSEEAu8nH6lxHVlRhtDHMPATA4uH
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2205
xJ4EFmGbvfJiicSHFRzUSISMY6hq3GLCRLnIvSTnEefN0FIjw5tF0Hkk9Q5dRunBsVoyFi24aaLg
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2206
9FDOlL0FPGluf4QjcInLlxd6f6rqkgPu/5nHLg0cXCscXoozRrP51DRT3j9QNl99AP53T2Q=
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2207
""")
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2208
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2209
##file activate_this.py
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2210
ACTIVATE_THIS = convert("""
653
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2211
eJyNU01v2zAMvetXEB4K21jnDOstQA4dMGCHbeihlyEIDMWmE62yJEiKE//7kXKdpEWLzYBt8evx
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2212
kRSzLPs6wiEoswM8YdMpjUXcq1Dz6RZa1cSiTkJdr86GsoTRHuCotBayiWqQEYGtMCgfD1KjGYBe
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2213
5a3p0cRKiEe2NtLAFikftnDco0ko/SFEVgEZ8aRCZDIPY9xbA8pE9M4jfW/B2CjiHq9zbJVZuOQq
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2214
siwTIvpxKYCembPAU4Muwi/Z4zfvrZ/MXipKeB8C+qisSZYiWfjJfs+0/MFMdWn1hJcO5U7G/SLa
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2215
xVx8zU6VG/PXLXvfsyyzUqjeWR8hjGE+2iCE1W1tQ82hsCJN9dzKaoexyB/uH79TnjwvxcW0ntSb
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2216
yZ8jq1Z5Q1UXsyy3gf9nbjTEj7NzQMfCJa/YSmrQ+2D/BqfiOi6sclrGzvoeVivIj8rcfcmnIQRF
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2217
7XCyeZI7DFe5/lhlCs5PRf5QW66VXT/NrlQ46oD/D6InkOmi3IQcbhKxAX2g4a+Xd5s3UtCtG2py
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2218
m8eg6WYWqR6SL5OjKMGfSrYt/6kxxQtOpeAgj1LXBNmpE2ElmCSIy5H0zFd8gJ924HWijWhb2hRC
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2219
6wNEm1QdDZtuSZcEprIUBo/XRNcbQe1OUbQ/r3hPTaPJJDNtFLu8KHV5XoNr3Eo6h6YtOKw8e8yw
f90aa05732cc upgrade virtualenv
ymh <ymh.work@gmail.com>
parents: 345
diff changeset
  2220
VF5PnJ+ts3a9/Mz38RpG/AUSzYUW
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2221
""")
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2222
345
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2223
MH_MAGIC = 0xfeedface
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2224
MH_CIGAM = 0xcefaedfe
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2225
MH_MAGIC_64 = 0xfeedfacf
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2226
MH_CIGAM_64 = 0xcffaedfe
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2227
FAT_MAGIC = 0xcafebabe
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2228
BIG_ENDIAN = '>'
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2229
LITTLE_ENDIAN = '<'
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2230
LC_LOAD_DYLIB = 0xc
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2231
maxint = majver == 3 and getattr(sys, 'maxsize') or getattr(sys, 'maxint')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2232
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2233
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2234
class fileview(object):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2235
    """
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2236
    A proxy for file-like objects that exposes a given view of a file.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2237
    Modified from macholib.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2238
    """
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2239
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2240
    def __init__(self, fileobj, start=0, size=maxint):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2241
        if isinstance(fileobj, fileview):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2242
            self._fileobj = fileobj._fileobj
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2243
        else:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2244
            self._fileobj = fileobj
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2245
        self._start = start
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2246
        self._end = start + size
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2247
        self._pos = 0
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2248
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2249
    def __repr__(self):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2250
        return '<fileview [%d, %d] %r>' % (
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2251
            self._start, self._end, self._fileobj)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2252
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2253
    def tell(self):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2254
        return self._pos
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2255
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2256
    def _checkwindow(self, seekto, op):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2257
        if not (self._start <= seekto <= self._end):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2258
            raise IOError("%s to offset %d is outside window [%d, %d]" % (
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2259
                op, seekto, self._start, self._end))
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2260
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2261
    def seek(self, offset, whence=0):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2262
        seekto = offset
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2263
        if whence == os.SEEK_SET:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2264
            seekto += self._start
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2265
        elif whence == os.SEEK_CUR:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2266
            seekto += self._start + self._pos
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2267
        elif whence == os.SEEK_END:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2268
            seekto += self._end
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2269
        else:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2270
            raise IOError("Invalid whence argument to seek: %r" % (whence,))
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2271
        self._checkwindow(seekto, 'seek')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2272
        self._fileobj.seek(seekto)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2273
        self._pos = seekto - self._start
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2274
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2275
    def write(self, bytes):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2276
        here = self._start + self._pos
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2277
        self._checkwindow(here, 'write')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2278
        self._checkwindow(here + len(bytes), 'write')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2279
        self._fileobj.seek(here, os.SEEK_SET)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2280
        self._fileobj.write(bytes)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2281
        self._pos += len(bytes)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2282
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2283
    def read(self, size=maxint):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2284
        assert size >= 0
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2285
        here = self._start + self._pos
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2286
        self._checkwindow(here, 'read')
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2287
        size = min(size, self._end - here)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2288
        self._fileobj.seek(here, os.SEEK_SET)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2289
        bytes = self._fileobj.read(size)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2290
        self._pos += len(bytes)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2291
        return bytes
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2292
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2293
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2294
def read_data(file, endian, num=1):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2295
    """
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2296
    Read a given number of 32-bits unsigned integers from the given file
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2297
    with the given endianness.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2298
    """
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2299
    res = struct.unpack(endian + 'L' * num, file.read(num * 4))
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2300
    if len(res) == 1:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2301
        return res[0]
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2302
    return res
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2303
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2304
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2305
def mach_o_change(path, what, value):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2306
    """
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2307
    Replace a given name (what) in any LC_LOAD_DYLIB command found in
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2308
    the given binary with a new name (value), provided it's shorter.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2309
    """
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2310
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2311
    def do_macho(file, bits, endian):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2312
        # Read Mach-O header (the magic number is assumed read by the caller)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2313
        cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags = read_data(file, endian, 6)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2314
        # 64-bits header has one more field.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2315
        if bits == 64:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2316
            read_data(file, endian)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2317
        # The header is followed by ncmds commands
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2318
        for n in range(ncmds):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2319
            where = file.tell()
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2320
            # Read command header
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2321
            cmd, cmdsize = read_data(file, endian, 2)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2322
            if cmd == LC_LOAD_DYLIB:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2323
                # The first data field in LC_LOAD_DYLIB commands is the
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2324
                # offset of the name, starting from the beginning of the
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2325
                # command.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2326
                name_offset = read_data(file, endian)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2327
                file.seek(where + name_offset, os.SEEK_SET)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2328
                # Read the NUL terminated string
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2329
                load = file.read(cmdsize - name_offset).decode()
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2330
                load = load[:load.index('\0')]
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2331
                # If the string is what is being replaced, overwrite it.
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2332
                if load == what:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2333
                    file.seek(where + name_offset, os.SEEK_SET)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2334
                    file.write(value.encode() + '\0'.encode())
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2335
            # Seek to the next command
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2336
            file.seek(where + cmdsize, os.SEEK_SET)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2337
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2338
    def do_file(file, offset=0, size=maxint):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2339
        file = fileview(file, offset, size)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2340
        # Read magic number
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2341
        magic = read_data(file, BIG_ENDIAN)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2342
        if magic == FAT_MAGIC:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2343
            # Fat binaries contain nfat_arch Mach-O binaries
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2344
            nfat_arch = read_data(file, BIG_ENDIAN)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2345
            for n in range(nfat_arch):
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2346
                # Read arch header
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2347
                cputype, cpusubtype, offset, size, align = read_data(file, BIG_ENDIAN, 5)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2348
                do_file(file, offset, size)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2349
        elif magic == MH_MAGIC:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2350
            do_macho(file, 32, BIG_ENDIAN)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2351
        elif magic == MH_CIGAM:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2352
            do_macho(file, 32, LITTLE_ENDIAN)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2353
        elif magic == MH_MAGIC_64:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2354
            do_macho(file, 64, BIG_ENDIAN)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2355
        elif magic == MH_CIGAM_64:
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2356
            do_macho(file, 64, LITTLE_ENDIAN)
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2357
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2358
    assert(len(what) >= len(value))
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2359
    do_file(open(path, 'r+b'))
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2360
7bc38c7d6cf9 update libs + add wsgi interface
ymh <ymh.work@gmail.com>
parents: 272
diff changeset
  2361
266
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2362
if __name__ == '__main__':
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2363
    main()
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2364
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2365
## TODO:
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2366
## Copy python.exe.manifest
825ff4d6a8ac reorganise folders and update venv dependancies (django, etc...)
cavaliet
parents:
diff changeset
  2367
## Monkeypatch distutils.sysconfig