payload: {"action":"created","comment":{"url":"https://api.github.com/repos/certbot/certbot/pulls/comments/268269616","pull_request_review_id":217885251,"id":268269616,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODI2OTYxNg==","diff_hunk":"@@ -0,0 +1,221 @@\n+#!/usr/bin/env python\n+\"\"\"\n+Gather and consolidate the up-to-date dependencies available and required to install certbot\n+on various Linux distributions. It generates a requirements file contained the pinned and hashed\n+versions, ready to be used by pip to install the certbot dependencies.\n+\n+This script is typically used to update the certbot-requirements.txt file of certbot-auto.\n+\n+To achieve its purpose, this script will start a certbot installation with unpinned dependencies,\n+then gather them, on various distributions started as Docker containers.\n+\n+Usage: letsencrypt-auto-source/rebuild_dependencies new_requirements.txt\n+\n+NB1: Docker must be installed on the machine running this script.\n+NB2: Python library 'hashin' must be installed on the machine running this script.\n+\"\"\"\n+from __future__ import print_function\n+import re\n+import shutil\n+import subprocess\n+import tempfile\n+import os\n+import sys\n+import argparse\n+\n+# The list of docker distributions to test dependencies against with.\n+DISTRIBUTION_LIST = [\n+    'ubuntu:18.04', 'ubuntu:14.04',\n+    'debian:stretch', 'debian:jessie',\n+    'centos:7', 'centos:6',\n+    'opensuse/leap:15',\n+    'fedora:29',\n+]\n+\n+# Theses constraints will be added while gathering dependencies on each distribution.\n+# It can be used because a particular version for a package is required for any reason,\n+# or to solve a version conflict between two distributions requirements.\n+AUTHORITATIVE_CONSTRAINTS = {\n+    # Using an older version of mock here prevents regressions of #5276.\n+    'mock': '1.3.0',\n+    # Too touchy to move to a new version. And will be removed soon\n+    # in favor of pure python parser for Apache.\n+    'python-augeas': '0.5.0',\n+}\n+\n+\n+# ./certbot/letsencrypt-auto-source/rebuild_dependencies.py (2 levels from certbot root path)\n+CERTBOT_REPO_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n+\n+# The script will be used to gathering dependencies for a given distribution.\n+#   - certbot-auto is used to install relevant OS packages, and setup an initial venv\n+#   - then this venv is used to consistently construct an empty new venv\n+#   - once pipstraped, this new venv pip install certbot runtime (including apache/nginx),\n+#     without pinned dependencies, and in respect with input authoritative requirements\n+#   - `certbot plugins` is called to check we have an healthy environment\n+#   - finally current set of dependencies is extracted out of the docker using pip freeze\n+SCRIPT = \"\"\"\\\n+#!/bin/sh\n+set -e\n+\n+cd /tmp/certbot\n+letsencrypt-auto-source/letsencrypt-auto --install-only -n\n+PYVER=`/opt/eff.org/certbot/venv/bin/python --version 2>&1 | cut -d\" \" -f 2 | cut -d. -f1,2 | sed 's/\\.//'`\n+\n+/opt/eff.org/certbot/venv/bin/python letsencrypt-auto-source/pieces/create_venv.py /tmp/venv \"$PYVER\" \"1\"\n+\n+/tmp/venv/bin/python letsencrypt-auto-source/pieces/pipstrap.py\n+/tmp/venv/bin/pip install -e acme -e . -e certbot-apache -e certbot-nginx -c /tmp/requirements.txt\n+/tmp/venv/bin/certbot plugins\n+/tmp/venv/bin/pip freeze >> /tmp/workspace/results\n+\"\"\"\n+\n+\n+def _process_one_distribution(distribution, verbose):\n+    print('===> Gathering dependencies for {0}.'.format(distribution))\n+    workspace = tempfile.mkdtemp()\n+    script = os.path.join(workspace, 'script.sh')\n+    authoritative_requirements = os.path.join(workspace, 'requirements.txt')\n+    cid_file = os.path.join(workspace, 'cid')\n+\n+    try:\n+        with open(script, 'w') as file_h:\n+            file_h.write(SCRIPT)\n+        os.chmod(script, 0o755)\n+\n+        with open(authoritative_requirements, 'w') as file_h:\n+            file_h.write('\\n'.join(['{0}=={1}'.format(package, version)\n+                                    for package, version in AUTHORITATIVE_CONSTRAINTS.items()]))\n+\n+        command = ['docker', 'run', '--rm', '--cidfile', cid_file,\n+                   '-v', '{0}:/tmp/certbot'.format(CERTBOT_REPO_PATH),\n+                   '-v', '{0}:/tmp/workspace'.format(workspace),\n+                   '-v', '{0}:/tmp/requirements.txt'.format(authoritative_requirements),\n+                   distribution, '/tmp/workspace/script.sh']\n+        sub_stdout = sys.stdout if verbose else subprocess.PIPE\n+        sub_stderr = sys.stderr if verbose else subprocess.STDOUT\n+        process = subprocess.Popen(command, stdout=sub_stdout, stderr=sub_stderr, universal_newlines=True)\n+        stdoutdata, _ = process.communicate()\n+\n+        if process.returncode:\n+            if stdoutdata:\n+                sys.stderr.write('Output was:\\n{0}'.format(stdoutdata))\n+            raise RuntimeError('Error while gathering dependencies for {0}.'.format(distribution))\n+\n+        with open(os.path.join(workspace, 'results'), 'r') as file_h:\n+            return file_h.read()\n+    finally:\n+        if os.path.isfile(cid_file):\n+            with open(cid_file, 'r') as file_h:\n+                cid = file_h.read()\n+            subprocess.call(['docker', 'kill', cid], stdout=None, stderr=None)\n+        shutil.rmtree(workspace)\n+\n+\n+def _insert_results(dependencies_map, results, distribution):\n+    refined_results = []\n+    for result in results.split(os.linesep):\n+        match = re.match(r'(.*)==(.*)', result)\n+        if match:\n+            package = match.group(1)\n+            version = match.group(2)\n+            if not any(dep in package for dep in ['acme', 'certbot', 'pkg-resources']):","path":"letsencrypt-auto-source/rebuild_dependencies.py","position":157,"original_position":122,"commit_id":"58291be0a7dcf75a2702d42bda4c12e9263b183e","original_commit_id":"5d088f812ce2e1449e698ed927dd3402a9b376cb","user":{"login":"erikrose","id":295816,"node_id":"MDQ6VXNlcjI5NTgxNg==","avatar_url":"https://avatars3.githubusercontent.com/u/295816?v=4","gravatar_id":"","url":"https://api.github.com/users/erikrose","html_url":"https://github.com/erikrose","followers_url":"https://api.github.com/users/erikrose/followers","following_url":"https://api.github.com/users/erikrose/following{/other_user}","gists_url":"https://api.github.com/users/erikrose/gists{/gist_id}","starred_url":"https://api.github.com/users/erikrose/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/erikrose/subscriptions","organizations_url":"https://api.github.com/users/erikrose/orgs","repos_url":"https://api.github.com/users/erikrose/repos","events_url":"https://api.github.com/users/erikrose/events{/privacy}","received_events_url":"https://api.github.com/users/erikrose/received_events","type":"User","site_admin":false},"body":"I'd also still like to tighten up the test for acme/certbot/pkg-resources. Won't we know the editable URL for our stuff, leaving only pkg-resources?","created_at":"2019-03-22T17:30:30Z","updated_at":"2019-03-22T17:30:31Z","html_url":"https://github.com/certbot/certbot/pull/6839#discussion_r268269616","pull_request_url":"https://api.github.com/repos/certbot/certbot/pulls/6839","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/certbot/certbot/pulls/comments/268269616"},"html":{"href":"https://github.com/certbot/certbot/pull/6839#discussion_r268269616"},"pull_request":{"href":"https://api.github.com/repos/certbot/certbot/pulls/6839"}},"in_reply_to_id":267457258},"pull_request":{"url":"https://api.github.com/repos/certbot/certbot/pulls/6839","id":259799730,"node_id":"MDExOlB1bGxSZXF1ZXN0MjU5Nzk5NzMw","html_url":"https://github.com/certbot/certbot/pull/6839","diff_url":"https://github.com/certbot/certbot/pull/6839.diff","patch_url":"https://github.com/certbot/certbot/pull/6839.patch","issue_url":"https://api.github.com/repos/certbot/certbot/issues/6839","number":6839,"state":"open","locked":false,"title":"Construct the sanitized, pinned and hashed requirements file for certbot-auto","user":{"login":"adferrand","id":9728851,"node_id":"MDQ6VXNlcjk3Mjg4NTE=","avatar_url":"https://avatars0.githubusercontent.com/u/9728851?v=4","gravatar_id":"","url":"https://api.github.com/users/adferrand","html_url":"https://github.com/adferrand","followers_url":"https://api.github.com/users/adferrand/followers","following_url":"https://api.github.com/users/adferrand/following{/other_user}","gists_url":"https://api.github.com/users/adferrand/gists{/gist_id}","starred_url":"https://api.github.com/users/adferrand/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adferrand/subscriptions","organizations_url":"https://api.github.com/users/adferrand/orgs","repos_url":"https://api.github.com/users/adferrand/repos","events_url":"https://api.github.com/users/adferrand/events{/privacy}","received_events_url":"https://api.github.com/users/adferrand/received_events","type":"User","site_admin":false},"body":"Fixes #6583.\r\n\r\nThis PR proposes an implementation of the process described in #6583.\r\n\r\nIts goal is to calculate and generate the up-to-date requirements file that certbot-auto use to setup the venv that will host certbot. This list must be compatible with all environments supported by Certbot. All pinned versions must be hashed to control the authenticity of installed packages. Finally, any customization needed by Certbot must be included.\r\n\r\nThe result is the script `letsencrypt-auto-source\\rebuild_dependencies.py`. This python script will generate this file on the path given as its first argument. \r\n\r\nTo do so, the script will start dockers for various distributions, and install the current development version of certbot on it. By calling pip with unpinned versions, all required dependencies are installed in their most up-to-date state for each distribution. All requirements are retrieved from the dockers and merged, then hashed using hashin to give the final requirements file. \r\n\r\nVersion conflicts are properly detected, and displayed both on stderr and in the generated file. Authoritative constraints can be added to solve these dependencies, and to apply specific versions for some packages if required. \r\n\r\nAlso in this PR the current result of this script execution is added to the current development version of certbot-auto. ","created_at":"2019-03-10T23:42:14Z","updated_at":"2019-03-22T17:30:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5d7b1000d43e1849b1e986ba0000f0dacd907073","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":276243379,"node_id":"MDU6TGFiZWwyNzYyNDMzNzk=","url":"https://api.github.com/repos/certbot/certbot/labels/area:%20certbot-auto","name":"area: certbot-auto","color":"c5def5","default":false},{"id":277080619,"node_id":"MDU6TGFiZWwyNzcwODA2MTk=","url":"https://api.github.com/repos/certbot/certbot/labels/area:%20code%20health","name":"area: code health","color":"c5def5","default":false},{"id":276667632,"node_id":"MDU6TGFiZWwyNzY2Njc2MzI=","url":"https://api.github.com/repos/certbot/certbot/labels/area:%20pkging","name":"area: pkging","color":"c5def5","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/certbot/certbot/pulls/6839/commits","review_comments_url":"https://api.github.com/repos/certbot/certbot/pulls/6839/comments","review_comment_url":"https://api.github.com/repos/certbot/certbot/pulls/comments{/number}","comments_url":"https://api.github.com/repos/certbot/certbot/issues/6839/comments","statuses_url":"https://api.github.com/repos/certbot/certbot/statuses/58291be0a7dcf75a2702d42bda4c12e9263b183e","head":{"label":"adferrand:gather-certbot-dependencies","ref":"gather-certbot-dependencies","sha":"58291be0a7dcf75a2702d42bda4c12e9263b183e","user":{"login":"adferrand","id":9728851,"node_id":"MDQ6VXNlcjk3Mjg4NTE=","avatar_url":"https://avatars0.githubusercontent.com/u/9728851?v=4","gravatar_id":"","url":"https://api.github.com/users/adferrand","html_url":"https://github.com/adferrand","followers_url":"https://api.github.com/users/adferrand/followers","following_url":"https://api.github.com/users/adferrand/following{/other_user}","gists_url":"https://api.github.com/users/adferrand/gists{/gist_id}","starred_url":"https://api.github.com/users/adferrand/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adferrand/subscriptions","organizations_url":"https://api.github.com/users/adferrand/orgs","repos_url":"https://api.github.com/users/adferrand/repos","events_url":"https://api.github.com/users/adferrand/events{/privacy}","received_events_url":"https://api.github.com/users/adferrand/received_events","type":"User","site_admin":false},"repo":{"id":144460400,"node_id":"MDEwOlJlcG9zaXRvcnkxNDQ0NjA0MDA=","name":"certbot","full_name":"adferrand/certbot","private":false,"owner":{"login":"adferrand","id":9728851,"node_id":"MDQ6VXNlcjk3Mjg4NTE=","avatar_url":"https://avatars0.githubusercontent.com/u/9728851?v=4","gravatar_id":"","url":"https://api.github.com/users/adferrand","html_url":"https://github.com/adferrand","followers_url":"https://api.github.com/users/adferrand/followers","following_url":"https://api.github.com/users/adferrand/following{/other_user}","gists_url":"https://api.github.com/users/adferrand/gists{/gist_id}","starred_url":"https://api.github.com/users/adferrand/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adferrand/subscriptions","organizations_url":"https://api.github.com/users/adferrand/orgs","repos_url":"https://api.github.com/users/adferrand/repos","events_url":"https://api.github.com/users/adferrand/events{/privacy}","received_events_url":"https://api.github.com/users/adferrand/received_events","type":"User","site_admin":false},"html_url":"https://github.com/adferrand/certbot","description":"Certbot is EFF's tool to obtain certs from Let's Encrypt and (optionally) auto-enable HTTPS on your server.  It can also act as a client for any other CA that uses the ACME protocol.","fork":true,"url":"https://api.github.com/repos/adferrand/certbot","forks_url":"https://api.github.com/repos/adferrand/certbot/forks","keys_url":"https://api.github.com/repos/adferrand/certbot/keys{/key_id}","collaborators_url":"https://api.github.com/repos/adferrand/certbot/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/adferrand/certbot/teams","hooks_url":"https://api.github.com/repos/adferrand/certbot/hooks","issue_events_url":"https://api.github.com/repos/adferrand/certbot/issues/events{/number}","events_url":"https://api.github.com/repos/adferrand/certbot/events","assignees_url":"https://api.github.com/repos/adferrand/certbot/assignees{/user}","branches_url":"https://api.github.com/repos/adferrand/certbot/branches{/branch}","tags_url":"https://api.github.com/repos/adferrand/certbot/tags","blobs_url":"https://api.github.com/repos/adferrand/certbot/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/adferrand/certbot/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/adferrand/certbot/git/refs{/sha}","trees_url":"https://api.github.com/repos/adferrand/certbot/git/trees{/sha}","statuses_url":"https://api.github.com/repos/adferrand/certbot/statuses/{sha}","languages_url":"https://api.github.com/repos/adferrand/certbot/languages","stargazers_url":"https://api.github.com/repos/adferrand/certbot/stargazers","contributors_url":"https://api.github.com/repos/adferrand/certbot/contributors","subscribers_url":"https://api.github.com/repos/adferrand/certbot/subscribers","subscription_url":"https://api.github.com/repos/adferrand/certbot/subscription","commits_url":"https://api.github.com/repos/adferrand/certbot/commits{/sha}","git_commits_url":"https://api.github.com/repos/adferrand/certbot/git/commits{/sha}","comments_url":"https://api.github.com/repos/adferrand/certbot/comments{/number}","issue_comment_url":"https://api.github.com/repos/adferrand/certbot/issues/comments{/number}","contents_url":"https://api.github.com/repos/adferrand/certbot/contents/{+path}","compare_url":"https://api.github.com/repos/adferrand/certbot/compare/{base}...{head}","merges_url":"https://api.github.com/repos/adferrand/certbot/merges","archive_url":"https://api.github.com/repos/adferrand/certbot/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/adferrand/certbot/downloads","issues_url":"https://api.github.com/repos/adferrand/certbot/issues{/number}","pulls_url":"https://api.github.com/repos/adferrand/certbot/pulls{/number}","milestones_url":"https://api.github.com/repos/adferrand/certbot/milestones{/number}","notifications_url":"https://api.github.com/repos/adferrand/certbot/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/adferrand/certbot/labels{/name}","releases_url":"https://api.github.com/repos/adferrand/certbot/releases{/id}","deployments_url":"https://api.github.com/repos/adferrand/certbot/deployments","created_at":"2018-08-12T11:17:30Z","updated_at":"2019-03-18T19:57:16Z","pushed_at":"2019-03-21T19:32:25Z","git_url":"git://github.com/adferrand/certbot.git","ssh_url":"git@github.com:adferrand/certbot.git","clone_url":"https://github.com/adferrand/certbot.git","svn_url":"https://github.com/adferrand/certbot","homepage":"","size":19211,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":2,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"certbot:master","ref":"master","sha":"b447b0a8e9d593e085187f30de927a201bac1006","user":{"login":"certbot","id":17889013,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3ODg5MDEz","avatar_url":"https://avatars2.githubusercontent.com/u/17889013?v=4","gravatar_id":"","url":"https://api.github.com/users/certbot","html_url":"https://github.com/certbot","followers_url":"https://api.github.com/users/certbot/followers","following_url":"https://api.github.com/users/certbot/following{/other_user}","gists_url":"https://api.github.com/users/certbot/gists{/gist_id}","starred_url":"https://api.github.com/users/certbot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/certbot/subscriptions","organizations_url":"https://api.github.com/users/certbot/orgs","repos_url":"https://api.github.com/users/certbot/repos","events_url":"https://api.github.com/users/certbot/events{/privacy}","received_events_url":"https://api.github.com/users/certbot/received_events","type":"Organization","site_admin":false},"repo":{"id":26516210,"node_id":"MDEwOlJlcG9zaXRvcnkyNjUxNjIxMA==","name":"certbot","full_name":"certbot/certbot","private":false,"owner":{"login":"certbot","id":17889013,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3ODg5MDEz","avatar_url":"https://avatars2.githubusercontent.com/u/17889013?v=4","gravatar_id":"","url":"https://api.github.com/users/certbot","html_url":"https://github.com/certbot","followers_url":"https://api.github.com/users/certbot/followers","following_url":"https://api.github.com/users/certbot/following{/other_user}","gists_url":"https://api.github.com/users/certbot/gists{/gist_id}","starred_url":"https://api.github.com/users/certbot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/certbot/subscriptions","organizations_url":"https://api.github.com/users/certbot/orgs","repos_url":"https://api.github.com/users/certbot/repos","events_url":"https://api.github.com/users/certbot/events{/privacy}","received_events_url":"https://api.github.com/users/certbot/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/certbot/certbot","description":"Certbot is EFF's tool to obtain certs from Let's Encrypt and (optionally) auto-enable HTTPS on your server.  It can also act as a client for any other CA that uses the ACME protocol.","fork":false,"url":"https://api.github.com/repos/certbot/certbot","forks_url":"https://api.github.com/repos/certbot/certbot/forks","keys_url":"https://api.github.com/repos/certbot/certbot/keys{/key_id}","collaborators_url":"https://api.github.com/repos/certbot/certbot/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/certbot/certbot/teams","hooks_url":"https://api.github.com/repos/certbot/certbot/hooks","issue_events_url":"https://api.github.com/repos/certbot/certbot/issues/events{/number}","events_url":"https://api.github.com/repos/certbot/certbot/events","assignees_url":"https://api.github.com/repos/certbot/certbot/assignees{/user}","branches_url":"https://api.github.com/repos/certbot/certbot/branches{/branch}","tags_url":"https://api.github.com/repos/certbot/certbot/tags","blobs_url":"https://api.github.com/repos/certbot/certbot/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/certbot/certbot/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/certbot/certbot/git/refs{/sha}","trees_url":"https://api.github.com/repos/certbot/certbot/git/trees{/sha}","statuses_url":"https://api.github.com/repos/certbot/certbot/statuses/{sha}","languages_url":"https://api.github.com/repos/certbot/certbot/languages","stargazers_url":"https://api.github.com/repos/certbot/certbot/stargazers","contributors_url":"https://api.github.com/repos/certbot/certbot/contributors","subscribers_url":"https://api.github.com/repos/certbot/certbot/subscribers","subscription_url":"https://api.github.com/repos/certbot/certbot/subscription","commits_url":"https://api.github.com/repos/certbot/certbot/commits{/sha}","git_commits_url":"https://api.github.com/repos/certbot/certbot/git/commits{/sha}","comments_url":"https://api.github.com/repos/certbot/certbot/comments{/number}","issue_comment_url":"https://api.github.com/repos/certbot/certbot/issues/comments{/number}","contents_url":"https://api.github.com/repos/certbot/certbot/contents/{+path}","compare_url":"https://api.github.com/repos/certbot/certbot/compare/{base}...{head}","merges_url":"https://api.github.com/repos/certbot/certbot/merges","archive_url":"https://api.github.com/repos/certbot/certbot/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/certbot/certbot/downloads","issues_url":"https://api.github.com/repos/certbot/certbot/issues{/number}","pulls_url":"https://api.github.com/repos/certbot/certbot/pulls{/number}","milestones_url":"https://api.github.com/repos/certbot/certbot/milestones{/number}","notifications_url":"https://api.github.com/repos/certbot/certbot/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/certbot/certbot/labels{/name}","releases_url":"https://api.github.com/repos/certbot/certbot/releases{/id}","deployments_url":"https://api.github.com/repos/certbot/certbot/deployments","created_at":"2014-11-12T02:52:20Z","updated_at":"2019-03-22T16:25:53Z","pushed_at":"2019-03-21T19:32:28Z","git_url":"git://github.com/certbot/certbot.git","ssh_url":"git@github.com:certbot/certbot.git","clone_url":"https://github.com/certbot/certbot.git","svn_url":"https://github.com/certbot/certbot","homepage":"","size":21301,"stargazers_count":24635,"watchers_count":24635,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2494,"mirror_url":null,"archived":false,"open_issues_count":817,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":2494,"open_issues":817,"watchers":24635,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/certbot/certbot/pulls/6839"},"html":{"href":"https://github.com/certbot/certbot/pull/6839"},"issue":{"href":"https://api.github.com/repos/certbot/certbot/issues/6839"},"comments":{"href":"https://api.github.com/repos/certbot/certbot/issues/6839/comments"},"review_comments":{"href":"https://api.github.com/repos/certbot/certbot/pulls/6839/comments"},"review_comment":{"href":"https://api.github.com/repos/certbot/certbot/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/certbot/certbot/pulls/6839/commits"},"statuses":{"href":"https://api.github.com/repos/certbot/certbot/statuses/58291be0a7dcf75a2702d42bda4c12e9263b183e"}},"author_association":"CONTRIBUTOR"}}
other: {"actor":{"display_login":"erikrose"}}