#!/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()