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