|
|
|
# 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))
|