1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#!python
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# This file was obtained from:
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#   http://peak.telecommunity.com/dist/ez_setup.py
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# on 2009/4/17.
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""Bootstrap setuptools installation
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleIf you want to use setuptools in your package's setup.py, just include this
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefile in the same directory with it, and add this to the top of your setup.py::
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    from ez_setup import use_setuptools
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    use_setuptools()
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleIf you want to require a specific version of setuptools, set a download
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillemirror, or use an alternate download directory, you can do so by supplying
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillethe appropriate options to ``use_setuptools()``.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleThis file can also be run as a script to install or upgrade setuptools.
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport sys
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFAULT_VERSION = "0.6c9"
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFAULT_URL     = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillemd5_data = {
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport sys, os
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletry: from hashlib import md5
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleexcept ImportError: from md5 import md5
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef _validate_md5(egg_name, data):
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if egg_name in md5_data:
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        digest = md5(data).hexdigest()
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if digest != md5_data[egg_name]:
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            print >>sys.stderr, (
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                "md5 validation of %s failed!  (Possible download problem?)"
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                % egg_name
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            )
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            sys.exit(2)
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return data
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef use_setuptools(
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    download_delay=15
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville):
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Automatically find/download setuptools and make it available on sys.path
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    `version` should be a valid setuptools version number that is available
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    as an egg for download under the `download_base` URL (which should end with
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    a '/').  `to_dir` is the directory where setuptools will be downloaded, if
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    it is not already available.  If `download_delay` is specified, it should
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    be the number of seconds that will be paused before initiating a download,
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    should one be required.  If an older version of setuptools is installed,
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    this routine will print a message to ``sys.stderr`` and raise SystemExit in
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    an attempt to abort the calling script.
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    def do_download():
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        egg = download_setuptools(version, download_base, to_dir, download_delay)
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        sys.path.insert(0, egg)
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        import setuptools; setuptools.bootstrap_install_from = egg
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    try:
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        import pkg_resources
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    except ImportError:
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        return do_download()
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    try:
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        pkg_resources.require("setuptools>="+version); return
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    except pkg_resources.VersionConflict, e:
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if was_imported:
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            print >>sys.stderr, (
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "The required version of setuptools (>=%s) is not available, and\n"
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "can't be installed while this script is running. Please install\n"
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            " a more recent version first, using 'easy_install -U setuptools'."
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "\n\n(Currently using %r)"
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            ) % (version, e.args[0])
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            sys.exit(2)
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        else:
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            del pkg_resources, sys.modules['pkg_resources']    # reload ok
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            return do_download()
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    except pkg_resources.DistributionNotFound:
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        return do_download()
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef download_setuptools(
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    delay = 15
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville):
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Download setuptools from a specified location and return its filename
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    `version` should be a valid setuptools version number that is available
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    as an egg for download under the `download_base` URL (which should end
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    with a '/'). `to_dir` is the directory where the egg will be downloaded.
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    `delay` is the number of seconds to pause before an actual download attempt.
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    import urllib2, shutil
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    url = download_base + egg_name
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    saveto = os.path.join(to_dir, egg_name)
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    src = dst = None
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if not os.path.exists(saveto):  # Avoid repeated downloads
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        try:
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            from distutils import log
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            if delay:
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                log.warn("""
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville---------------------------------------------------------------------------
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleThis script requires setuptools version %s to run (even to display
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillehelp).  I will attempt to download it for you (from
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville%s), but
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleyou may need to enable firewall access for this script first.
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleI will start the download in %d seconds.
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville(Note: if this machine does not have network access, please obtain the file
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   %s
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleand place it in this directory before rerunning this script.)
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville---------------------------------------------------------------------------""",
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    version, download_base, delay, url
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                ); from time import sleep; sleep(delay)
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            log.warn("Downloading %s", url)
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            src = urllib2.urlopen(url)
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            # Read/write all in one block, so we don't create a corrupt file
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            # if the download is interrupted.
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            data = _validate_md5(egg_name, src.read())
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            dst = open(saveto,"wb"); dst.write(data)
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        finally:
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            if src: src.close()
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            if dst: dst.close()
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return os.path.realpath(saveto)
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef main(argv, version=DEFAULT_VERSION):
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Install or upgrade setuptools and EasyInstall"""
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    try:
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        import setuptools
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    except ImportError:
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        egg = None
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        try:
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            egg = download_setuptools(version, delay=0)
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            sys.path.insert(0,egg)
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            from setuptools.command.easy_install import main
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            return main(list(argv)+[egg])   # we're done here
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        finally:
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            if egg and os.path.exists(egg):
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                os.unlink(egg)
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    else:
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if setuptools.__version__ == '0.0.1':
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            print >>sys.stderr, (
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "You have an obsolete version of setuptools installed.  Please\n"
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "remove it from your system entirely before rerunning this script."
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            )
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            sys.exit(2)
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    req = "setuptools>="+version
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    import pkg_resources
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    try:
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        pkg_resources.require(req)
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    except pkg_resources.VersionConflict:
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        try:
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            from setuptools.command.easy_install import main
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        except ImportError:
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            from easy_install import main
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        main(list(argv)+[download_setuptools(delay=0)])
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        sys.exit(0) # try to force an exit
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    else:
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if argv:
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            from setuptools.command.easy_install import main
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            main(argv)
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        else:
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            print "Setuptools version",version,"or greater has been installed."
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef update_md5(filenames):
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Update our built-in md5 registry"""
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    import re
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for name in filenames:
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        base = os.path.basename(name)
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        f = open(name,'rb')
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        md5_data[base] = md5(f.read()).hexdigest()
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        f.close()
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    data = ["    %r: %r,\n" % it for it in md5_data.items()]
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    data.sort()
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    repl = "".join(data)
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    import inspect
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    srcfile = inspect.getsourcefile(sys.modules[__name__])
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    f = open(srcfile, 'rb'); src = f.read(); f.close()
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    match = re.search("\nmd5_data = {\n([^}]+)}", src)
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if not match:
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        print >>sys.stderr, "Internal error!"
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        sys.exit(2)
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    src = src[:match.start(1)] + repl + src[match.end(1):]
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    f = open(srcfile,'w')
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    f.write(src)
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    f.close()
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif __name__=='__main__':
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if len(sys.argv)>2 and sys.argv[1]=='--md5update':
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        update_md5(sys.argv[2:])
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    else:
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        main(sys.argv[1:])
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
282