#!/usr/bin/python
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#

from generate import *

template = \
"""
;;
;; Licensed to the Apache Software Foundation (ASF) under one
;; or more contributor license agreements.  See the NOTICE file
;; distributed with this work for additional information
;; regarding copyright ownership.  The ASF licenses this file
;; to you 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.
;;

# Qpid JMS {release} Release Notes

Qpid JMS is a complete [Jakarta Messaging](https://jakarta.ee/specifications/messaging/) {api_version}
client built using the [Qpid Proton]({{{{site_url}}}}/proton/index.html) protocol engine.

For more information about this release, including download links and
documentation, see the [release overview](index.html).

{release_notes}
"""

def gen_release_notes(release, issues_release, release_dir):
    output_path = join(release_dir, "release-notes.md")

    release_notes = render_release_notes("qpidjms", issues_release)

    api_version = "3.1"
    if release.startswith("1."):
      api_version = 2.0
    elif release.startswith("0."):
      api_version = 2.0

    output = template.format(**locals())
    output = output.strip()

    write(output_path, output)

release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()

if release == "main":
    notice("Skipping generation for main branch")
    exit()

gen_release_notes(release, issues_release, release_dir)

notice("Release notes generated")
