-
Notifications
You must be signed in to change notification settings - Fork 0
/
rebuild-script.py
69 lines (61 loc) · 1.94 KB
/
rebuild-script.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
"""
Helper script to rebuild virtualenv.py from support-files
"""
import re
import os
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*"""\n(.*?)"""\.decode\("base64"\)\.decode\("zlib"\)\n',
re.S)
file_template = '##file %(filename)s\n%(varname)s = """\n%(data)s""".decode("base64").decode("zlib")\n'
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
f = open(os.path.join(here, 'support-files', filename), '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:
print '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()