python/virtualenv/bin/rebuild-script.py

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/python/virtualenv/bin/rebuild-script.py	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,71 @@
     1.4 +#!/usr/bin/env python
     1.5 +"""
     1.6 +Helper script to rebuild virtualenv.py from virtualenv_support
     1.7 +"""
     1.8 +
     1.9 +import re
    1.10 +import os
    1.11 +import sys
    1.12 +
    1.13 +here = os.path.dirname(__file__)
    1.14 +script = os.path.join(here, '..', 'virtualenv.py')
    1.15 +
    1.16 +file_regex = re.compile(
    1.17 +    r'##file (.*?)\n([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*convert\("""(.*?)"""\)',
    1.18 +    re.S)
    1.19 +file_template = '##file %(filename)s\n%(varname)s = convert("""\n%(data)s""")'
    1.20 +
    1.21 +def rebuild():
    1.22 +    f = open(script, 'rb')
    1.23 +    content = f.read()
    1.24 +    f.close()
    1.25 +    parts = []
    1.26 +    last_pos = 0
    1.27 +    match = None
    1.28 +    for match in file_regex.finditer(content):
    1.29 +        parts.append(content[last_pos:match.start()])
    1.30 +        last_pos = match.end()
    1.31 +        filename = match.group(1)
    1.32 +        varname = match.group(2)
    1.33 +        data = match.group(3)
    1.34 +        print('Found reference to file %s' % filename)
    1.35 +        pathname = os.path.join(here, '..', 'virtualenv_embedded', filename)
    1.36 +        f = open(pathname, 'rb')
    1.37 +        c = f.read()
    1.38 +        f.close()
    1.39 +        new_data = c.encode('zlib').encode('base64')
    1.40 +        if new_data == data:
    1.41 +            print('  Reference up to date (%s bytes)' % len(c))
    1.42 +            parts.append(match.group(0))
    1.43 +            continue
    1.44 +        print('  Content changed (%s bytes -> %s bytes)' % (
    1.45 +            zipped_len(data), len(c)))
    1.46 +        new_match = file_template % dict(
    1.47 +            filename=filename,
    1.48 +            varname=varname,
    1.49 +            data=new_data)
    1.50 +        parts.append(new_match)
    1.51 +    parts.append(content[last_pos:])
    1.52 +    new_content = ''.join(parts)
    1.53 +    if new_content != content:
    1.54 +        sys.stdout.write('Content updated; overwriting... ')
    1.55 +        f = open(script, 'wb')
    1.56 +        f.write(new_content)
    1.57 +        f.close()
    1.58 +        print('done.')
    1.59 +    else:
    1.60 +        print('No changes in content')
    1.61 +    if match is None:
    1.62 +        print('No variables were matched/found')
    1.63 +
    1.64 +def zipped_len(data):
    1.65 +    if not data:
    1.66 +        return 'no data'
    1.67 +    try:
    1.68 +        return len(data.decode('base64').decode('zlib'))
    1.69 +    except:
    1.70 +        return 'unknown'
    1.71 +
    1.72 +if __name__ == '__main__':
    1.73 +    rebuild()
    1.74 +    

mercurial