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() |
+ |