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