1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!python
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver"""Bootstrap setuptools installation
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIf you want to use setuptools in your package's setup.py, just include this
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfile in the same directory with it, and add this to the top of your setup.py::
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    from ez_setup import use_setuptools
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    use_setuptools()
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
10324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIf you want to require a specific version of setuptools, set a download
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermirror, or use an alternate download directory, you can do so by supplying
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverthe appropriate options to ``use_setuptools()``.
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
14324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverThis file can also be run as a script to install or upgrade setuptools.
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver"""
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport sys
17324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverDEFAULT_VERSION = "0.6c5"
18324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverDEFAULT_URL     = "http://cheeseshop.python.org/packages/%s/s/setuptools/" % sys.version[:3]
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermd5_data = {
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport sys, os
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef _validate_md5(egg_name, data):
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if egg_name in md5_data:
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        from md5 import md5
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        digest = md5(data).hexdigest()
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if digest != md5_data[egg_name]:
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            print >>sys.stderr, (
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                "md5 validation of %s failed!  (Possible download problem?)"
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                % egg_name
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            sys.exit(2)
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return data
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef use_setuptools(
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    download_delay=15
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver):
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Automatically find/download setuptools and make it available on sys.path
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    `version` should be a valid setuptools version number that is available
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    as an egg for download under the `download_base` URL (which should end with
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a '/').  `to_dir` is the directory where setuptools will be downloaded, if
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    it is not already available.  If `download_delay` is specified, it should
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    be the number of seconds that will be paused before initiating a download,
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    should one be required.  If an older version of setuptools is installed,
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    this routine will print a message to ``sys.stderr`` and raise SystemExit in
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    an attempt to abort the calling script.
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    try:
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import setuptools
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if setuptools.__version__ == '0.0.1':
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            print >>sys.stderr, (
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "You have an obsolete version of setuptools installed.  Please\n"
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "remove it from your system entirely before rerunning this script."
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            sys.exit(2)
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    except ImportError:
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        egg = download_setuptools(version, download_base, to_dir, download_delay)
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        sys.path.insert(0, egg)
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import setuptools; setuptools.bootstrap_install_from = egg
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    import pkg_resources
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    try:
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pkg_resources.require("setuptools>="+version)
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    except pkg_resources.VersionConflict, e:
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # XXX could we install in a subprocess here?
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        print >>sys.stderr, (
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "The required version of setuptools (>=%s) is not available, and\n"
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "can't be installed while this script is running. Please install\n"
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            " a more recent version first.\n\n(Currently using %r)"
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ) % (version, e.args[0])
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        sys.exit(2)
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef download_setuptools(
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    delay = 15
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver):
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Download setuptools from a specified location and return its filename
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    `version` should be a valid setuptools version number that is available
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    as an egg for download under the `download_base` URL (which should end
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    with a '/'). `to_dir` is the directory where the egg will be downloaded.
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    `delay` is the number of seconds to pause before an actual download attempt.
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    import urllib2, shutil
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    url = download_base + egg_name
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    saveto = os.path.join(to_dir, egg_name)
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    src = dst = None
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if not os.path.exists(saveto):  # Avoid repeated downloads
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try:
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            from distutils import log
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if delay:
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                log.warn("""
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver---------------------------------------------------------------------------
122324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverThis script requires setuptools version %s to run (even to display
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhelp).  I will attempt to download it for you (from
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver%s), but
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveryou may need to enable firewall access for this script first.
126324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverI will start the download in %d seconds.
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(Note: if this machine does not have network access, please obtain the file
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver   %s
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverand place it in this directory before rerunning this script.)
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver---------------------------------------------------------------------------""",
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    version, download_base, delay, url
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ); from time import sleep; sleep(delay)
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            log.warn("Downloading %s", url)
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            src = urllib2.urlopen(url)
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # Read/write all in one block, so we don't create a corrupt file
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # if the download is interrupted.
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            data = _validate_md5(egg_name, src.read())
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            dst = open(saveto,"wb"); dst.write(data)
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        finally:
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if src: src.close()
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if dst: dst.close()
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return os.path.realpath(saveto)
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef main(argv, version=DEFAULT_VERSION):
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Install or upgrade setuptools and EasyInstall"""
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    try:
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        import setuptools
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    except ImportError:
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        egg = None
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try:
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            egg = download_setuptools(version, delay=0)
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            sys.path.insert(0,egg)
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            from setuptools.command.easy_install import main
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return main(list(argv)+[egg])   # we're done here
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        finally:
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if egg and os.path.exists(egg):
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                os.unlink(egg)
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else:
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if setuptools.__version__ == '0.0.1':
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            # tell the user to uninstall obsolete version
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            use_setuptools(version)
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    req = "setuptools>="+version
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    import pkg_resources
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    try:
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        pkg_resources.require(req)
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    except pkg_resources.VersionConflict:
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        try:
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            from setuptools.command.easy_install import main
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        except ImportError:
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            from easy_install import main
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        main(list(argv)+[download_setuptools(delay=0)])
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        sys.exit(0) # try to force an exit
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else:
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if argv:
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            from setuptools.command.easy_install import main
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            main(argv)
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else:
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            print "Setuptools version",version,"or greater has been installed."
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdef update_md5(filenames):
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    """Update our built-in md5 registry"""
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    import re
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    from md5 import md5
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for name in filenames:
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        base = os.path.basename(name)
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        f = open(name,'rb')
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        md5_data[base] = md5(f.read()).hexdigest()
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        f.close()
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    data = ["    %r: %r,\n" % it for it in md5_data.items()]
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    data.sort()
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    repl = "".join(data)
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    import inspect
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    srcfile = inspect.getsourcefile(sys.modules[__name__])
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    f = open(srcfile, 'rb'); src = f.read(); f.close()
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    match = re.search("\nmd5_data = {\n([^}]+)}", src)
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if not match:
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        print >>sys.stderr, "Internal error!"
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        sys.exit(2)
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    src = src[:match.start(1)] + repl + src[match.end(1):]
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    f = open(srcfile,'w')
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    f.write(src)
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    f.close()
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__=='__main__':
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if len(sys.argv)>2 and sys.argv[1]=='--md5update':
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        update_md5(sys.argv[2:])
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else:
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        main(sys.argv[1:])
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
229