#! /usr/bin/env python
"""Update version numbers and release dates for the next release.

usage: release.py version date

version should be a string like "3.2.0c1"
date should be a string like "23-Sep-2003"

The following files are updated:
    - setup.py
    - NEWS.txt
    - docs/guide/zodb.tex
    - src/ZEO/__init__.py
    - src/ZEO/version.txt
    - src/ZODB/__init__.py
"""

import fileinput
import os
import re

# In file filename, replace the first occurrence of regexp pat with
# string repl.
def replace(filename, pat, repl):
    from sys import stderr as e # fileinput hijacks sys.stdout
    foundone = False
    for line in fileinput.input([filename], inplace=True, backup="~"):
        if foundone:
            print line,
        else:
            match = re.search(pat, line)
            if match is not None:
                foundone = True

                new = re.sub(pat, repl, line)
                print new,

                print >> e, "In %s, replaced:" % filename
                print >> e, "   ", repr(line)
                print >> e, "   ", repr(new)

            else:
                print line,

    if not foundone:
        print >> e, "*" * 60, "Oops!"
        print >> e, "    Failed to find %r in %r" % (pat, filename)

# Nothing in our codebase cares about ZEO/version.txt.  Jeremy said
# someone asked for it so that a shell script could read up the ZEO
# version easily.
# Before ZODB 3.4, the ZEO version was one smaller than the ZODB version;
# e.g., ZEO 2.2.7 shipped with ZODB 3.2.7.  Now ZEO and ZODB share their
# version number.
def write_zeoversion(path, version):
    f = open(path, "w")
    print >> f, version
    f.close()

def main(args):
    version, date = args

    replace("setup.py",
            r'^VERSION = "\S+"$',
            'VERSION = "%s"' % version)
    replace("src/ZODB/__init__.py",
            r'__version__ = "\S+"',
            '__version__ = "%s"' % version)
    replace("src/ZEO/__init__.py",
            r'version = "\S+"',
            'version = "%s"' % version)
    write_zeoversion("src/ZEO/version.txt", version)
    replace("NEWS.txt",
            r"^Release date: .*",
            "Release date: %s" % date)
    replace("docs/guide/zodb.tex",
            r"release{\S+}",
            "release{%s}" % version)
if __name__ == "__main__":
    import sys
    main(sys.argv[1:])
