xref: /aosp_15_r20/external/aws-sdk-java-v2/scripts/finalize-release-changes (revision 8a52c7834d808308836a99fc2a6e0ed8db339086)
1#!/usr/bin/env python
2
3from __future__ import print_function
4
5import argparse
6import os
7import re
8import shutil
9
10from changelog.git import stage_file
11from changelog.util import load_unreleased_changes, marshall_release_changes, parse_version_string
12
13VERSION_REGEX = re.compile('^[0-9]+\.[0-9]+\.[0-9]+$')
14DATE_REGEX = re.compile('^[0-9]{4}-[0-9]{2}-[0-9]{2}$')
15
16def validate_args(args):
17    if not VERSION_REGEX.match(args.release_version):
18        print("release-version is not in the correct format.")
19    if not DATE_REGEX.match(args.release_date):
20        print("release-date is not in the correct format.")
21
22if __name__ == "__main__":
23    parser = argparse.ArgumentParser(description="Finalize the unrelease changes in .changes/next-release")
24    parser.add_argument('--release-version', '-v', dest='release_version', required=True, help="The version that the changes desrcribe. Must be in the form MAJOR.MINOR.PATCH")
25    parser.add_argument('--release-date', '-d', dest='release_date', required=True, help="The date for the release, in ISO 8601 format (YYYY-MM-DD). Defaults to the current date.")
26    parser.add_argument('--generate-changelog', '-g', dest='generate_changelog_now', action='store_true', help="Generate the change log now.")
27    parser.add_argument('--dry-run', '-r', dest='dry_run', action='store_true', help="Whether it is a dry run to finalize the change log.")
28    args = parser.parse_args()
29
30    validate_args(args)
31
32    next_release = load_unreleased_changes('.changes/next-release')
33    if next_release is None:
34        print("There are no unreleased changes.")
35        exit(0)
36
37    next_release.version = parse_version_string(args.release_version)
38    next_release.date = args.release_date
39
40    next_release_json = marshall_release_changes(next_release)
41
42    filename = ".changes/%s.json" % next_release.version
43
44    if os.path.isfile(filename):
45        print("The file %s already exists!" % filename)
46        exit(1)
47
48    if args.dry_run:
49        print("Dry run succeeded")
50        exit(0)
51
52    with open(filename, 'w') as f:
53        f.write(next_release_json)
54
55    shutil.rmtree('.changes/next-release')
56    stage_file('.changes/')
57
58    if args.generate_changelog_now:
59        from changelog.writer import write_changelog
60        write_changelog()
61