#!/usr/bin/env python

# This script replaces prefixes of files, and symbols in that file.
# Useful for creating different versions of the codebase that don't
# conflict at compile time.
#
# example:
# $ ./scripts/prefix.py lfs12

import os
import os.path
import re
import glob
import itertools
import tempfile
import shutil
import subprocess

DEFAULT_PREFIX = "lfs1"

def subn(from_prefix, to_prefix, name):
    name, count1 = re.subn('\\b'+from_prefix, to_prefix, name)
    name, count2 = re.subn('\\b'+from_prefix.upper(), to_prefix.upper(), name)
    name, count3 = re.subn('\\B-D'+from_prefix.upper(),
            '-D'+to_prefix.upper(), name)
    return name, count1+count2+count3

def main(from_prefix, to_prefix=None, files=None):
    if not to_prefix:
        from_prefix, to_prefix = DEFAULT_PREFIX, from_prefix

    if not files:
        files = subprocess.check_output([
                'git', 'ls-tree', '-r', '--name-only', 'HEAD']).split()

    for oldname in files:
        # Rename any matching file names
        newname, namecount = subn(from_prefix, to_prefix, oldname)
        if namecount:
            subprocess.check_call(['git', 'mv', oldname, newname])

        # Rename any prefixes in file
        count = 0
        with open(newname+'~', 'w') as tempf:
            with open(newname) as newf:
                for line in newf:
                    line, n = subn(from_prefix, to_prefix, line)
                    count += n
                    tempf.write(line)
        shutil.copystat(newname, newname+'~')
        os.rename(newname+'~', newname)
        subprocess.check_call(['git', 'add', newname])

        # Summary
        print '%s: %d replacements' % (
                '%s -> %s' % (oldname, newname) if namecount else oldname,
                count)

if __name__ == "__main__":
    import sys
    sys.exit(main(*sys.argv[1:]))
