diff --git a/src/tools/publish_toolstate.py b/src/tools/publish_toolstate.py index 0d4a755551a..f97914b1e97 100755 --- a/src/tools/publish_toolstate.py +++ b/src/tools/publish_toolstate.py @@ -17,8 +17,14 @@ import collections import textwrap try: import urllib2 + from urllib2 import HTTPError except ImportError: import urllib.request as urllib2 + from urllib.error import HTTPError +try: + import typing +except ImportError: + pass # List of people to ping when the status of a tool or a book changed. # These should be collaborators of the rust-lang/rust repository (with at least @@ -63,20 +69,23 @@ REPOS = { } def load_json_from_response(resp): + # type: (typing.Any) -> typing.Any content = resp.read() if isinstance(content, bytes): - content = content.decode('utf-8') + content_str = content.decode('utf-8') else: print("Refusing to decode " + str(type(content)) + " to str") - return json.loads(content) + return json.loads(content_str) def validate_maintainers(repo, github_token): + # type: (str, str) -> None '''Ensure all maintainers are assignable on a GitHub repo''' next_link_re = re.compile(r'<([^>]+)>; rel="next"') # Load the list of assignable people in the GitHub repo - assignable = [] - url = 'https://api.github.com/repos/%s/collaborators?per_page=100' % repo + assignable = [] # type: typing.List[str] + url = 'https://api.github.com/repos/' \ + + '%s/collaborators?per_page=100' % repo # type: typing.Optional[str] while url is not None: response = urllib2.urlopen(urllib2.Request(url, headers={ 'Authorization': 'token ' + github_token, @@ -116,9 +125,10 @@ def validate_maintainers(repo, github_token): def read_current_status(current_commit, path): + # type: (str, str) -> typing.Mapping[str, typing.Any] '''Reads build status of `current_commit` from content of `history/*.tsv` ''' - with open(path, 'rU') as f: + with open(path, 'r') as f: for line in f: (commit, status) = line.split('\t', 1) if commit == current_commit: @@ -127,10 +137,12 @@ def read_current_status(current_commit, path): def gh_url(): + # type: () -> str return os.environ['TOOLSTATE_ISSUES_API_URL'] def maybe_delink(message): + # type: (str) -> str if os.environ.get('TOOLSTATE_SKIP_MENTIONS') is not None: return message.replace("@", "") return message @@ -143,8 +155,10 @@ def issue( relevant_pr_number, relevant_pr_user, labels, + github_token, ): - # Open an issue about the toolstate failure. + # type: (str, str, typing.Iterable[str], str, str, typing.List[str], str) -> None + '''Open an issue about the toolstate failure.''' if status == 'test-fail': status_description = 'has failing tests' else: @@ -168,7 +182,7 @@ def issue( print("Creating issue:\n{}".format(request)) response = urllib2.urlopen(urllib2.Request( gh_url(), - request, + request.encode(), { 'Authorization': 'token ' + github_token, 'Content-Type': 'application/json', @@ -183,8 +197,10 @@ def update_latest( relevant_pr_url, relevant_pr_user, pr_reviewer, - current_datetime + current_datetime, + github_token, ): + # type: (str, str, str, str, str, str, str) -> str '''Updates `_data/latest.json` to match build result of the given commit. ''' with open('_data/latest.json', 'r+') as f: @@ -243,13 +259,14 @@ def update_latest( if create_issue_for_status is not None: try: issue( - tool, create_issue_for_status, MAINTAINERS.get(tool, ''), - relevant_pr_number, relevant_pr_user, LABELS.get(tool, ''), + tool, create_issue_for_status, MAINTAINERS.get(tool, ()), + relevant_pr_number, relevant_pr_user, LABELS.get(tool, []), + github_token, ) - except urllib2.HTTPError as e: + except HTTPError as e: # network errors will simply end up not creating an issue, but that's better # than failing the entire build job - print("HTTPError when creating issue for status regression: {0}\n{1}" + print("HTTPError when creating issue for status regression: {0}\n{1!r}" .format(e, e.read())) except IOError as e: print("I/O error when creating issue for status regression: {0}".format(e)) @@ -318,7 +335,8 @@ try: relevant_pr_url, relevant_pr_user, pr_reviewer, - cur_datetime + cur_datetime, + github_token, ) if not message: print('') @@ -337,13 +355,13 @@ try: issue_url = gh_url() + '/{}/comments'.format(number) response = urllib2.urlopen(urllib2.Request( issue_url, - json.dumps({'body': maybe_delink(message)}), + json.dumps({'body': maybe_delink(message)}).encode(), { 'Authorization': 'token ' + github_token, 'Content-Type': 'application/json', } )) response.read() -except urllib2.HTTPError as e: - print("HTTPError: %s\n%s" % (e, e.read())) +except HTTPError as e: + print("HTTPError: %s\n%r" % (e, e.read())) raise