| Index: bootstrap/virtualenv/bin/rebuild-script.py | 
| diff --git a/bootstrap/virtualenv/bin/rebuild-script.py b/bootstrap/virtualenv/bin/rebuild-script.py | 
| new file mode 100755 | 
| index 0000000000000000000000000000000000000000..44fb1296e5a4eccc1ff6de670b91018ca79b7307 | 
| --- /dev/null | 
| +++ b/bootstrap/virtualenv/bin/rebuild-script.py | 
| @@ -0,0 +1,71 @@ | 
| +#!/usr/bin/env python | 
| +""" | 
| +Helper script to rebuild virtualenv.py from virtualenv_support | 
| +""" | 
| + | 
| +import re | 
| +import os | 
| +import sys | 
| + | 
| +here = os.path.dirname(__file__) | 
| +script = os.path.join(here, '..', 'virtualenv.py') | 
| + | 
| +file_regex = re.compile( | 
| +    r'##file (.*?)\n([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*convert\("""(.*?)"""\)', | 
| +    re.S) | 
| +file_template = '##file %(filename)s\n%(varname)s = convert("""\n%(data)s""")' | 
| + | 
| +def rebuild(): | 
| +    f = open(script, 'rb') | 
| +    content = f.read() | 
| +    f.close() | 
| +    parts = [] | 
| +    last_pos = 0 | 
| +    match = None | 
| +    for match in file_regex.finditer(content): | 
| +        parts.append(content[last_pos:match.start()]) | 
| +        last_pos = match.end() | 
| +        filename = match.group(1) | 
| +        varname = match.group(2) | 
| +        data = match.group(3) | 
| +        print('Found reference to file %s' % filename) | 
| +        pathname = os.path.join(here, '..', 'virtualenv_embedded', filename) | 
| +        f = open(pathname, 'rb') | 
| +        c = f.read() | 
| +        f.close() | 
| +        new_data = c.encode('zlib').encode('base64') | 
| +        if new_data == data: | 
| +            print('  Reference up to date (%s bytes)' % len(c)) | 
| +            parts.append(match.group(0)) | 
| +            continue | 
| +        print('  Content changed (%s bytes -> %s bytes)' % ( | 
| +            zipped_len(data), len(c))) | 
| +        new_match = file_template % dict( | 
| +            filename=filename, | 
| +            varname=varname, | 
| +            data=new_data) | 
| +        parts.append(new_match) | 
| +    parts.append(content[last_pos:]) | 
| +    new_content = ''.join(parts) | 
| +    if new_content != content: | 
| +        sys.stdout.write('Content updated; overwriting... ') | 
| +        f = open(script, 'wb') | 
| +        f.write(new_content) | 
| +        f.close() | 
| +        print('done.') | 
| +    else: | 
| +        print('No changes in content') | 
| +    if match is None: | 
| +        print('No variables were matched/found') | 
| + | 
| +def zipped_len(data): | 
| +    if not data: | 
| +        return 'no data' | 
| +    try: | 
| +        return len(data.decode('base64').decode('zlib')) | 
| +    except: | 
| +        return 'unknown' | 
| + | 
| +if __name__ == '__main__': | 
| +    rebuild() | 
| + | 
|  |