{"action":"created","comment":{"url":"https://api.github.com/repos/apple/swift/pulls/comments/137713020","pull_request_review_id":61416243,"id":137713020,"diff_hunk":"@@ -0,0 +1,225 @@\n+#!/usr/bin/python\n+#\n+# ==-- jobstats - support for reading the contents of stats dirs --==#\n+#\n+# This source file is part of the Swift.org open source project\n+#\n+# Copyright (c) 2014-2017 Apple Inc. and the Swift project authors\n+# Licensed under Apache License v2.0 with Runtime Library Exception\n+#\n+# See https://swift.org/LICENSE.txt for license information\n+# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors\n+#\n+# ==------------------------------------------------------------------------==#\n+#\n+# This file contains subroutines for loading object-representations of one or\n+# more directories generated by `swiftc -stats-output-dir`.\n+\n+import datetime\n+import itertools\n+import json\n+import os\n+import random\n+import re\n+\n+\n+class JobStats:\n+    \"\"\"Object holding the stats of a single job run during a compilation,\n+    corresponding to a single JSON file produced by a single job process\n+    passed -stats-output-dir.\"\"\"\n+\n+    def __init__(self, jobkind, jobid, module, start_usec, dur_usec,\n+                 jobargs, stats):\n+        self.jobkind = jobkind\n+        self.jobid = jobid\n+        self.module = module\n+        self.start_usec = start_usec\n+        self.dur_usec = dur_usec\n+        self.jobargs = jobargs\n+        self.stats = stats\n+\n+    def is_driver_job(self):\n+        \"\"\"Return true iff self measures a driver job\"\"\"\n+        return self.jobkind == 'driver'\n+\n+    def is_frontend_job(self):\n+        \"\"\"Return true iff self measures a frontend job\"\"\"\n+        return self.jobkind == 'frontend'\n+\n+    def driver_jobs_ran(self):\n+        \"\"\"Return the count of a driver job's ran sub-jobs\"\"\"\n+        assert(self.is_driver_job())\n+        return self.stats.get(\"Driver.NumDriverJobsRun\", 0)\n+\n+    def driver_jobs_skipped(self):\n+        \"\"\"Return the count of a driver job's skipped sub-jobs\"\"\"\n+        assert(self.is_driver_job())\n+        return self.stats.get(\"Driver.NumDriverJobsSkipped\", 0)\n+\n+    def driver_jobs_total(self):\n+        \"\"\"Return the total count of a driver job's ran + skipped sub-jobs\"\"\"\n+        assert(self.is_driver_job())\n+        return self.driver_jobs_ran() + self.driver_jobs_skipped()\n+\n+    def merged_with(self, other):\n+        \"\"\"Return a new JobStats, holding the merger of self and other\"\"\"\n+        merged_stats = {}\n+        for k, v in self.stats.items() + other.stats.items():\n+            merged_stats[k] = v + merged_stats.get(k, 0.0)\n+        merged_kind = self.jobkind\n+        if other.jobkind != merged_kind:\n+            merged_kind = \"<merged>\"\n+        merged_module = self.module\n+        if other.module != merged_module:\n+            merged_module = \"<merged>\"\n+        merged_start = min(self.start_usec, other.start_usec)\n+        merged_end = max(self.start_usec + self.dur_usec,\n+                         other.start_usec + other.dur_usec)\n+        merged_dur = merged_end - merged_start\n+        return JobStats(merged_kind, random.randint(0, 1000000000),\n+                        merged_module, merged_start, merged_dur,\n+                        self.jobargs + other.jobargs, merged_stats)\n+\n+    def prefixed_by(self, prefix):\n+        prefixed_stats = dict([((prefix + \".\" + k), v)\n+                               for (k, v) in self.stats.items()])\n+        return JobStats(self.jobkind, random.randint(0, 1000000000),\n+                        self.module, self.start_usec, self.dur_usec,\n+                        self.jobargs, prefixed_stats)\n+\n+    def incrementality_percentage(self):\n+        \"\"\"Assuming the job is a driver job, return the amount of\n+        jobs that actually ran, as a percentage of the total number.\"\"\"\n+        assert(self.is_driver_job())\n+        ran = self.driver_jobs_ran()\n+        total = self.driver_jobs_total()\n+        return round((float(ran) / float(total)) * 100.0, 2)\n+\n+    def to_catapult_trace_obj(self):\n+        \"\"\"Return a JSON-formattable object fitting chrome's\n+        'catapult' trace format\"\"\"\n+        return {\"name\": self.module,\n+                \"cat\": self.jobkind,\n+                \"ph\": \"X\",              # \"X\" == \"complete event\"\n+                \"pid\": self.jobid,\n+                \"tid\": 1,\n+                \"ts\": self.start_usec,\n+                \"dur\": self.dur_usec,\n+                \"args\": self.jobargs}\n+\n+    def start_timestr(self):\n+        \"\"\"Return a formatted timestamp of the job's start-time\"\"\"\n+        t = datetime.datetime.fromtimestamp(self.start_usec / 1000000.0)\n+        return t.strftime(\"%Y-%m-%d %H:%M:%S\")\n+\n+    def end_timestr(self):\n+        \"\"\"Return a formatted timestamp of the job's end-time\"\"\"\n+        t = datetime.datetime.fromtimestamp((self.start_usec +\n+                                             self.dur_usec) / 1000000.0)\n+        return t.strftime(\"%Y-%m-%d %H:%M:%S\")\n+\n+    def pick_lnt_metric_suffix(self, metric_name):\n+        \"\"\"Guess an appropriate LNT metric type for a given metric name\"\"\"\n+        if \"BytesOutput\" in metric_name:\n+            return \"code_size\"\n+        if \"RSS\" in metric_name or \"BytesAllocated\" in metric_name:\n+            return \"mem\"\n+        return \"compile\"\n+\n+    def to_lnt_test_obj(self, args):\n+        \"\"\"Return a JSON-formattable object fitting LNT's 'submit' format\"\"\"\n+        run_info = {\n+            \"run_order\": str(args.lnt_order),\n+            \"tag\": str(args.lnt_tag),\n+        }\n+        run_info.update(dict(args.lnt_run_info))\n+        stats = self.stats\n+        return {\n+            \"Machine\":\n+            {\n+                \"Name\": args.lnt_machine,\n+                \"Info\": dict(args.lnt_machine_info)\n+            },\n+            \"Run\":\n+            {\n+                \"Start Time\": self.start_timestr(),\n+                \"End Time\": self.end_timestr(),\n+                \"Info\": run_info\n+            },\n+            \"Tests\":\n+            [\n+                {\n+                    \"Data\": [v],\n+                    \"Info\": {},\n+                    \"Name\": \"%s.%s.%s.%s\" % (args.lnt_tag, self.module,\n+                                             k, self.pick_lnt_metric_suffix(k))\n+                }\n+                for (k, v) in stats.items()\n+            ]\n+        }\n+\n+\n+def load_stats_dir(path, select_module=[]):\n+    \"\"\"Loads all stats-files found in path into a list of JobStats objects\"\"\"\n+    jobstats = []\n+    auxpat = (r\"(?P<module>[^-]+)-(?P<input>[^-]+)-(?P<triple>[^-]+)\" +\n+              r\"-(?P<out>[^-]+)-(?P<opt>[^-]+)\")\n+    fpat = (r\"^stats-(?P<start>\\d+)-swift-(?P<kind>\\w+)-\" +\n+            auxpat +\n+            r\"-(?P<pid>\\d+)(-.*)?.json$\")\n+    for root, dirs, files in os.walk(path):\n+        for f in files:\n+            m = re.match(fpat, f)","path":"utils/jobstats/jobstats.py","position":172,"original_position":172,"commit_id":"bc09276f7f929073cdacaf4255c3ab9c0a98797b","original_commit_id":"bc09276f7f929073cdacaf4255c3ab9c0a98797b","user":{"login":"graydon","id":14097,"avatar_url":"https://avatars3.githubusercontent.com/u/14097?v=4","gravatar_id":"","url":"https://api.github.com/users/graydon","html_url":"https://github.com/graydon","followers_url":"https://api.github.com/users/graydon/followers","following_url":"https://api.github.com/users/graydon/following{/other_user}","gists_url":"https://api.github.com/users/graydon/gists{/gist_id}","starred_url":"https://api.github.com/users/graydon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/graydon/subscriptions","organizations_url":"https://api.github.com/users/graydon/orgs","repos_url":"https://api.github.com/users/graydon/repos","events_url":"https://api.github.com/users/graydon/events{/privacy}","received_events_url":"https://api.github.com/users/graydon/received_events","type":"User","site_admin":false},"body":"sure","created_at":"2017-09-08T05:45:18Z","updated_at":"2017-09-08T05:45:18Z","html_url":"https://github.com/apple/swift/pull/11815#discussion_r137713020","pull_request_url":"https://api.github.com/repos/apple/swift/pulls/11815","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/apple/swift/pulls/comments/137713020"},"html":{"href":"https://github.com/apple/swift/pull/11815#discussion_r137713020"},"pull_request":{"href":"https://api.github.com/repos/apple/swift/pulls/11815"}},"in_reply_to_id":137711506},"pull_request":{"url":"https://api.github.com/repos/apple/swift/pulls/11815","id":139955312,"html_url":"https://github.com/apple/swift/pull/11815","diff_url":"https://github.com/apple/swift/pull/11815.diff","patch_url":"https://github.com/apple/swift/pull/11815.patch","issue_url":"https://api.github.com/repos/apple/swift/issues/11815","number":11815,"state":"open","locked":false,"title":"Process stats dir refactor and enhancements","user":{"login":"graydon","id":14097,"avatar_url":"https://avatars3.githubusercontent.com/u/14097?v=4","gravatar_id":"","url":"https://api.github.com/users/graydon","html_url":"https://github.com/graydon","followers_url":"https://api.github.com/users/graydon/followers","following_url":"https://api.github.com/users/graydon/following{/other_user}","gists_url":"https://api.github.com/users/graydon/gists{/gist_id}","starred_url":"https://api.github.com/users/graydon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/graydon/subscriptions","organizations_url":"https://api.github.com/users/graydon/orgs","repos_url":"https://api.github.com/users/graydon/repos","events_url":"https://api.github.com/users/graydon/events{/privacy}","received_events_url":"https://api.github.com/users/graydon/received_events","type":"User","site_admin":false},"body":"Factors some of the code for reading stats-dirs out of process-stats-dir.py so it can be used by other scripts. Also adds a couple new features for grouping, selecting, and immediate comparison to process-stats-dir.py (steps towards satisfying user feedback as in rdar://33973414)","created_at":"2017-09-08T04:55:52Z","updated_at":"2017-09-08T05:45:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b2849d9360e2ec9d4aa9b3c9444dc1f5885125f1","assignee":null,"assignees":[],"requested_reviewers":[{"login":"ematejska","id":15254638,"avatar_url":"https://avatars0.githubusercontent.com/u/15254638?v=4","gravatar_id":"","url":"https://api.github.com/users/ematejska","html_url":"https://github.com/ematejska","followers_url":"https://api.github.com/users/ematejska/followers","following_url":"https://api.github.com/users/ematejska/following{/other_user}","gists_url":"https://api.github.com/users/ematejska/gists{/gist_id}","starred_url":"https://api.github.com/users/ematejska/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ematejska/subscriptions","organizations_url":"https://api.github.com/users/ematejska/orgs","repos_url":"https://api.github.com/users/ematejska/repos","events_url":"https://api.github.com/users/ematejska/events{/privacy}","received_events_url":"https://api.github.com/users/ematejska/received_events","type":"User","site_admin":false},{"login":"eeckstein","id":15270291,"avatar_url":"https://avatars0.githubusercontent.com/u/15270291?v=4","gravatar_id":"","url":"https://api.github.com/users/eeckstein","html_url":"https://github.com/eeckstein","followers_url":"https://api.github.com/users/eeckstein/followers","following_url":"https://api.github.com/users/eeckstein/following{/other_user}","gists_url":"https://api.github.com/users/eeckstein/gists{/gist_id}","starred_url":"https://api.github.com/users/eeckstein/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eeckstein/subscriptions","organizations_url":"https://api.github.com/users/eeckstein/orgs","repos_url":"https://api.github.com/users/eeckstein/repos","events_url":"https://api.github.com/users/eeckstein/events{/privacy}","received_events_url":"https://api.github.com/users/eeckstein/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/apple/swift/pulls/11815/commits","review_comments_url":"https://api.github.com/repos/apple/swift/pulls/11815/comments","review_comment_url":"https://api.github.com/repos/apple/swift/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apple/swift/issues/11815/comments","statuses_url":"https://api.github.com/repos/apple/swift/statuses/bc09276f7f929073cdacaf4255c3ab9c0a98797b","head":{"label":"graydon:process-stats-dir-refactor","ref":"process-stats-dir-refactor","sha":"bc09276f7f929073cdacaf4255c3ab9c0a98797b","user":{"login":"graydon","id":14097,"avatar_url":"https://avatars3.githubusercontent.com/u/14097?v=4","gravatar_id":"","url":"https://api.github.com/users/graydon","html_url":"https://github.com/graydon","followers_url":"https://api.github.com/users/graydon/followers","following_url":"https://api.github.com/users/graydon/following{/other_user}","gists_url":"https://api.github.com/users/graydon/gists{/gist_id}","starred_url":"https://api.github.com/users/graydon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/graydon/subscriptions","organizations_url":"https://api.github.com/users/graydon/orgs","repos_url":"https://api.github.com/users/graydon/repos","events_url":"https://api.github.com/users/graydon/events{/privacy}","received_events_url":"https://api.github.com/users/graydon/received_events","type":"User","site_admin":false},"repo":{"id":66865548,"name":"swift","full_name":"graydon/swift","owner":{"login":"graydon","id":14097,"avatar_url":"https://avatars3.githubusercontent.com/u/14097?v=4","gravatar_id":"","url":"https://api.github.com/users/graydon","html_url":"https://github.com/graydon","followers_url":"https://api.github.com/users/graydon/followers","following_url":"https://api.github.com/users/graydon/following{/other_user}","gists_url":"https://api.github.com/users/graydon/gists{/gist_id}","starred_url":"https://api.github.com/users/graydon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/graydon/subscriptions","organizations_url":"https://api.github.com/users/graydon/orgs","repos_url":"https://api.github.com/users/graydon/repos","events_url":"https://api.github.com/users/graydon/events{/privacy}","received_events_url":"https://api.github.com/users/graydon/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/graydon/swift","description":"The Swift Programming Language","fork":true,"url":"https://api.github.com/repos/graydon/swift","forks_url":"https://api.github.com/repos/graydon/swift/forks","keys_url":"https://api.github.com/repos/graydon/swift/keys{/key_id}","collaborators_url":"https://api.github.com/repos/graydon/swift/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/graydon/swift/teams","hooks_url":"https://api.github.com/repos/graydon/swift/hooks","issue_events_url":"https://api.github.com/repos/graydon/swift/issues/events{/number}","events_url":"https://api.github.com/repos/graydon/swift/events","assignees_url":"https://api.github.com/repos/graydon/swift/assignees{/user}","branches_url":"https://api.github.com/repos/graydon/swift/branches{/branch}","tags_url":"https://api.github.com/repos/graydon/swift/tags","blobs_url":"https://api.github.com/repos/graydon/swift/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/graydon/swift/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/graydon/swift/git/refs{/sha}","trees_url":"https://api.github.com/repos/graydon/swift/git/trees{/sha}","statuses_url":"https://api.github.com/repos/graydon/swift/statuses/{sha}","languages_url":"https://api.github.com/repos/graydon/swift/languages","stargazers_url":"https://api.github.com/repos/graydon/swift/stargazers","contributors_url":"https://api.github.com/repos/graydon/swift/contributors","subscribers_url":"https://api.github.com/repos/graydon/swift/subscribers","subscription_url":"https://api.github.com/repos/graydon/swift/subscription","commits_url":"https://api.github.com/repos/graydon/swift/commits{/sha}","git_commits_url":"https://api.github.com/repos/graydon/swift/git/commits{/sha}","comments_url":"https://api.github.com/repos/graydon/swift/comments{/number}","issue_comment_url":"https://api.github.com/repos/graydon/swift/issues/comments{/number}","contents_url":"https://api.github.com/repos/graydon/swift/contents/{+path}","compare_url":"https://api.github.com/repos/graydon/swift/compare/{base}...{head}","merges_url":"https://api.github.com/repos/graydon/swift/merges","archive_url":"https://api.github.com/repos/graydon/swift/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/graydon/swift/downloads","issues_url":"https://api.github.com/repos/graydon/swift/issues{/number}","pulls_url":"https://api.github.com/repos/graydon/swift/pulls{/number}","milestones_url":"https://api.github.com/repos/graydon/swift/milestones{/number}","notifications_url":"https://api.github.com/repos/graydon/swift/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/graydon/swift/labels{/name}","releases_url":"https://api.github.com/repos/graydon/swift/releases{/id}","deployments_url":"https://api.github.com/repos/graydon/swift/deployments","created_at":"2016-08-29T17:37:10Z","updated_at":"2017-09-01T13:34:27Z","pushed_at":"2017-09-08T05:02:33Z","git_url":"git://github.com/graydon/swift.git","ssh_url":"git@github.com:graydon/swift.git","clone_url":"https://github.com/graydon/swift.git","svn_url":"https://github.com/graydon/swift","homepage":"https://swift.org/","size":229491,"stargazers_count":4,"watchers_count":4,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":4,"default_branch":"master"}},"base":{"label":"apple:master","ref":"master","sha":"9e8a712dfa1d2e0bcda5abc7d1ba90a1a98fa956","user":{"login":"apple","id":10639145,"avatar_url":"https://avatars0.githubusercontent.com/u/10639145?v=4","gravatar_id":"","url":"https://api.github.com/users/apple","html_url":"https://github.com/apple","followers_url":"https://api.github.com/users/apple/followers","following_url":"https://api.github.com/users/apple/following{/other_user}","gists_url":"https://api.github.com/users/apple/gists{/gist_id}","starred_url":"https://api.github.com/users/apple/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apple/subscriptions","organizations_url":"https://api.github.com/users/apple/orgs","repos_url":"https://api.github.com/users/apple/repos","events_url":"https://api.github.com/users/apple/events{/privacy}","received_events_url":"https://api.github.com/users/apple/received_events","type":"Organization","site_admin":false},"repo":{"id":44838949,"name":"swift","full_name":"apple/swift","owner":{"login":"apple","id":10639145,"avatar_url":"https://avatars0.githubusercontent.com/u/10639145?v=4","gravatar_id":"","url":"https://api.github.com/users/apple","html_url":"https://github.com/apple","followers_url":"https://api.github.com/users/apple/followers","following_url":"https://api.github.com/users/apple/following{/other_user}","gists_url":"https://api.github.com/users/apple/gists{/gist_id}","starred_url":"https://api.github.com/users/apple/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apple/subscriptions","organizations_url":"https://api.github.com/users/apple/orgs","repos_url":"https://api.github.com/users/apple/repos","events_url":"https://api.github.com/users/apple/events{/privacy}","received_events_url":"https://api.github.com/users/apple/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apple/swift","description":"The Swift Programming Language","fork":false,"url":"https://api.github.com/repos/apple/swift","forks_url":"https://api.github.com/repos/apple/swift/forks","keys_url":"https://api.github.com/repos/apple/swift/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apple/swift/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apple/swift/teams","hooks_url":"https://api.github.com/repos/apple/swift/hooks","issue_events_url":"https://api.github.com/repos/apple/swift/issues/events{/number}","events_url":"https://api.github.com/repos/apple/swift/events","assignees_url":"https://api.github.com/repos/apple/swift/assignees{/user}","branches_url":"https://api.github.com/repos/apple/swift/branches{/branch}","tags_url":"https://api.github.com/repos/apple/swift/tags","blobs_url":"https://api.github.com/repos/apple/swift/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apple/swift/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apple/swift/git/refs{/sha}","trees_url":"https://api.github.com/repos/apple/swift/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apple/swift/statuses/{sha}","languages_url":"https://api.github.com/repos/apple/swift/languages","stargazers_url":"https://api.github.com/repos/apple/swift/stargazers","contributors_url":"https://api.github.com/repos/apple/swift/contributors","subscribers_url":"https://api.github.com/repos/apple/swift/subscribers","subscription_url":"https://api.github.com/repos/apple/swift/subscription","commits_url":"https://api.github.com/repos/apple/swift/commits{/sha}","git_commits_url":"https://api.github.com/repos/apple/swift/git/commits{/sha}","comments_url":"https://api.github.com/repos/apple/swift/comments{/number}","issue_comment_url":"https://api.github.com/repos/apple/swift/issues/comments{/number}","contents_url":"https://api.github.com/repos/apple/swift/contents/{+path}","compare_url":"https://api.github.com/repos/apple/swift/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apple/swift/merges","archive_url":"https://api.github.com/repos/apple/swift/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apple/swift/downloads","issues_url":"https://api.github.com/repos/apple/swift/issues{/number}","pulls_url":"https://api.github.com/repos/apple/swift/pulls{/number}","milestones_url":"https://api.github.com/repos/apple/swift/milestones{/number}","notifications_url":"https://api.github.com/repos/apple/swift/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apple/swift/labels{/name}","releases_url":"https://api.github.com/repos/apple/swift/releases{/id}","deployments_url":"https://api.github.com/repos/apple/swift/deployments","created_at":"2015-10-23T21:15:07Z","updated_at":"2017-09-08T05:08:49Z","pushed_at":"2017-09-08T05:02:35Z","git_url":"git://github.com/apple/swift.git","ssh_url":"git@github.com:apple/swift.git","clone_url":"https://github.com/apple/swift.git","svn_url":"https://github.com/apple/swift","homepage":"https://swift.org/","size":234712,"stargazers_count":40253,"watchers_count":40253,"language":"C++","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":6187,"mirror_url":null,"open_issues_count":185,"forks":6187,"open_issues":185,"watchers":40253,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apple/swift/pulls/11815"},"html":{"href":"https://github.com/apple/swift/pull/11815"},"issue":{"href":"https://api.github.com/repos/apple/swift/issues/11815"},"comments":{"href":"https://api.github.com/repos/apple/swift/issues/11815/comments"},"review_comments":{"href":"https://api.github.com/repos/apple/swift/pulls/11815/comments"},"review_comment":{"href":"https://api.github.com/repos/apple/swift/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apple/swift/pulls/11815/commits"},"statuses":{"href":"https://api.github.com/repos/apple/swift/statuses/bc09276f7f929073cdacaf4255c3ab9c0a98797b"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"graydon"}}