# 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. """Main function for releasing.""" import argparse import os from github.changelog import Changelog from github.git import Git from github.pull_request import PullRequest from github.user import User def get_changelog(access_token: str, milestone: str) -> str: """Get changelog in specific milestone from GitHub Restful API.""" pr = PullRequest(token=access_token) pr_merged = pr.search_merged_by_milestone(milestone) # Sort according to merged time ascending pr_merged_sort = sorted(pr_merged, key=lambda p: p["closed_at"]) changelog = Changelog(pr_merged_sort) changelog_text = changelog.generate() return changelog_text def get_contributor(access_token: str, milestone: str) -> str: """Get contributor in specific milestone from GitHub Restful API.""" pr = PullRequest(token=access_token) pr_merged = pr.search_merged_by_milestone(milestone) users = User(prs=pr_merged) contributor = users.contributors() # Sort according alphabetical return ", ".join(sorted(contributor)) def auto_cherry_pick(access_token: str, milestone: str) -> None: """Do git cherry-pick in specific milestone, require update dev branch.""" pr = PullRequest(token=access_token) pr_merged = pr.search_merged_by_milestone(milestone) # Sort according to merged time ascending pr_merged_sort = sorted(pr_merged, key=lambda p: p["closed_at"]) for p in pr_merged_sort: pr_detail = pr.get_merged_detail(p["number"]) print(f"git cherry-pick -x {pr_detail['merge_commit_sha']}") Git().cherry_pick_pr(pr_detail) def build_argparse() -> argparse.ArgumentParser: """Build argparse.ArgumentParser with specific configuration.""" parser = argparse.ArgumentParser(prog="release") subparsers = parser.add_subparsers( title="subcommands", dest="subcommand", help="Choose one of the subcommand you want to run.", ) parser_check = subparsers.add_parser( "changelog", help="Generate changelog from specific milestone." ) parser_check.set_defaults(func=get_changelog) parser_prune = subparsers.add_parser( "contributor", help="List all contributors from specific milestone." ) parser_prune.set_defaults(func=get_contributor) parser_prune = subparsers.add_parser( "cherry-pick", help="Auto cherry pick pr to current branch from specific milestone.", ) parser_prune.set_defaults(func=auto_cherry_pick) return parser if __name__ == "__main__": arg_parser = build_argparse() # args = arg_parser.parse_args(["changelog"]) args = arg_parser.parse_args() ENV_ACCESS_TOKEN = os.environ.get("GH_ACCESS_TOKEN", None) ENV_MILESTONE = os.environ.get("GH_REPO_MILESTONE", None) if ENV_ACCESS_TOKEN is None or ENV_MILESTONE is None: raise RuntimeError( "Environment variable `GH_ACCESS_TOKEN` and `GH_REPO_MILESTONE` must provider" ) if not hasattr(args, "func"): arg_parser.print_help() exit(1) print(args.func(ENV_ACCESS_TOKEN, ENV_MILESTONE))