prefix.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/usr/bin/env python2
  2. # This script replaces prefixes of files, and symbols in that file.
  3. # Useful for creating different versions of the codebase that don't
  4. # conflict at compile time.
  5. #
  6. # example:
  7. # $ ./scripts/prefix.py lfs2
  8. import os
  9. import os.path
  10. import re
  11. import glob
  12. import itertools
  13. import tempfile
  14. import shutil
  15. import subprocess
  16. DEFAULT_PREFIX = "lfs"
  17. def subn(from_prefix, to_prefix, name):
  18. name, count1 = re.subn('\\b'+from_prefix, to_prefix, name)
  19. name, count2 = re.subn('\\b'+from_prefix.upper(), to_prefix.upper(), name)
  20. name, count3 = re.subn('\\B-D'+from_prefix.upper(),
  21. '-D'+to_prefix.upper(), name)
  22. return name, count1+count2+count3
  23. def main(from_prefix, to_prefix=None, files=None):
  24. if not to_prefix:
  25. from_prefix, to_prefix = DEFAULT_PREFIX, from_prefix
  26. if not files:
  27. files = subprocess.check_output([
  28. 'git', 'ls-tree', '-r', '--name-only', 'HEAD']).split()
  29. for oldname in files:
  30. # Rename any matching file names
  31. newname, namecount = subn(from_prefix, to_prefix, oldname)
  32. if namecount:
  33. subprocess.check_call(['git', 'mv', oldname, newname])
  34. # Rename any prefixes in file
  35. count = 0
  36. with open(newname+'~', 'w') as tempf:
  37. with open(newname) as newf:
  38. for line in newf:
  39. line, n = subn(from_prefix, to_prefix, line)
  40. count += n
  41. tempf.write(line)
  42. shutil.copystat(newname, newname+'~')
  43. os.rename(newname+'~', newname)
  44. subprocess.check_call(['git', 'add', newname])
  45. # Summary
  46. print '%s: %d replacements' % (
  47. '%s -> %s' % (oldname, newname) if namecount else oldname,
  48. count)
  49. if __name__ == "__main__":
  50. import sys
  51. sys.exit(main(*sys.argv[1:]))