diff options
Diffstat (limited to 'pkg/releasing/print_rel_notes.py')
-rw-r--r-- | pkg/releasing/print_rel_notes.py | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/pkg/releasing/print_rel_notes.py b/pkg/releasing/print_rel_notes.py new file mode 100644 index 0000000..379d0c0 --- /dev/null +++ b/pkg/releasing/print_rel_notes.py @@ -0,0 +1,144 @@ +# Copyright 2019 The Bazel Authors. All rights reserved. +# +# 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. +"""Print release notes for a package. + +""" + +import argparse +import os +import string +import textwrap + +from pkg.releasing import release_tools + + +def print_notes(org, repo, version, tarball_path, mirror_host=None, + deps_method=None, setup_file=None, toolchains_method=None, + changelog=''): + file_name = os.path.basename(tarball_path) + sha256 = release_tools.get_package_sha256(tarball_path) + + url = 'https://github.com/%s/%s/releases/download/%s/%s' % ( + org, repo, version, file_name) + mirror_url = 'https://%s/github.com/%s/%s/releases/download/%s/%s' % ( + mirror_host, org, repo, version, file_name) if mirror_host else None + workspace_stanza = release_tools.workspace_content( + url, repo, sha256, mirror_url=mirror_url, setup_file=setup_file, + deps_method=deps_method, toolchains_method=toolchains_method) + relnotes_template = string.Template(textwrap.dedent( + """ + ------------------------ snip ---------------------------- + **New Features** + + **Incompatible Changes** + + **Change Log** + ${changelog} + + **MODULE.bazel setup** + + ``` + bazel_dep(name = "${repo}", version = "${version}") + ``` + + **WORKSPACE setup** + + ``` + ${workspace_stanza} + ``` + + **Using the rules** + + See [the source](https://github.com/${org}/${repo}/tree/${version}). + ------------------------ snip ---------------------------- + + """).strip()) + print(relnotes_template.substitute({ + 'changelog': changelog, + 'org': org, + 'repo': repo, + 'version': version, + 'workspace_stanza': workspace_stanza, + })) + if mirror_url: + file = os.path.basename(tarball_path) + path = 'github.com/{org}/{repo}/releases/download/{version}/{file}'.format( + org=org, + repo=repo, + version=version, + file=file + ) + mirroring_template = string.Template(textwrap.dedent( + """ + + !!!: Make sure to copy the file to the release notes. + If you are using Google Cloud Storage, you might use a command like + gsutil cp bazel-bin/distro/${file} gs://bazel-mirror/${path} + gsutil setmeta -h "Cache-Control: public, max-age=31536000" "gs://bazel-mirror/${path}" + """).strip()) + print(mirroring_template.substitute({ + 'org': org, + 'repo': repo, + 'version': version, + 'file': file, + 'path': path, + })) + + +def main(): + parser = argparse.ArgumentParser( + description='Print release notes for a package') + + parser.add_argument( + '--org', default='bazelbuild', help='Github org name') + parser.add_argument( + '--repo', default=None, required=True, help='Repo name') + parser.add_argument( + '--version', default=None, required=True, help='Release version') + parser.add_argument( + '--tarball_path', default=None, + required=True, help='path to release tarball') + parser.add_argument( + '--mirror_host', default=None, + help='If provider, the hostname of a mirror for the download url') + parser.add_argument( + '--setup_file', default=None, + help='Alternate name for setup file. Default: deps.bzl') + parser.add_argument( + '--deps_method', default=None, + help='Alternate name for dependencies method. Default: {repo}_dependencies') + parser.add_argument( + '--toolchains_method', default=None, + help='Alternate name for toolchains method. Default: {repo}_toolchains') + parser.add_argument( + '--changelog', default=None, + help='Pre-fill release notes with changes from this file') + + options = parser.parse_args() + if options.changelog: + with open(options.changelog, 'r', encoding='utf-8') as f: + changelog = f.read() + else: + changelog = 'TBD' + + print_notes(options.org, options.repo, options.version, options.tarball_path, + deps_method=options.deps_method, + changelog=changelog, + mirror_host=options.mirror_host, + setup_file=options.setup_file, + toolchains_method=options.toolchains_method) + + +if __name__ == '__main__': + main() |