import sys
import re
import argparse

args = None
gitver = dict()

def warn(msg):
    sys.stderr.write('{0}: warning: {1}\n'.format(sys.argv[0], msg))

def load_gitver():
    with open(args.gitver, 'r') as f:
        for line in f:
            a = line.rstrip('\n').split(' ')
            if len(a) != 3 or a[1] != 'commit':
                sys.stderr.write('invalid git_versions.txt line: '+line)
            gitver[a[0]] = a[2]

def rewrite_manifest(out):
    projectexp = re.compile('\s*<project .*>\s*')
    pathexp = re.compile(' path="([^"]*)"')
    with open(args.manifest, 'r') as f:
        for line in f:
            if projectexp.match(line):
                pathm = pathexp.search(line)
                if pathm:
                    path = pathm.group(1)
                    if path in gitver:
                        line = re.sub(' revision="', ' upstream="', line)
                        line = re.sub('(\s*/?>\s*)$',
                                      ' revision="'+gitver[path]+'"\\1',
                                      line)
                        del gitver[path]
                    else:
                        warn('unknown project {0} in manifest'.format(
                                repr(path)))
            out.write(line)
    if len(gitver) > 0:
        warn('extra projects {0} in gitver'.format(
                repr(gitver.keys())))

def main():
    global args
    parser = argparse.ArgumentParser()
    parser.add_argument('manifest', type=str,
                        help='XML manifest file name')
    parser.add_argument('gitver', type=str,
                        help='Replicant git_versions.txt file name')
    args = parser.parse_args()
    load_gitver()
    rewrite_manifest(sys.stdout)

if __name__ == '__main__':
    main()
