{"action":"created","comment":{"url":"https://api.github.com/repos/googleapis/artman/pulls/comments/72005236","id":72005236,"diff_hunk":"@@ -0,0 +1,137 @@\n+# Copyright 2016 Google Inc. All Rights Reserved.\n+#\n+# Licensed under the Apache License, Version 2.0 (the \"License\");\n+# you may not use this file except in compliance with the License.\n+# You may obtain a copy of the License at\n+#\n+# http://www.apache.org/licenses/LICENSE-2.0\n+#\n+# Unless required by applicable law or agreed to in writing, software\n+# distributed under the License is distributed on an \"AS IS\" BASIS,\n+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+# See the License for the specific language governing permissions and\n+# limitations under the License.\n+\n+\"\"\"Utility functions related to GitHub interaction. Uses the GitHub API with\n+reference https://developer.github.com/v3/\"\"\"\n+\n+# How to update requirements so that these imports are possible?\n+import requests\n+import json\n+import os\n+import base64\n+\n+\n+_API_URL = 'https://api.github.com'\n+\n+# file modes for different git file types\n+_TREE_EL_MODES = {'file': u'100644',\n+                  'executable': u'100755',\n+                  'tree': u'040000',\n+                  'symlink': u'120000'}\n+\n+\n+def _is_file(el):\n+    return os.path.isfile(el) and not os.access(el, os.X_OK)\n+\n+\n+def _is_executable(el):\n+    return os.path.isfile(el) and os.access(el, os.X_OK)\n+\n+\n+def _get_entries(entry_type_func, a_dir):\n+    \"\"\"List entries in a_dir that are of type specified by entry_type_func\"\"\"\n+    return filter(lambda x: entry_type_func(os.path.join(a_dir, x)),\n+                  os.listdir(a_dir))\n+\n+\n+def _get_request_content(req_func, url, req_data=None, username=None,\n+                         password=None):\n+    \"\"\"Make an HTTP request with given data and (username, password) tuple.\n+    Throw an exception if the request fails\"\"\"\n+    if username and password:\n+        attempt = req_func(url, data=req_data, auth=(username, password))\n+    else:\n+        attempt = req_func(url, data=req_data)\n+    if attempt.ok:\n+        return json.loads(attempt.content)\n+    else:\n+        raise Exception('Failed request at {0}.'\n+                        'Reason: {1}'.format(url, attempt.content))\n+\n+\n+def _build_git_tree_blob_item(file_or_exec, blob_mode, curr_dir, username,\n+                              password, owner, repo):\n+    \"\"\"Create a blob item that can be used to create a git tree\"\"\"\n+    with open(os.path.join(curr_dir, file_or_exec), 'r') as f:\n+        path_content = f.read()\n+    path_content = base64.b64encode(path_content)\n+    blob = _get_request_content(requests.post,\n+                                '{0}/repos/{1}/{2}'\n+                                '/git/blobs'.format(_API_URL, owner, repo),\n+                                json.dumps({'content': path_content,\n+                                            'encoding': 'base64'}),\n+                                username, password)\n+    return {'path': file_or_exec,\n+            'mode': _TREE_EL_MODES[blob_mode],\n+            'type': 'blob',\n+            'sha': blob['sha']}\n+\n+\n+# TODO: Have this function also upload symlinks to the repository\n+# according to GitHub protocol\n+def _build_git_tree(curr_dir, username, password, owner, repo):\n+    \"\"\"Create a git tree from curr_dir for the given GitHub repo\"\"\"\n+    # Tree_els is a list of children (trees or blobs) for this tree node.\n+    tree_els = []\n+    for subdir in _get_entries(os.path.isdir, curr_dir):\n+        subtree = _build_git_tree(os.path.join(curr_dir, subdir), username,\n+                                  password, owner, repo)\n+        tree_els.append({'path': subdir,\n+                         'mode': _TREE_EL_MODES['tree'],\n+                         'type': 'tree', 'sha': subtree['sha']})","path":"pipeline/utils/github_utils.py","position":92,"original_position":92,"commit_id":"a9fae82e2bfaaa32c1ab4bc75f4bb3507c98eaa7","original_commit_id":"a9fae82e2bfaaa32c1ab4bc75f4bb3507c98eaa7","user":{"login":"ethanbao","id":11670828,"avatar_url":"https://avatars.githubusercontent.com/u/11670828?v=3","gravatar_id":"","url":"https://api.github.com/users/ethanbao","html_url":"https://github.com/ethanbao","followers_url":"https://api.github.com/users/ethanbao/followers","following_url":"https://api.github.com/users/ethanbao/following{/other_user}","gists_url":"https://api.github.com/users/ethanbao/gists{/gist_id}","starred_url":"https://api.github.com/users/ethanbao/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethanbao/subscriptions","organizations_url":"https://api.github.com/users/ethanbao/orgs","repos_url":"https://api.github.com/users/ethanbao/repos","events_url":"https://api.github.com/users/ethanbao/events{/privacy}","received_events_url":"https://api.github.com/users/ethanbao/received_events","type":"User","site_admin":false},"body":"nit: new line before 'sha'.","created_at":"2016-07-25T03:20:55Z","updated_at":"2016-07-25T03:20:55Z","html_url":"https://github.com/googleapis/artman/pull/50#discussion_r72005236","pull_request_url":"https://api.github.com/repos/googleapis/artman/pulls/50","_links":{"self":{"href":"https://api.github.com/repos/googleapis/artman/pulls/comments/72005236"},"html":{"href":"https://github.com/googleapis/artman/pull/50#discussion_r72005236"},"pull_request":{"href":"https://api.github.com/repos/googleapis/artman/pulls/50"}}},"pull_request":{"url":"https://api.github.com/repos/googleapis/artman/pulls/50","id":78189453,"html_url":"https://github.com/googleapis/artman/pull/50","diff_url":"https://github.com/googleapis/artman/pull/50.diff","patch_url":"https://github.com/googleapis/artman/pull/50.patch","issue_url":"https://api.github.com/repos/googleapis/artman/issues/50","number":50,"state":"open","locked":false,"title":"add github push task, using util function in pipeline/utils. ","user":{"login":"mvashishtha","id":10712109,"avatar_url":"https://avatars.githubusercontent.com/u/10712109?v=3","gravatar_id":"","url":"https://api.github.com/users/mvashishtha","html_url":"https://github.com/mvashishtha","followers_url":"https://api.github.com/users/mvashishtha/followers","following_url":"https://api.github.com/users/mvashishtha/following{/other_user}","gists_url":"https://api.github.com/users/mvashishtha/gists{/gist_id}","starred_url":"https://api.github.com/users/mvashishtha/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mvashishtha/subscriptions","organizations_url":"https://api.github.com/users/mvashishtha/orgs","repos_url":"https://api.github.com/users/mvashishtha/repos","events_url":"https://api.github.com/users/mvashishtha/events{/privacy}","received_events_url":"https://api.github.com/users/mvashishtha/received_events","type":"User","site_admin":false},"body":"I also added a fake repository for testing in test/fake-repos.\r\n\r\nOnce we had extended the Python and Java GRPC client pipelines in artman to optionally publish generated code, we wanted to extend the Go pipeline to do the same. For Go the standard practice for publishing is simply to upload code to a GitHub repository. Since the task of uploading generated code to a GitHub repository might be useful for other languages as well, we want to add a task that will upload a folder to a GitHub repository (independent of the particular language). Code similar to this will also be used for publishing API protos from google3 to GitHub.  \r\n\r\nThis commit uses the GitHub API's JSON over HTTP methods to create and push the commit, because libraries that wrap the GitHub API did not provide the required methods.\r\n\r\nThe implementation follows these steps ([suggested on the API page](https://developer.github.com/v3/git/)), manipulating git internals to publish the output folder:\r\n1. get the current commit object\r\n2. retrieve the tree it points to\r\n3. retrieve the content of the blob object that tree has for that particular file path\r\n4. change the content somehow and post a new blob object with that new content, getting a blob SHA back\r\n5. post a new tree object with that file path pointer replaced with your new blob SHA getting a tree SHA back\r\n6. create a new commit object with the current commit SHA as the parent and the new tree SHA, getting a commit SHA back\r\n7. update the reference of your branch to point to the new commit SHA\r\n","created_at":"2016-07-20T17:45:59Z","updated_at":"2016-07-25T03:20:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0409afc63195454c16959c5416d8c4a1f56b7ac6","assignee":{"login":"jmuk","id":816093,"avatar_url":"https://avatars.githubusercontent.com/u/816093?v=3","gravatar_id":"","url":"https://api.github.com/users/jmuk","html_url":"https://github.com/jmuk","followers_url":"https://api.github.com/users/jmuk/followers","following_url":"https://api.github.com/users/jmuk/following{/other_user}","gists_url":"https://api.github.com/users/jmuk/gists{/gist_id}","starred_url":"https://api.github.com/users/jmuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jmuk/subscriptions","organizations_url":"https://api.github.com/users/jmuk/orgs","repos_url":"https://api.github.com/users/jmuk/repos","events_url":"https://api.github.com/users/jmuk/events{/privacy}","received_events_url":"https://api.github.com/users/jmuk/received_events","type":"User","site_admin":false},"assignees":[{"login":"jmuk","id":816093,"avatar_url":"https://avatars.githubusercontent.com/u/816093?v=3","gravatar_id":"","url":"https://api.github.com/users/jmuk","html_url":"https://github.com/jmuk","followers_url":"https://api.github.com/users/jmuk/followers","following_url":"https://api.github.com/users/jmuk/following{/other_user}","gists_url":"https://api.github.com/users/jmuk/gists{/gist_id}","starred_url":"https://api.github.com/users/jmuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jmuk/subscriptions","organizations_url":"https://api.github.com/users/jmuk/orgs","repos_url":"https://api.github.com/users/jmuk/repos","events_url":"https://api.github.com/users/jmuk/events{/privacy}","received_events_url":"https://api.github.com/users/jmuk/received_events","type":"User","site_admin":false},{"login":"ethanbao","id":11670828,"avatar_url":"https://avatars.githubusercontent.com/u/11670828?v=3","gravatar_id":"","url":"https://api.github.com/users/ethanbao","html_url":"https://github.com/ethanbao","followers_url":"https://api.github.com/users/ethanbao/followers","following_url":"https://api.github.com/users/ethanbao/following{/other_user}","gists_url":"https://api.github.com/users/ethanbao/gists{/gist_id}","starred_url":"https://api.github.com/users/ethanbao/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethanbao/subscriptions","organizations_url":"https://api.github.com/users/ethanbao/orgs","repos_url":"https://api.github.com/users/ethanbao/repos","events_url":"https://api.github.com/users/ethanbao/events{/privacy}","received_events_url":"https://api.github.com/users/ethanbao/received_events","type":"User","site_admin":false},{"login":"geigerj","id":14222439,"avatar_url":"https://avatars.githubusercontent.com/u/14222439?v=3","gravatar_id":"","url":"https://api.github.com/users/geigerj","html_url":"https://github.com/geigerj","followers_url":"https://api.github.com/users/geigerj/followers","following_url":"https://api.github.com/users/geigerj/following{/other_user}","gists_url":"https://api.github.com/users/geigerj/gists{/gist_id}","starred_url":"https://api.github.com/users/geigerj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/geigerj/subscriptions","organizations_url":"https://api.github.com/users/geigerj/orgs","repos_url":"https://api.github.com/users/geigerj/repos","events_url":"https://api.github.com/users/geigerj/events{/privacy}","received_events_url":"https://api.github.com/users/geigerj/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/googleapis/artman/pulls/50/commits","review_comments_url":"https://api.github.com/repos/googleapis/artman/pulls/50/comments","review_comment_url":"https://api.github.com/repos/googleapis/artman/pulls/comments{/number}","comments_url":"https://api.github.com/repos/googleapis/artman/issues/50/comments","statuses_url":"https://api.github.com/repos/googleapis/artman/statuses/a9fae82e2bfaaa32c1ab4bc75f4bb3507c98eaa7","head":{"label":"mvashishtha:github-publish","ref":"github-publish","sha":"a9fae82e2bfaaa32c1ab4bc75f4bb3507c98eaa7","user":{"login":"mvashishtha","id":10712109,"avatar_url":"https://avatars.githubusercontent.com/u/10712109?v=3","gravatar_id":"","url":"https://api.github.com/users/mvashishtha","html_url":"https://github.com/mvashishtha","followers_url":"https://api.github.com/users/mvashishtha/followers","following_url":"https://api.github.com/users/mvashishtha/following{/other_user}","gists_url":"https://api.github.com/users/mvashishtha/gists{/gist_id}","starred_url":"https://api.github.com/users/mvashishtha/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mvashishtha/subscriptions","organizations_url":"https://api.github.com/users/mvashishtha/orgs","repos_url":"https://api.github.com/users/mvashishtha/repos","events_url":"https://api.github.com/users/mvashishtha/events{/privacy}","received_events_url":"https://api.github.com/users/mvashishtha/received_events","type":"User","site_admin":false},"repo":{"id":60639320,"name":"artman","full_name":"mvashishtha/artman","owner":{"login":"mvashishtha","id":10712109,"avatar_url":"https://avatars.githubusercontent.com/u/10712109?v=3","gravatar_id":"","url":"https://api.github.com/users/mvashishtha","html_url":"https://github.com/mvashishtha","followers_url":"https://api.github.com/users/mvashishtha/followers","following_url":"https://api.github.com/users/mvashishtha/following{/other_user}","gists_url":"https://api.github.com/users/mvashishtha/gists{/gist_id}","starred_url":"https://api.github.com/users/mvashishtha/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mvashishtha/subscriptions","organizations_url":"https://api.github.com/users/mvashishtha/orgs","repos_url":"https://api.github.com/users/mvashishtha/repos","events_url":"https://api.github.com/users/mvashishtha/events{/privacy}","received_events_url":"https://api.github.com/users/mvashishtha/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mvashishtha/artman","description":"Google API Artifact manager","fork":true,"url":"https://api.github.com/repos/mvashishtha/artman","forks_url":"https://api.github.com/repos/mvashishtha/artman/forks","keys_url":"https://api.github.com/repos/mvashishtha/artman/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mvashishtha/artman/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mvashishtha/artman/teams","hooks_url":"https://api.github.com/repos/mvashishtha/artman/hooks","issue_events_url":"https://api.github.com/repos/mvashishtha/artman/issues/events{/number}","events_url":"https://api.github.com/repos/mvashishtha/artman/events","assignees_url":"https://api.github.com/repos/mvashishtha/artman/assignees{/user}","branches_url":"https://api.github.com/repos/mvashishtha/artman/branches{/branch}","tags_url":"https://api.github.com/repos/mvashishtha/artman/tags","blobs_url":"https://api.github.com/repos/mvashishtha/artman/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mvashishtha/artman/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mvashishtha/artman/git/refs{/sha}","trees_url":"https://api.github.com/repos/mvashishtha/artman/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mvashishtha/artman/statuses/{sha}","languages_url":"https://api.github.com/repos/mvashishtha/artman/languages","stargazers_url":"https://api.github.com/repos/mvashishtha/artman/stargazers","contributors_url":"https://api.github.com/repos/mvashishtha/artman/contributors","subscribers_url":"https://api.github.com/repos/mvashishtha/artman/subscribers","subscription_url":"https://api.github.com/repos/mvashishtha/artman/subscription","commits_url":"https://api.github.com/repos/mvashishtha/artman/commits{/sha}","git_commits_url":"https://api.github.com/repos/mvashishtha/artman/git/commits{/sha}","comments_url":"https://api.github.com/repos/mvashishtha/artman/comments{/number}","issue_comment_url":"https://api.github.com/repos/mvashishtha/artman/issues/comments{/number}","contents_url":"https://api.github.com/repos/mvashishtha/artman/contents/{+path}","compare_url":"https://api.github.com/repos/mvashishtha/artman/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mvashishtha/artman/merges","archive_url":"https://api.github.com/repos/mvashishtha/artman/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mvashishtha/artman/downloads","issues_url":"https://api.github.com/repos/mvashishtha/artman/issues{/number}","pulls_url":"https://api.github.com/repos/mvashishtha/artman/pulls{/number}","milestones_url":"https://api.github.com/repos/mvashishtha/artman/milestones{/number}","notifications_url":"https://api.github.com/repos/mvashishtha/artman/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mvashishtha/artman/labels{/name}","releases_url":"https://api.github.com/repos/mvashishtha/artman/releases{/id}","deployments_url":"https://api.github.com/repos/mvashishtha/artman/deployments","created_at":"2016-06-07T19:09:56Z","updated_at":"2016-06-07T19:09:58Z","pushed_at":"2016-07-20T21:34:57Z","git_url":"git://github.com/mvashishtha/artman.git","ssh_url":"git@github.com:mvashishtha/artman.git","clone_url":"https://github.com/mvashishtha/artman.git","svn_url":"https://github.com/mvashishtha/artman","homepage":"","size":225,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"googleapis:master","ref":"master","sha":"b9b2e6c0d42a0698b6ee59f4e755e7f2e603f8aa","user":{"login":"googleapis","id":16785467,"avatar_url":"https://avatars.githubusercontent.com/u/16785467?v=3","gravatar_id":"","url":"https://api.github.com/users/googleapis","html_url":"https://github.com/googleapis","followers_url":"https://api.github.com/users/googleapis/followers","following_url":"https://api.github.com/users/googleapis/following{/other_user}","gists_url":"https://api.github.com/users/googleapis/gists{/gist_id}","starred_url":"https://api.github.com/users/googleapis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/googleapis/subscriptions","organizations_url":"https://api.github.com/users/googleapis/orgs","repos_url":"https://api.github.com/users/googleapis/repos","events_url":"https://api.github.com/users/googleapis/events{/privacy}","received_events_url":"https://api.github.com/users/googleapis/received_events","type":"Organization","site_admin":false},"repo":{"id":55101236,"name":"artman","full_name":"googleapis/artman","owner":{"login":"googleapis","id":16785467,"avatar_url":"https://avatars.githubusercontent.com/u/16785467?v=3","gravatar_id":"","url":"https://api.github.com/users/googleapis","html_url":"https://github.com/googleapis","followers_url":"https://api.github.com/users/googleapis/followers","following_url":"https://api.github.com/users/googleapis/following{/other_user}","gists_url":"https://api.github.com/users/googleapis/gists{/gist_id}","starred_url":"https://api.github.com/users/googleapis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/googleapis/subscriptions","organizations_url":"https://api.github.com/users/googleapis/orgs","repos_url":"https://api.github.com/users/googleapis/repos","events_url":"https://api.github.com/users/googleapis/events{/privacy}","received_events_url":"https://api.github.com/users/googleapis/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/googleapis/artman","description":"Google API Artifact manager","fork":false,"url":"https://api.github.com/repos/googleapis/artman","forks_url":"https://api.github.com/repos/googleapis/artman/forks","keys_url":"https://api.github.com/repos/googleapis/artman/keys{/key_id}","collaborators_url":"https://api.github.com/repos/googleapis/artman/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/googleapis/artman/teams","hooks_url":"https://api.github.com/repos/googleapis/artman/hooks","issue_events_url":"https://api.github.com/repos/googleapis/artman/issues/events{/number}","events_url":"https://api.github.com/repos/googleapis/artman/events","assignees_url":"https://api.github.com/repos/googleapis/artman/assignees{/user}","branches_url":"https://api.github.com/repos/googleapis/artman/branches{/branch}","tags_url":"https://api.github.com/repos/googleapis/artman/tags","blobs_url":"https://api.github.com/repos/googleapis/artman/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/googleapis/artman/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/googleapis/artman/git/refs{/sha}","trees_url":"https://api.github.com/repos/googleapis/artman/git/trees{/sha}","statuses_url":"https://api.github.com/repos/googleapis/artman/statuses/{sha}","languages_url":"https://api.github.com/repos/googleapis/artman/languages","stargazers_url":"https://api.github.com/repos/googleapis/artman/stargazers","contributors_url":"https://api.github.com/repos/googleapis/artman/contributors","subscribers_url":"https://api.github.com/repos/googleapis/artman/subscribers","subscription_url":"https://api.github.com/repos/googleapis/artman/subscription","commits_url":"https://api.github.com/repos/googleapis/artman/commits{/sha}","git_commits_url":"https://api.github.com/repos/googleapis/artman/git/commits{/sha}","comments_url":"https://api.github.com/repos/googleapis/artman/comments{/number}","issue_comment_url":"https://api.github.com/repos/googleapis/artman/issues/comments{/number}","contents_url":"https://api.github.com/repos/googleapis/artman/contents/{+path}","compare_url":"https://api.github.com/repos/googleapis/artman/compare/{base}...{head}","merges_url":"https://api.github.com/repos/googleapis/artman/merges","archive_url":"https://api.github.com/repos/googleapis/artman/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/googleapis/artman/downloads","issues_url":"https://api.github.com/repos/googleapis/artman/issues{/number}","pulls_url":"https://api.github.com/repos/googleapis/artman/pulls{/number}","milestones_url":"https://api.github.com/repos/googleapis/artman/milestones{/number}","notifications_url":"https://api.github.com/repos/googleapis/artman/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/googleapis/artman/labels{/name}","releases_url":"https://api.github.com/repos/googleapis/artman/releases{/id}","deployments_url":"https://api.github.com/repos/googleapis/artman/deployments","created_at":"2016-03-30T22:09:32Z","updated_at":"2016-05-03T00:46:17Z","pushed_at":"2016-07-20T21:53:17Z","git_url":"git://github.com/googleapis/artman.git","ssh_url":"git@github.com:googleapis/artman.git","clone_url":"https://github.com/googleapis/artman.git","svn_url":"https://github.com/googleapis/artman","homepage":"","size":311,"stargazers_count":7,"watchers_count":7,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":12,"mirror_url":null,"open_issues_count":13,"forks":12,"open_issues":13,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/googleapis/artman/pulls/50"},"html":{"href":"https://github.com/googleapis/artman/pull/50"},"issue":{"href":"https://api.github.com/repos/googleapis/artman/issues/50"},"comments":{"href":"https://api.github.com/repos/googleapis/artman/issues/50/comments"},"review_comments":{"href":"https://api.github.com/repos/googleapis/artman/pulls/50/comments"},"review_comment":{"href":"https://api.github.com/repos/googleapis/artman/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/googleapis/artman/pulls/50/commits"},"statuses":{"href":"https://api.github.com/repos/googleapis/artman/statuses/a9fae82e2bfaaa32c1ab4bc75f4bb3507c98eaa7"}}}}
{"actor":{"display_login":"ethanbao"}}