#Run this file after automatic conversion of the VisualStudio 2008 solution by VisualStudio 2010.
#This can be done whenever the 2008 solution changes.
#It will make the necessary cleanup and updates to the vcxproj files
#the .props files need to be maintained by hand if the .vsprops files change

from __future__ import with_statement
import sys
import os
import os.path

def vs9to10(src, dest):
    for name in os.listdir(src):
        path, ext = os.path.splitext(name)
        if ext.lower() not in ('.vcxproj',):
            continue

        filename = os.path.normpath(os.path.join(src, name))
        destname = os.path.normpath(os.path.join(dest, name))
        print("%s -> %s" % (filename, destname))

        lines = []
        lastline = b""
        importgroup = False
        with open(filename, 'rb') as fin:
            for line in fin:
                #remove redundant linker output info
                if b"<OutputLine>" in line:
                    continue
                if b"<ProgramDatabaseFile>" in line:
                    continue
                if b"<ImportLibrary>" in line and b"</ImportLibrary>" in line:
                    continue

                #add new property sheet to the pythoncore
                if importgroup and "pythoncore" in name.lower():
                    if b"</ImportGroup>" in line:
                        if b"debug.props" in lastline:
                            lines.append(b'    <Import Project="pythoncore_d.props" />\r\n')
                        elif b"pythoncore" not in lastline:
                            lines.append(b'    <Import Project="pythoncore.props" />\r\n')
                if b"<ImportGroup Condition" in line:
                    importgroup = True
                elif b"</ImportGroup>" in line:
                    importgroup = False
                lines.append(line)
                lastline = line
        with open(destname, 'wb') as fout:
            for line in lines:
                fout.write(line)

if __name__ == "__main__":
    src = "." if len(sys.argv) < 2 else sys.argv[1]
    name = os.path.basename(os.path.abspath(src))
    dest = os.path.abspath(os.path.join(src, "..", name + "Upd"))
    os.makedirs(dest)
    vs9to10(src, dest)
