#! /usr/bin/env python

import os
import re
import sys

try:
    __file__
except NameError:
    __file__ = sys.argv[0]

tools = os.path.dirname(os.path.abspath(__file__))
Doc = os.path.dirname(tools)
src = os.path.dirname(Doc)
patchlevel_h = os.path.join(src, "Include", "patchlevel.h")

# This won't pick out all #defines, but it will pick up the ones we
# care about.
rx = re.compile(r"\s*#define\s+([a-zA-Z][a-zA-Z_0-9]*)\s+([a-zA-Z_0-9]+)")

d = {}
f = open(patchlevel_h)
for line in f:
    m = rx.match(line)
    if m is not None:
        name, value = m.group(1, 2)
        d[name] = value
f.close()

release = "%s.%s" % (d["PY_MAJOR_VERSION"], d["PY_MINOR_VERSION"])
micro = int(d["PY_MICRO_VERSION"])
shortversion = release
if micro != 0:
    release += "." + str(micro)
level = d["PY_RELEASE_LEVEL"]

suffixes = {
    "PY_RELEASE_LEVEL_ALPHA": "a",
    "PY_RELEASE_LEVEL_BETA":  "b",
    "PY_RELEASE_LEVEL_GAMMA": "c",
    }

releaseinfo = ""
if level != "PY_RELEASE_LEVEL_FINAL":
    releaseinfo = suffixes[level] + str(int(d["PY_RELEASE_SERIAL"]))

def write_file(name, text):
    """Write text to a file if the file doesn't exist or if text
    differs from any existing content."""
    if os.path.exists(name):
        f = open(name, "r")
        s = f.read()
        f.close()
        if s == text:
            return
    f = open(name, "w")
    f.write(text)
    f.close()

patchlevel_tex = os.path.join(Doc, "commontex", "patchlevel.tex")

write_file(patchlevel_tex,
           "%% This file is generated by ../tools/getversioninfo;\n"
           "%% do not edit manually.\n"
           "\n"
           "\\release{%s}\n"
           "\\setreleaseinfo{%s}\n"
           "\\setshortversion{%s}\n"
           % (release, releaseinfo, shortversion))

print(release + releaseinfo)
