distribute_setup.py
author primal primal007@gmail.com
Wed, 14 Sep 2011 15:12:30 +0530
branch2011
changeset 394 9f2a90e36386
parent 389 fe49720e67bf
permissions -rw-r--r--
Reduced the number of days for accomodation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
389
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
     1
#!python
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
     2
"""Bootstrap distribute installation
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
     3
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
     4
If you want to use setuptools in your package's setup.py, just include this
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
     5
file in the same directory with it, and add this to the top of your setup.py::
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
     6
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
     7
    from distribute_setup import use_setuptools
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
     8
    use_setuptools()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
     9
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    10
If you want to require a specific version of setuptools, set a download
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    11
mirror, or use an alternate download directory, you can do so by supplying
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    12
the appropriate options to ``use_setuptools()``.
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    13
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    14
This file can also be run as a script to install or upgrade setuptools.
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    15
"""
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    16
import os
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    17
import sys
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    18
import time
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    19
import fnmatch
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    20
import tempfile
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    21
import tarfile
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    22
from distutils import log
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    23
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    24
try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    25
    from site import USER_SITE
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    26
except ImportError:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    27
    USER_SITE = None
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    28
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    29
try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    30
    import subprocess
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    31
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    32
    def _python_cmd(*args):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    33
        args = (sys.executable,) + args
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    34
        return subprocess.call(args) == 0
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    35
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    36
except ImportError:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    37
    # will be used for python 2.3
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    38
    def _python_cmd(*args):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    39
        args = (sys.executable,) + args
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    40
        # quoting arguments if windows
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    41
        if sys.platform == 'win32':
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    42
            def quote(arg):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    43
                if ' ' in arg:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    44
                    return '"%s"' % arg
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    45
                return arg
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    46
            args = [quote(arg) for arg in args]
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    47
        return os.spawnl(os.P_WAIT, sys.executable, *args) == 0
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    48
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    49
DEFAULT_VERSION = "0.6.21"
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    50
DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/"
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    51
SETUPTOOLS_FAKED_VERSION = "0.6c11"
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    52
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    53
SETUPTOOLS_PKG_INFO = """\
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    54
Metadata-Version: 1.0
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    55
Name: setuptools
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    56
Version: %s
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    57
Summary: xxxx
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    58
Home-page: xxx
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    59
Author: xxx
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    60
Author-email: xxx
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    61
License: xxx
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    62
Description: xxx
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    63
""" % SETUPTOOLS_FAKED_VERSION
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    64
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    65
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    66
def _install(tarball):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    67
    # extracting the tarball
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    68
    tmpdir = tempfile.mkdtemp()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    69
    log.warn('Extracting in %s', tmpdir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    70
    old_wd = os.getcwd()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    71
    try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    72
        os.chdir(tmpdir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    73
        tar = tarfile.open(tarball)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    74
        _extractall(tar)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    75
        tar.close()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    76
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    77
        # going in the directory
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    78
        subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    79
        os.chdir(subdir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    80
        log.warn('Now working in %s', subdir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    81
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    82
        # installing
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    83
        log.warn('Installing Distribute')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    84
        if not _python_cmd('setup.py', 'install'):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    85
            log.warn('Something went wrong during the installation.')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    86
            log.warn('See the error message above.')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    87
    finally:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    88
        os.chdir(old_wd)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    89
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    90
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    91
def _build_egg(egg, tarball, to_dir):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    92
    # extracting the tarball
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    93
    tmpdir = tempfile.mkdtemp()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    94
    log.warn('Extracting in %s', tmpdir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    95
    old_wd = os.getcwd()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    96
    try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    97
        os.chdir(tmpdir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    98
        tar = tarfile.open(tarball)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
    99
        _extractall(tar)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   100
        tar.close()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   101
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   102
        # going in the directory
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   103
        subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   104
        os.chdir(subdir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   105
        log.warn('Now working in %s', subdir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   106
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   107
        # building an egg
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   108
        log.warn('Building a Distribute egg in %s', to_dir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   109
        _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   110
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   111
    finally:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   112
        os.chdir(old_wd)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   113
    # returning the result
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   114
    log.warn(egg)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   115
    if not os.path.exists(egg):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   116
        raise IOError('Could not build the egg.')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   117
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   118
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   119
def _do_download(version, download_base, to_dir, download_delay):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   120
    egg = os.path.join(to_dir, 'distribute-%s-py%d.%d.egg'
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   121
                       % (version, sys.version_info[0], sys.version_info[1]))
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   122
    if not os.path.exists(egg):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   123
        tarball = download_setuptools(version, download_base,
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   124
                                      to_dir, download_delay)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   125
        _build_egg(egg, tarball, to_dir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   126
    sys.path.insert(0, egg)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   127
    import setuptools
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   128
    setuptools.bootstrap_install_from = egg
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   129
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   130
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   131
def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   132
                   to_dir=os.curdir, download_delay=15, no_fake=True):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   133
    # making sure we use the absolute path
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   134
    to_dir = os.path.abspath(to_dir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   135
    was_imported = 'pkg_resources' in sys.modules or \
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   136
        'setuptools' in sys.modules
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   137
    try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   138
        try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   139
            import pkg_resources
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   140
            if not hasattr(pkg_resources, '_distribute'):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   141
                if not no_fake:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   142
                    _fake_setuptools()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   143
                raise ImportError
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   144
        except ImportError:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   145
            return _do_download(version, download_base, to_dir, download_delay)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   146
        try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   147
            pkg_resources.require("distribute>="+version)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   148
            return
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   149
        except pkg_resources.VersionConflict:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   150
            e = sys.exc_info()[1]
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   151
            if was_imported:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   152
                sys.stderr.write(
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   153
                "The required version of distribute (>=%s) is not available,\n"
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   154
                "and can't be installed while this script is running. Please\n"
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   155
                "install a more recent version first, using\n"
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   156
                "'easy_install -U distribute'."
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   157
                "\n\n(Currently using %r)\n" % (version, e.args[0]))
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   158
                sys.exit(2)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   159
            else:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   160
                del pkg_resources, sys.modules['pkg_resources']    # reload ok
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   161
                return _do_download(version, download_base, to_dir,
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   162
                                    download_delay)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   163
        except pkg_resources.DistributionNotFound:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   164
            return _do_download(version, download_base, to_dir,
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   165
                                download_delay)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   166
    finally:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   167
        if not no_fake:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   168
            _create_fake_setuptools_pkg_info(to_dir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   169
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   170
def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   171
                        to_dir=os.curdir, delay=15):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   172
    """Download distribute from a specified location and return its filename
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   173
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   174
    `version` should be a valid distribute version number that is available
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   175
    as an egg for download under the `download_base` URL (which should end
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   176
    with a '/'). `to_dir` is the directory where the egg will be downloaded.
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   177
    `delay` is the number of seconds to pause before an actual download
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   178
    attempt.
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   179
    """
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   180
    # making sure we use the absolute path
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   181
    to_dir = os.path.abspath(to_dir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   182
    try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   183
        from urllib.request import urlopen
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   184
    except ImportError:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   185
        from urllib2 import urlopen
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   186
    tgz_name = "distribute-%s.tar.gz" % version
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   187
    url = download_base + tgz_name
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   188
    saveto = os.path.join(to_dir, tgz_name)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   189
    src = dst = None
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   190
    if not os.path.exists(saveto):  # Avoid repeated downloads
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   191
        try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   192
            log.warn("Downloading %s", url)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   193
            src = urlopen(url)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   194
            # Read/write all in one block, so we don't create a corrupt file
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   195
            # if the download is interrupted.
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   196
            data = src.read()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   197
            dst = open(saveto, "wb")
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   198
            dst.write(data)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   199
        finally:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   200
            if src:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   201
                src.close()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   202
            if dst:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   203
                dst.close()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   204
    return os.path.realpath(saveto)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   205
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   206
def _no_sandbox(function):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   207
    def __no_sandbox(*args, **kw):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   208
        try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   209
            from setuptools.sandbox import DirectorySandbox
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   210
            if not hasattr(DirectorySandbox, '_old'):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   211
                def violation(*args):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   212
                    pass
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   213
                DirectorySandbox._old = DirectorySandbox._violation
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   214
                DirectorySandbox._violation = violation
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   215
                patched = True
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   216
            else:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   217
                patched = False
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   218
        except ImportError:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   219
            patched = False
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   220
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   221
        try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   222
            return function(*args, **kw)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   223
        finally:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   224
            if patched:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   225
                DirectorySandbox._violation = DirectorySandbox._old
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   226
                del DirectorySandbox._old
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   227
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   228
    return __no_sandbox
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   229
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   230
def _patch_file(path, content):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   231
    """Will backup the file then patch it"""
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   232
    existing_content = open(path).read()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   233
    if existing_content == content:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   234
        # already patched
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   235
        log.warn('Already patched.')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   236
        return False
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   237
    log.warn('Patching...')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   238
    _rename_path(path)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   239
    f = open(path, 'w')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   240
    try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   241
        f.write(content)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   242
    finally:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   243
        f.close()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   244
    return True
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   245
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   246
_patch_file = _no_sandbox(_patch_file)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   247
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   248
def _same_content(path, content):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   249
    return open(path).read() == content
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   250
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   251
def _rename_path(path):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   252
    new_name = path + '.OLD.%s' % time.time()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   253
    log.warn('Renaming %s into %s', path, new_name)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   254
    os.rename(path, new_name)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   255
    return new_name
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   256
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   257
def _remove_flat_installation(placeholder):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   258
    if not os.path.isdir(placeholder):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   259
        log.warn('Unkown installation at %s', placeholder)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   260
        return False
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   261
    found = False
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   262
    for file in os.listdir(placeholder):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   263
        if fnmatch.fnmatch(file, 'setuptools*.egg-info'):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   264
            found = True
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   265
            break
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   266
    if not found:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   267
        log.warn('Could not locate setuptools*.egg-info')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   268
        return
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   269
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   270
    log.warn('Removing elements out of the way...')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   271
    pkg_info = os.path.join(placeholder, file)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   272
    if os.path.isdir(pkg_info):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   273
        patched = _patch_egg_dir(pkg_info)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   274
    else:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   275
        patched = _patch_file(pkg_info, SETUPTOOLS_PKG_INFO)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   276
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   277
    if not patched:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   278
        log.warn('%s already patched.', pkg_info)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   279
        return False
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   280
    # now let's move the files out of the way
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   281
    for element in ('setuptools', 'pkg_resources.py', 'site.py'):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   282
        element = os.path.join(placeholder, element)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   283
        if os.path.exists(element):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   284
            _rename_path(element)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   285
        else:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   286
            log.warn('Could not find the %s element of the '
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   287
                     'Setuptools distribution', element)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   288
    return True
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   289
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   290
_remove_flat_installation = _no_sandbox(_remove_flat_installation)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   291
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   292
def _after_install(dist):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   293
    log.warn('After install bootstrap.')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   294
    placeholder = dist.get_command_obj('install').install_purelib
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   295
    _create_fake_setuptools_pkg_info(placeholder)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   296
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   297
def _create_fake_setuptools_pkg_info(placeholder):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   298
    if not placeholder or not os.path.exists(placeholder):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   299
        log.warn('Could not find the install location')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   300
        return
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   301
    pyver = '%s.%s' % (sys.version_info[0], sys.version_info[1])
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   302
    setuptools_file = 'setuptools-%s-py%s.egg-info' % \
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   303
            (SETUPTOOLS_FAKED_VERSION, pyver)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   304
    pkg_info = os.path.join(placeholder, setuptools_file)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   305
    if os.path.exists(pkg_info):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   306
        log.warn('%s already exists', pkg_info)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   307
        return
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   308
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   309
    log.warn('Creating %s', pkg_info)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   310
    f = open(pkg_info, 'w')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   311
    try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   312
        f.write(SETUPTOOLS_PKG_INFO)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   313
    finally:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   314
        f.close()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   315
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   316
    pth_file = os.path.join(placeholder, 'setuptools.pth')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   317
    log.warn('Creating %s', pth_file)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   318
    f = open(pth_file, 'w')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   319
    try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   320
        f.write(os.path.join(os.curdir, setuptools_file))
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   321
    finally:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   322
        f.close()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   323
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   324
_create_fake_setuptools_pkg_info = _no_sandbox(_create_fake_setuptools_pkg_info)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   325
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   326
def _patch_egg_dir(path):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   327
    # let's check if it's already patched
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   328
    pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   329
    if os.path.exists(pkg_info):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   330
        if _same_content(pkg_info, SETUPTOOLS_PKG_INFO):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   331
            log.warn('%s already patched.', pkg_info)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   332
            return False
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   333
    _rename_path(path)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   334
    os.mkdir(path)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   335
    os.mkdir(os.path.join(path, 'EGG-INFO'))
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   336
    pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   337
    f = open(pkg_info, 'w')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   338
    try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   339
        f.write(SETUPTOOLS_PKG_INFO)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   340
    finally:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   341
        f.close()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   342
    return True
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   343
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   344
_patch_egg_dir = _no_sandbox(_patch_egg_dir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   345
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   346
def _before_install():
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   347
    log.warn('Before install bootstrap.')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   348
    _fake_setuptools()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   349
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   350
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   351
def _under_prefix(location):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   352
    if 'install' not in sys.argv:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   353
        return True
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   354
    args = sys.argv[sys.argv.index('install')+1:]
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   355
    for index, arg in enumerate(args):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   356
        for option in ('--root', '--prefix'):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   357
            if arg.startswith('%s=' % option):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   358
                top_dir = arg.split('root=')[-1]
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   359
                return location.startswith(top_dir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   360
            elif arg == option:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   361
                if len(args) > index:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   362
                    top_dir = args[index+1]
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   363
                    return location.startswith(top_dir)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   364
        if arg == '--user' and USER_SITE is not None:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   365
            return location.startswith(USER_SITE)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   366
    return True
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   367
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   368
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   369
def _fake_setuptools():
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   370
    log.warn('Scanning installed packages')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   371
    try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   372
        import pkg_resources
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   373
    except ImportError:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   374
        # we're cool
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   375
        log.warn('Setuptools or Distribute does not seem to be installed.')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   376
        return
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   377
    ws = pkg_resources.working_set
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   378
    try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   379
        setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools',
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   380
                                  replacement=False))
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   381
    except TypeError:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   382
        # old distribute API
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   383
        setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools'))
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   384
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   385
    if setuptools_dist is None:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   386
        log.warn('No setuptools distribution found')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   387
        return
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   388
    # detecting if it was already faked
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   389
    setuptools_location = setuptools_dist.location
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   390
    log.warn('Setuptools installation detected at %s', setuptools_location)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   391
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   392
    # if --root or --preix was provided, and if
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   393
    # setuptools is not located in them, we don't patch it
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   394
    if not _under_prefix(setuptools_location):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   395
        log.warn('Not patching, --root or --prefix is installing Distribute'
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   396
                 ' in another location')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   397
        return
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   398
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   399
    # let's see if its an egg
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   400
    if not setuptools_location.endswith('.egg'):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   401
        log.warn('Non-egg installation')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   402
        res = _remove_flat_installation(setuptools_location)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   403
        if not res:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   404
            return
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   405
    else:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   406
        log.warn('Egg installation')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   407
        pkg_info = os.path.join(setuptools_location, 'EGG-INFO', 'PKG-INFO')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   408
        if (os.path.exists(pkg_info) and
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   409
            _same_content(pkg_info, SETUPTOOLS_PKG_INFO)):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   410
            log.warn('Already patched.')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   411
            return
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   412
        log.warn('Patching...')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   413
        # let's create a fake egg replacing setuptools one
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   414
        res = _patch_egg_dir(setuptools_location)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   415
        if not res:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   416
            return
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   417
    log.warn('Patched done.')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   418
    _relaunch()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   419
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   420
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   421
def _relaunch():
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   422
    log.warn('Relaunching...')
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   423
    # we have to relaunch the process
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   424
    # pip marker to avoid a relaunch bug
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   425
    if sys.argv[:3] == ['-c', 'install', '--single-version-externally-managed']:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   426
        sys.argv[0] = 'setup.py'
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   427
    args = [sys.executable] + sys.argv
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   428
    sys.exit(subprocess.call(args))
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   429
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   430
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   431
def _extractall(self, path=".", members=None):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   432
    """Extract all members from the archive to the current working
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   433
       directory and set owner, modification time and permissions on
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   434
       directories afterwards. `path' specifies a different directory
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   435
       to extract to. `members' is optional and must be a subset of the
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   436
       list returned by getmembers().
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   437
    """
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   438
    import copy
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   439
    import operator
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   440
    from tarfile import ExtractError
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   441
    directories = []
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   442
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   443
    if members is None:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   444
        members = self
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   445
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   446
    for tarinfo in members:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   447
        if tarinfo.isdir():
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   448
            # Extract directories with a safe mode.
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   449
            directories.append(tarinfo)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   450
            tarinfo = copy.copy(tarinfo)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   451
            tarinfo.mode = 448 # decimal for oct 0700
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   452
        self.extract(tarinfo, path)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   453
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   454
    # Reverse sort directories.
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   455
    if sys.version_info < (2, 4):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   456
        def sorter(dir1, dir2):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   457
            return cmp(dir1.name, dir2.name)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   458
        directories.sort(sorter)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   459
        directories.reverse()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   460
    else:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   461
        directories.sort(key=operator.attrgetter('name'), reverse=True)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   462
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   463
    # Set correct owner, mtime and filemode on directories.
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   464
    for tarinfo in directories:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   465
        dirpath = os.path.join(path, tarinfo.name)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   466
        try:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   467
            self.chown(tarinfo, dirpath)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   468
            self.utime(tarinfo, dirpath)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   469
            self.chmod(tarinfo, dirpath)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   470
        except ExtractError:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   471
            e = sys.exc_info()[1]
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   472
            if self.errorlevel > 1:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   473
                raise
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   474
            else:
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   475
                self._dbg(1, "tarfile: %s" % e)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   476
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   477
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   478
def main(argv, version=DEFAULT_VERSION):
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   479
    """Install or upgrade setuptools and EasyInstall"""
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   480
    tarball = download_setuptools()
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   481
    _install(tarball)
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   482
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   483
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   484
if __name__ == '__main__':
fe49720e67bf Modified the registration file
primal primal007@gmail.com
parents:
diff changeset
   485
    main(sys.argv[1:])