{"action":"created","comment":{"url":"https://api.github.com/repos/rhinstaller/anaconda/pulls/comments/225571715","pull_request_review_id":165199950,"id":225571715,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyNTU3MTcxNQ==","diff_hunk":"@@ -0,0 +1,244 @@\n+# Gather and provides metadata about installation tree.\n+#\n+# Copyright (C) 2018  Red Hat, Inc.\n+#\n+# This copyrighted material is made available to anyone wishing to use,\n+# modify, copy, or redistribute it subject to the terms and conditions of\n+# the GNU General Public License v.2, or (at your option) any later version.\n+# This program is distributed in the hope that it will be useful, but WITHOUT\n+# ANY WARRANTY expressed or implied, including the implied warranties of\n+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General\n+# Public License for more details.  You should have received a copy of the\n+# GNU General Public License along with this program; if not, write to the\n+# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\n+# 02110-1301, USA.  Any Red Hat trademarks that are incorporated in the\n+# source code or documentation are not subject to the GNU General Public\n+# License and may only be used or replicated with the express permission of\n+# Red Hat, Inc.\n+#\n+\n+import time\n+import requests\n+import os\n+\n+from productmd.treeinfo import TreeInfo\n+from pyanaconda.core import util, constants\n+\n+from pyanaconda.anaconda_loggers import get_module_logger\n+log = get_module_logger(__name__)\n+\n+MAX_TREEINFO_DOWNLOAD_RETRIES = 6\n+\n+\n+class InstallTreeMetadata(object):\n+\n+    def __init__(self):\n+        self._tree_info = TreeInfo()\n+        self._meta_repos = []\n+        self._session = util.requests_session()\n+        self._errors = []\n+        self._path = \"\"\n+\n+    @property\n+    def errors(self):\n+        return self._errors\n+\n+    def load_file(self, root_path):\n+        \"\"\"Loads .treeinfo file path.\n+\n+        See `errors` property in case of failure.\n+\n+        :param root_path: Path to the installation root.\n+        :type root_path: str\n+        :returns: True if the metadata were loaded, False otherwise.\n+        \"\"\"\n+        self._path = root_path\n+        self._errors = []\n+\n+        if os.access(root_path + \"/.treeinfo\", os.R_OK):\n+            self._tree_info.load(root_path + \"/.treeinfo\")\n+        elif os.access(root_path + \"/treeinfo\", os.R_OK):\n+            self._tree_info.load(root_path + \"/treeinfo\")\n+        else:\n+            self._errors.append(\"Can't access {}\".format(root_path + \"/[.]treeinfo\", ))\n+            return False\n+\n+        return True\n+\n+    def load_url(self, url, proxies, sslverify, headers):\n+        \"\"\"Load URL link.\n+\n+        This can be also to local file.\n+\n+        In case of failure please look on the `errors` property for additional info.\n+        Parameters here are passed to requests object so make them compatible with requests.\n+\n+        :param url: URL poiting to the installation tree.\n+        :param proxies: Proxy used for the request.\n+        :param sslverify: sslverify object which will be used in request.\n+        :param headers: Additional headers of the request.\n+        :returns: True if the install tree repo metadata was successfully loaded. False otherwise.\n+        \"\"\"\n+        # Retry treeinfo downloads with a progressively longer pause,\n+        # so NetworkManager have a chance setup a network and we have\n+        # full connectivity before trying to download things. (#1292613)\n+        xdelay = util.xprogressive_delay()\n+        response = None\n+        ret_code = [None, None]\n+        self._errors = []\n+\n+        for retry_count in range(0, MAX_TREEINFO_DOWNLOAD_RETRIES + 1):\n+            if retry_count > 0:\n+                time.sleep(next(xdelay))\n+            # Downloading .treeinfo\n+            log.info(\"Trying to download '.treeinfo'\")\n+            (response, ret_code[0]) = self._download_treeinfo_file(url, \".treeinfo\",\n+                                                                   headers, proxies, sslverify)\n+            if response:\n+                break\n+            # Downloading treeinfo\n+            log.info(\"Trying to download 'treeinfo'\")\n+            (response, ret_code[1]) = self._download_treeinfo_file(url, \"treeinfo\",\n+                                                                   headers, proxies, sslverify)\n+            if response:\n+                break\n+\n+            # The [.]treeinfo wasn't downloaded. Try it again if [.]treeinfo\n+            # is on the server.\n+            #\n+            # Server returned HTTP 404 code -> no need to try again\n+            if (ret_code[0] is not None and ret_code[0] == 404\n+                    and ret_code[1] is not None and ret_code[1] == 404):\n+                response = None\n+                log.error(\"Got HTTP 404 Error when downloading [.]treeinfo files\")\n+                break\n+            if retry_count < MAX_TREEINFO_DOWNLOAD_RETRIES:\n+                # retry\n+                log.info(\"Retrying repo info download for %s, retrying (%d/%d)\",\n+                         url, retry_count + 1, MAX_TREEINFO_DOWNLOAD_RETRIES)\n+            else:\n+                # run out of retries\n+                err_msg = (\"Repo info download for %s failed after %d retries\" %\n+                           (url, retry_count))\n+                log.error(err_msg)\n+                self._errors.append(err_msg)\n+                response = None\n+\n+        if response:\n+            # get the treeinfo contents\n+            text = response.text\n+\n+            response.close()\n+\n+            self._tree_info.loads(text)\n+            self._path = url\n+            return True\n+\n+        return False\n+\n+    def _download_treeinfo_file(self, url, file_name, headers, proxies, verify):\n+        try:\n+            result = self._session.get(\"%s/%s\" % (url, file_name), headers=headers,\n+                                       proxies=proxies, verify=verify)\n+            # Server returned HTTP 4XX or 5XX codes\n+            if result.status_code >= 400 and result.status_code < 600:\n+                log.info(\"Server returned %i code\", result.status_code)\n+                return (None, result.status_code)\n+            log.debug(\"Retrieved '%s' from %s\", file_name, url)\n+        except requests.exceptions.RequestException as e:\n+            log.info(\"Error downloading '%s': %s\", file_name, e)\n+            return (None, None)\n+        return (result, result.status_code)\n+\n+    def get_release_version(self):\n+        \"\"\"Get release version from the repository.\n+\n+        :returns: Version as lowercase string.\n+        :raises: ValueError if version is not present.\n+        \"\"\"\n+        version = self._tree_info.release.version\n+\n+        if not version:\n+            raise ValueError(\"Can't read release version from the .treeinfo file! \"\n+                             \"Is the .treeinfo file corrupted?\")\n+\n+        return version.lower()\n+\n+    def get_metadata_repos(self):\n+        \"\"\"Get all repository metadata objects.\"\"\"\n+        self._check_variants()\n+\n+        return self._meta_repos\n+\n+    def get_repo_metadata_by_name(self, name):\n+        \"\"\"Get repository metadata object with given name.\n+\n+        :param name: Name of the variant to return.\n+        :rtype name: VariantRepo object or None.\n+        \"\"\"\n+        self._check_variants()\n+\n+        for variant in self._meta_repos:\n+            if name == variant.name:\n+                return variant\n+\n+    def get_base_repo_metadata(self, additional_names=None):\n+        \"\"\"Get repo metadata about base repository.\"\"\"\n+        self._check_variants()\n+        repos = constants.DEFAULT_REPOS\n+\n+        if additional_names:\n+            repos.extend(additional_names)\n+\n+        for repo_md in self._meta_repos:\n+            if repo_md.name in repos:\n+                return repo_md\n+\n+        return None\n+\n+    def _check_variants(self):\n+        if not self._meta_repos:\n+            self._read_variants()\n+\n+    def _read_variants(self):\n+        for variant_name in self._tree_info.variants:\n+            variant_object = self._tree_info.variants[variant_name]\n+            self._meta_repos.append(RepoMetadata(variant_name, variant_object, self._path))\n+\n+\n+class RepoMetadata(object):\n+    \"\"\"Metadata repo object contains metadata about repository.\"\"\"\n+\n+    def __init__(self, name, obj, root_path):\n+        \"\"\"Do not instantiate this class directly.\n+        Use InstallTreeMetadata to instantiate this class.\n+        \"\"\"\n+        self._name = name\n+        self._obj = obj\n+        self._root_path = root_path\n+\n+    @property\n+    def name(self):\n+        \"\"\"Get name of this repository.\"\"\"\n+        return self._name\n+\n+    @property\n+    def repo_rel_path(self):\n+        \"\"\"Get relative repository root path.\"\"\"\n+        return self._obj.paths.repository\n+\n+    @property\n+    def repo_path(self):\n+        \"\"\"Get absolute repository root path.\"\"\"\n+        if self.repo_rel_path == \".\":\n+            return self._root_path\n+        else:\n+            return self._root_path + \"/\" + self.repo_rel_path\n+\n+    def check_valid_repo(self):","path":"pyanaconda/payload/install_tree_metadata.py","position":238,"original_position":238,"commit_id":"e43a0707826a4a713e45ef5faeb9d9b083cc5d4b","original_commit_id":"98224c9974c506fbe40e2fb37d76670b1eba818a","user":{"login":"jkonecny12","id":1643889,"node_id":"MDQ6VXNlcjE2NDM4ODk=","avatar_url":"https://avatars0.githubusercontent.com/u/1643889?v=4","gravatar_id":"","url":"https://api.github.com/users/jkonecny12","html_url":"https://github.com/jkonecny12","followers_url":"https://api.github.com/users/jkonecny12/followers","following_url":"https://api.github.com/users/jkonecny12/following{/other_user}","gists_url":"https://api.github.com/users/jkonecny12/gists{/gist_id}","starred_url":"https://api.github.com/users/jkonecny12/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jkonecny12/subscriptions","organizations_url":"https://api.github.com/users/jkonecny12/orgs","repos_url":"https://api.github.com/users/jkonecny12/repos","events_url":"https://api.github.com/users/jkonecny12/events{/privacy}","received_events_url":"https://api.github.com/users/jkonecny12/received_events","type":"User","site_admin":false},"body":"Fixed","created_at":"2018-10-16T14:44:42Z","updated_at":"2018-10-16T14:44:42Z","html_url":"https://github.com/rhinstaller/anaconda/pull/1659#discussion_r225571715","pull_request_url":"https://api.github.com/repos/rhinstaller/anaconda/pulls/1659","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/rhinstaller/anaconda/pulls/comments/225571715"},"html":{"href":"https://github.com/rhinstaller/anaconda/pull/1659#discussion_r225571715"},"pull_request":{"href":"https://api.github.com/repos/rhinstaller/anaconda/pulls/1659"}},"in_reply_to_id":225534463},"pull_request":{"url":"https://api.github.com/repos/rhinstaller/anaconda/pulls/1659","id":223196454,"node_id":"MDExOlB1bGxSZXF1ZXN0MjIzMTk2NDU0","html_url":"https://github.com/rhinstaller/anaconda/pull/1659","diff_url":"https://github.com/rhinstaller/anaconda/pull/1659.diff","patch_url":"https://github.com/rhinstaller/anaconda/pull/1659.patch","issue_url":"https://api.github.com/repos/rhinstaller/anaconda/issues/1659","number":1659,"state":"open","locked":false,"title":"Fix unified nfs iso","user":{"login":"jkonecny12","id":1643889,"node_id":"MDQ6VXNlcjE2NDM4ODk=","avatar_url":"https://avatars0.githubusercontent.com/u/1643889?v=4","gravatar_id":"","url":"https://api.github.com/users/jkonecny12","html_url":"https://github.com/jkonecny12","followers_url":"https://api.github.com/users/jkonecny12/followers","following_url":"https://api.github.com/users/jkonecny12/following{/other_user}","gists_url":"https://api.github.com/users/jkonecny12/gists{/gist_id}","starred_url":"https://api.github.com/users/jkonecny12/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jkonecny12/subscriptions","organizations_url":"https://api.github.com/users/jkonecny12/orgs","repos_url":"https://api.github.com/users/jkonecny12/repos","events_url":"https://api.github.com/users/jkonecny12/events{/privacy}","received_events_url":"https://api.github.com/users/jkonecny12/received_events","type":"User","site_admin":false},"body":"Add RepoLoader to abstract work with TreeInfo object from productmd library.\r\n\r\nUse this class to check if at least one repodata folder is present on the installation media.","created_at":"2018-10-16T10:30:07Z","updated_at":"2018-10-16T14:44:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f7305fd0f2b83d6fa82bc73f784863bdf6ffbd15","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":449913474,"node_id":"MDU6TGFiZWw0NDk5MTM0NzQ=","url":"https://api.github.com/repos/rhinstaller/anaconda/labels/port%20to%20Fedora","name":"port to Fedora","color":"c5def5","default":false},{"id":995087181,"node_id":"MDU6TGFiZWw5OTUwODcxODE=","url":"https://api.github.com/repos/rhinstaller/anaconda/labels/rhel-devel","name":"rhel-devel","color":"3ce068","default":false},{"id":1079009403,"node_id":"MDU6TGFiZWwxMDc5MDA5NDAz","url":"https://api.github.com/repos/rhinstaller/anaconda/labels/tracked","name":"tracked","color":"0052cc","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/rhinstaller/anaconda/pulls/1659/commits","review_comments_url":"https://api.github.com/repos/rhinstaller/anaconda/pulls/1659/comments","review_comment_url":"https://api.github.com/repos/rhinstaller/anaconda/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rhinstaller/anaconda/issues/1659/comments","statuses_url":"https://api.github.com/repos/rhinstaller/anaconda/statuses/e43a0707826a4a713e45ef5faeb9d9b083cc5d4b","head":{"label":"jkonecny12:rhel-dev-fix-unified-nfs-iso","ref":"rhel-dev-fix-unified-nfs-iso","sha":"e43a0707826a4a713e45ef5faeb9d9b083cc5d4b","user":{"login":"jkonecny12","id":1643889,"node_id":"MDQ6VXNlcjE2NDM4ODk=","avatar_url":"https://avatars0.githubusercontent.com/u/1643889?v=4","gravatar_id":"","url":"https://api.github.com/users/jkonecny12","html_url":"https://github.com/jkonecny12","followers_url":"https://api.github.com/users/jkonecny12/followers","following_url":"https://api.github.com/users/jkonecny12/following{/other_user}","gists_url":"https://api.github.com/users/jkonecny12/gists{/gist_id}","starred_url":"https://api.github.com/users/jkonecny12/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jkonecny12/subscriptions","organizations_url":"https://api.github.com/users/jkonecny12/orgs","repos_url":"https://api.github.com/users/jkonecny12/repos","events_url":"https://api.github.com/users/jkonecny12/events{/privacy}","received_events_url":"https://api.github.com/users/jkonecny12/received_events","type":"User","site_admin":false},"repo":{"id":32858900,"node_id":"MDEwOlJlcG9zaXRvcnkzMjg1ODkwMA==","name":"anaconda","full_name":"jkonecny12/anaconda","private":false,"owner":{"login":"jkonecny12","id":1643889,"node_id":"MDQ6VXNlcjE2NDM4ODk=","avatar_url":"https://avatars0.githubusercontent.com/u/1643889?v=4","gravatar_id":"","url":"https://api.github.com/users/jkonecny12","html_url":"https://github.com/jkonecny12","followers_url":"https://api.github.com/users/jkonecny12/followers","following_url":"https://api.github.com/users/jkonecny12/following{/other_user}","gists_url":"https://api.github.com/users/jkonecny12/gists{/gist_id}","starred_url":"https://api.github.com/users/jkonecny12/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jkonecny12/subscriptions","organizations_url":"https://api.github.com/users/jkonecny12/orgs","repos_url":"https://api.github.com/users/jkonecny12/repos","events_url":"https://api.github.com/users/jkonecny12/events{/privacy}","received_events_url":"https://api.github.com/users/jkonecny12/received_events","type":"User","site_admin":false},"html_url":"https://github.com/jkonecny12/anaconda","description":"Graphical system installer","fork":true,"url":"https://api.github.com/repos/jkonecny12/anaconda","forks_url":"https://api.github.com/repos/jkonecny12/anaconda/forks","keys_url":"https://api.github.com/repos/jkonecny12/anaconda/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jkonecny12/anaconda/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jkonecny12/anaconda/teams","hooks_url":"https://api.github.com/repos/jkonecny12/anaconda/hooks","issue_events_url":"https://api.github.com/repos/jkonecny12/anaconda/issues/events{/number}","events_url":"https://api.github.com/repos/jkonecny12/anaconda/events","assignees_url":"https://api.github.com/repos/jkonecny12/anaconda/assignees{/user}","branches_url":"https://api.github.com/repos/jkonecny12/anaconda/branches{/branch}","tags_url":"https://api.github.com/repos/jkonecny12/anaconda/tags","blobs_url":"https://api.github.com/repos/jkonecny12/anaconda/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jkonecny12/anaconda/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jkonecny12/anaconda/git/refs{/sha}","trees_url":"https://api.github.com/repos/jkonecny12/anaconda/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jkonecny12/anaconda/statuses/{sha}","languages_url":"https://api.github.com/repos/jkonecny12/anaconda/languages","stargazers_url":"https://api.github.com/repos/jkonecny12/anaconda/stargazers","contributors_url":"https://api.github.com/repos/jkonecny12/anaconda/contributors","subscribers_url":"https://api.github.com/repos/jkonecny12/anaconda/subscribers","subscription_url":"https://api.github.com/repos/jkonecny12/anaconda/subscription","commits_url":"https://api.github.com/repos/jkonecny12/anaconda/commits{/sha}","git_commits_url":"https://api.github.com/repos/jkonecny12/anaconda/git/commits{/sha}","comments_url":"https://api.github.com/repos/jkonecny12/anaconda/comments{/number}","issue_comment_url":"https://api.github.com/repos/jkonecny12/anaconda/issues/comments{/number}","contents_url":"https://api.github.com/repos/jkonecny12/anaconda/contents/{+path}","compare_url":"https://api.github.com/repos/jkonecny12/anaconda/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jkonecny12/anaconda/merges","archive_url":"https://api.github.com/repos/jkonecny12/anaconda/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jkonecny12/anaconda/downloads","issues_url":"https://api.github.com/repos/jkonecny12/anaconda/issues{/number}","pulls_url":"https://api.github.com/repos/jkonecny12/anaconda/pulls{/number}","milestones_url":"https://api.github.com/repos/jkonecny12/anaconda/milestones{/number}","notifications_url":"https://api.github.com/repos/jkonecny12/anaconda/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jkonecny12/anaconda/labels{/name}","releases_url":"https://api.github.com/repos/jkonecny12/anaconda/releases{/id}","deployments_url":"https://api.github.com/repos/jkonecny12/anaconda/deployments","created_at":"2015-03-25T10:54:16Z","updated_at":"2017-05-05T08:45:48Z","pushed_at":"2018-10-16T13:30:42Z","git_url":"git://github.com/jkonecny12/anaconda.git","ssh_url":"git@github.com:jkonecny12/anaconda.git","clone_url":"https://github.com/jkonecny12/anaconda.git","svn_url":"https://github.com/jkonecny12/anaconda","homepage":null,"size":140670,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0","node_id":"MDc6TGljZW5zZTg="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"rhinstaller:rhel-devel","ref":"rhel-devel","sha":"c20ca7c7d8c8a35f1ca6d45d7f9665f131dcc931","user":{"login":"rhinstaller","id":10549274,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwNTQ5Mjc0","avatar_url":"https://avatars1.githubusercontent.com/u/10549274?v=4","gravatar_id":"","url":"https://api.github.com/users/rhinstaller","html_url":"https://github.com/rhinstaller","followers_url":"https://api.github.com/users/rhinstaller/followers","following_url":"https://api.github.com/users/rhinstaller/following{/other_user}","gists_url":"https://api.github.com/users/rhinstaller/gists{/gist_id}","starred_url":"https://api.github.com/users/rhinstaller/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rhinstaller/subscriptions","organizations_url":"https://api.github.com/users/rhinstaller/orgs","repos_url":"https://api.github.com/users/rhinstaller/repos","events_url":"https://api.github.com/users/rhinstaller/events{/privacy}","received_events_url":"https://api.github.com/users/rhinstaller/received_events","type":"Organization","site_admin":false},"repo":{"id":30210846,"node_id":"MDEwOlJlcG9zaXRvcnkzMDIxMDg0Ng==","name":"anaconda","full_name":"rhinstaller/anaconda","private":false,"owner":{"login":"rhinstaller","id":10549274,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwNTQ5Mjc0","avatar_url":"https://avatars1.githubusercontent.com/u/10549274?v=4","gravatar_id":"","url":"https://api.github.com/users/rhinstaller","html_url":"https://github.com/rhinstaller","followers_url":"https://api.github.com/users/rhinstaller/followers","following_url":"https://api.github.com/users/rhinstaller/following{/other_user}","gists_url":"https://api.github.com/users/rhinstaller/gists{/gist_id}","starred_url":"https://api.github.com/users/rhinstaller/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rhinstaller/subscriptions","organizations_url":"https://api.github.com/users/rhinstaller/orgs","repos_url":"https://api.github.com/users/rhinstaller/repos","events_url":"https://api.github.com/users/rhinstaller/events{/privacy}","received_events_url":"https://api.github.com/users/rhinstaller/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/rhinstaller/anaconda","description":"Graphical system installer","fork":false,"url":"https://api.github.com/repos/rhinstaller/anaconda","forks_url":"https://api.github.com/repos/rhinstaller/anaconda/forks","keys_url":"https://api.github.com/repos/rhinstaller/anaconda/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rhinstaller/anaconda/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rhinstaller/anaconda/teams","hooks_url":"https://api.github.com/repos/rhinstaller/anaconda/hooks","issue_events_url":"https://api.github.com/repos/rhinstaller/anaconda/issues/events{/number}","events_url":"https://api.github.com/repos/rhinstaller/anaconda/events","assignees_url":"https://api.github.com/repos/rhinstaller/anaconda/assignees{/user}","branches_url":"https://api.github.com/repos/rhinstaller/anaconda/branches{/branch}","tags_url":"https://api.github.com/repos/rhinstaller/anaconda/tags","blobs_url":"https://api.github.com/repos/rhinstaller/anaconda/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rhinstaller/anaconda/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rhinstaller/anaconda/git/refs{/sha}","trees_url":"https://api.github.com/repos/rhinstaller/anaconda/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rhinstaller/anaconda/statuses/{sha}","languages_url":"https://api.github.com/repos/rhinstaller/anaconda/languages","stargazers_url":"https://api.github.com/repos/rhinstaller/anaconda/stargazers","contributors_url":"https://api.github.com/repos/rhinstaller/anaconda/contributors","subscribers_url":"https://api.github.com/repos/rhinstaller/anaconda/subscribers","subscription_url":"https://api.github.com/repos/rhinstaller/anaconda/subscription","commits_url":"https://api.github.com/repos/rhinstaller/anaconda/commits{/sha}","git_commits_url":"https://api.github.com/repos/rhinstaller/anaconda/git/commits{/sha}","comments_url":"https://api.github.com/repos/rhinstaller/anaconda/comments{/number}","issue_comment_url":"https://api.github.com/repos/rhinstaller/anaconda/issues/comments{/number}","contents_url":"https://api.github.com/repos/rhinstaller/anaconda/contents/{+path}","compare_url":"https://api.github.com/repos/rhinstaller/anaconda/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rhinstaller/anaconda/merges","archive_url":"https://api.github.com/repos/rhinstaller/anaconda/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rhinstaller/anaconda/downloads","issues_url":"https://api.github.com/repos/rhinstaller/anaconda/issues{/number}","pulls_url":"https://api.github.com/repos/rhinstaller/anaconda/pulls{/number}","milestones_url":"https://api.github.com/repos/rhinstaller/anaconda/milestones{/number}","notifications_url":"https://api.github.com/repos/rhinstaller/anaconda/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rhinstaller/anaconda/labels{/name}","releases_url":"https://api.github.com/repos/rhinstaller/anaconda/releases{/id}","deployments_url":"https://api.github.com/repos/rhinstaller/anaconda/deployments","created_at":"2015-02-02T21:56:45Z","updated_at":"2018-10-15T13:58:04Z","pushed_at":"2018-10-16T13:30:44Z","git_url":"git://github.com/rhinstaller/anaconda.git","ssh_url":"git@github.com:rhinstaller/anaconda.git","clone_url":"https://github.com/rhinstaller/anaconda.git","svn_url":"https://github.com/rhinstaller/anaconda","homepage":null,"size":144016,"stargazers_count":194,"watchers_count":194,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":152,"mirror_url":null,"archived":false,"open_issues_count":60,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0","node_id":"MDc6TGljZW5zZTg="},"forks":152,"open_issues":60,"watchers":194,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rhinstaller/anaconda/pulls/1659"},"html":{"href":"https://github.com/rhinstaller/anaconda/pull/1659"},"issue":{"href":"https://api.github.com/repos/rhinstaller/anaconda/issues/1659"},"comments":{"href":"https://api.github.com/repos/rhinstaller/anaconda/issues/1659/comments"},"review_comments":{"href":"https://api.github.com/repos/rhinstaller/anaconda/pulls/1659/comments"},"review_comment":{"href":"https://api.github.com/repos/rhinstaller/anaconda/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rhinstaller/anaconda/pulls/1659/commits"},"statuses":{"href":"https://api.github.com/repos/rhinstaller/anaconda/statuses/e43a0707826a4a713e45ef5faeb9d9b083cc5d4b"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"jkonecny12"}}