rebuild-script.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/env python
  2. """
  3. Helper script to rebuild virtualenv.py from virtualenv_support
  4. """
  5. import re
  6. import os
  7. import sys
  8. here = os.path.dirname(__file__)
  9. script = os.path.join(here, '..', 'virtualenv.py')
  10. file_regex = re.compile(
  11. r'##file (.*?)\n([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*convert\("""(.*?)"""\)',
  12. re.S)
  13. file_template = '##file %(filename)s\n%(varname)s = convert("""\n%(data)s""")'
  14. def rebuild():
  15. f = open(script, 'rb')
  16. content = f.read()
  17. f.close()
  18. parts = []
  19. last_pos = 0
  20. match = None
  21. for match in file_regex.finditer(content):
  22. parts.append(content[last_pos:match.start()])
  23. last_pos = match.end()
  24. filename = match.group(1)
  25. varname = match.group(2)
  26. data = match.group(3)
  27. print('Found reference to file %s' % filename)
  28. pathname = os.path.join(here, '..', 'virtualenv_embedded', filename)
  29. f = open(pathname, 'rb')
  30. c = f.read()
  31. f.close()
  32. new_data = c.encode('zlib').encode('base64')
  33. if new_data == data:
  34. print(' Reference up to date (%s bytes)' % len(c))
  35. parts.append(match.group(0))
  36. continue
  37. print(' Content changed (%s bytes -> %s bytes)' % (
  38. zipped_len(data), len(c)))
  39. new_match = file_template % dict(
  40. filename=filename,
  41. varname=varname,
  42. data=new_data)
  43. parts.append(new_match)
  44. parts.append(content[last_pos:])
  45. new_content = ''.join(parts)
  46. if new_content != content:
  47. sys.stdout.write('Content updated; overwriting... ')
  48. f = open(script, 'wb')
  49. f.write(new_content)
  50. f.close()
  51. print('done.')
  52. else:
  53. print('No changes in content')
  54. if match is None:
  55. print('No variables were matched/found')
  56. def zipped_len(data):
  57. if not data:
  58. return 'no data'
  59. try:
  60. return len(data.decode('base64').decode('zlib'))
  61. except:
  62. return 'unknown'
  63. if __name__ == '__main__':
  64. rebuild()