#!/usr/bin/env python
# Copyright (C) 2017 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Generates the text to paste into the email for announcing a new
# release of Gerrit. The text is generated based on a template that
# is filled with values either passed to the script or calculated
# at runtime.
#
# The script outputs a plain text file with the announcement text:
#
#   release-announcement-gerrit-X.Y.txt
#
# and, if GPG is available, the announcement text wrapped with a
# signature:
#
#   release-announcement-gerrit-X.Y.txt.asc
#
# Usage:
#
#   ./tools/release-announcement.py -v 2.14.2 -p 2.14.1 \
#      -s "This release fixes several bugs since 2.14.1"
#
# Parameters:
#
#   --version (-v): The version of Gerrit being released.
#
#   --previous (-p): The previous version of Gerrit.  Optional. If
#   specified, the generated text includes a link to the gitiles
#   log of commits between the previous and new versions.
#
#   --summary (-s): Short summary of the release. Optional. When
#   specified, the summary is inserted in the introductory sentence
#   of the generated text.
#
# Prerequisites:
#
# - The Jinja2 python library [1] must be installed.
#
# - For GPG signing to work, the python-gnupg library [2] must be
#   installed, and the ~/.gnupg folder must exist.
#
# - The war file must have been installed to the local Maven repository
#   using the `./tools/mvn/api.sh war_install` command.
#
# [1] http://jinja.pocoo.org/
# [2] http://pythonhosted.org/gnupg/


from __future__ import print_function
import argparse
import hashlib
import os
import sys
from gnupg import GPG
from jinja2 import Template


class Version:
    def __init__(self, version):
        self.version = version
        self.version_no_rc = version.split("-")[0]
        parts = version.split(".")
        if len(parts) > 2:
            self.major = ".".join(parts[:2])
            self.anchor = self.version_no_rc.replace(".", "")
        else:
            self.major = version
            self.anchor = None

    def __str__(self):
        return self.version


def _main():
    descr = "Generate Gerrit release announcement email text"
    parser = argparse.ArgumentParser(
        description=descr, formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    parser.add_argument(
        "-v",
        "--version",
        dest="version",
        required=True,
        help="gerrit version to release",
    )
    parser.add_argument(
        "-p", "--previous", dest="previous", help="previous gerrit version (optional)"
    )
    parser.add_argument(
        "-s",
        "--summary",
        dest="summary",
        help="summary of the release content (optional)",
    )
    options = parser.parse_args()

    summary = options.summary
    if summary and not summary.endswith("."):
        summary = summary + "."

    data = {
        "version": Version(options.version),
        "previous": options.previous,
        "summary": summary,
    }

    war = os.path.join(
        os.path.expanduser("~/.m2/repository/com/google/gerrit/gerrit-war/"),
        "%(version)s/gerrit-war-%(version)s.war" % data,
    )
    if not os.path.isfile(war):
        print(
            "Could not find war file for Gerrit %s in local Maven repository"
            % data["version"],
            file=sys.stderr,
        )
        sys.exit(1)

    md5 = hashlib.md5()
    sha1 = hashlib.sha1()
    sha256 = hashlib.sha256()
    BUF_SIZE = 65536  # Read data in 64kb chunks
    with open(war, "rb") as f:
        while True:
            d = f.read(BUF_SIZE)
            if not d:
                break
            md5.update(d)
            sha1.update(d)
            sha256.update(d)

    data["sha1"] = sha1.hexdigest()
    data["sha256"] = sha256.hexdigest()
    data["md5"] = md5.hexdigest()

    template_path = os.path.join(
        os.path.dirname(os.path.realpath(__file__)), "release-announcement-template.txt"
    )
    template = Template(open(template_path).read())
    output = template.render(data=data)

    filename = "release-announcement-gerrit-%s.txt" % data["version"]
    with open(filename, "w") as f:
        f.write(output)

    gpghome = os.path.abspath(os.path.expanduser("~/.gnupg"))
    if not os.path.isdir(gpghome):
        print("Skipping signing due to missing gnupg home folder")
    else:
        try:
            gpg = GPG(homedir=gpghome)
        except TypeError:
            gpg = GPG(gnupghome=gpghome)
        signed = gpg.sign(output)
        filename = filename + ".asc"
        with open(filename, "w") as f:
            f.write(str(signed))


if __name__ == "__main__":
    _main()
