blob: fd19ac022e89841c654936f83bee282e6adeb287 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2019 The Dart project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This tool is used to get a list of Dart SDK revisions which have been rolled
# into the flutter/engine repository on GitHub. Revisions are printed in reverse
# chronological order along with the merge date and link to the PR created for
# the roll.
#
# This tool requires the following setup to work:
# - Run `pip install PyGithub` to install PyGithub (github)
# - Set the GITHUB_API_KEY environment variable to a Github personal access
# token (see https://github.com/settings/tokens).
from github import Github
import argparse
import os
DART_REVISION_PATCH_STR = "+ 'dart_revision'"
DART_SDK_ROLL = 'Roll src/third_party/dart'
GITHUB_API_KEY = os.getenv('GITHUB_API_KEY')
# Control codes for coloured terminal output.
CGREEN = '\033[92m'
CEND = '\033[0m'
def get_revision_from_patch(patch):
revision_line_list = [x for x in patch.splitlines()
if DART_REVISION_PATCH_STR in x]
assert(len(revision_line_list) == 1)
revision_line = revision_line_list[0]
return revision_line.split()[-1][:-1].replace("'","")
def print_output(revision, pull):
msg = CGREEN + 'SDK Revision: ' + CEND
msg += revision + CGREEN + ' Merged At: ' + CEND
msg += str(pull.merged_at) + CGREEN + ' PR: ' + CEND + pull.html_url
print(msg)
def main():
parser = argparse.ArgumentParser(description='Get Dart SDK revisions which ' +
'have been rolled into flutter/engine from ' +
'GitHub.')
parser.add_argument('--github-api-key', help='The GitHub API key to be used ' +
'for querying the flutter/engine pull requests. Defaults' +
' to the "GITHUB_API_KEY" environment variable if this ' +
'option is not provided.')
parser.add_argument('--max-revisions', help='The maximum number of revisions ' +
'of Dart SDKs which have been rolled into flutter/engine ' +
'to return (default: 10).', default=10, type=int)
args = parser.parse_args()
github_api_key = args.github_api_key
if not github_api_key:
github_api_key = GITHUB_API_KEY
max_revisions = args.max_revisions
revision_count = 0
github = Github(github_api_key)
github_engine_repo = github.get_repo('flutter/engine')
pulls = github_engine_repo.get_pulls(state='closed',
sort='created',
direction='desc')
for pull in pulls:
if DART_SDK_ROLL in pull.title and pull.merged:
# Get the last commit from the PR. Automated SDK rolls shouldn't have many
# commits in their PRs, so this shouldn't be too expensive.
commit = [c for c in pull.get_commits()][-1]
for f in commit.files:
if f.filename == 'DEPS':
print_output(get_revision_from_patch(f.patch), pull)
revision_count += 1
if revision_count == max_revisions:
return
break
if __name__ == '__main__':
main()