{"action":"created","comment":{"url":"https://api.github.com/repos/pulp/pulp/pulls/comments/74460561","id":74460561,"diff_hunk":"@@ -1,10 +1,341 @@\n \"\"\"\n-Django models related to repositories.\n+Repository related Django models.\n \"\"\"\n+from django.db import models\n+from django.contrib.contenttypes import fields\n+from django.utils import timezone\n \n-from pulp.platform.models import Model\n+from pulp.platform.models import Model, Notes, Scratchpad, MasterModel\n \n \n-class Distributor(Model):\n+class Content(Model):\n     # placeholder\n-    pass\n+    type = models.TextField()\n+    created = models.DateTimeField(auto_now_add=True)\n+\n+\n+class Repository(Model):\n+    \"\"\"\n+    Collection of content.\n+\n+    Fields:\n+\n+    :cvar name: The repository name.\n+    :type name: models.TextField\n+\n+    :cvar: description: An optional description.\n+    :type: models.TextField\n+\n+    :cvar last_content_added: When content was last added.\n+    :type last_content_added: models.DateTimeField\n+\n+    :cvar last_content_removed: When content was last removed.\n+    :type last_content_removed: models.DateTimeField\n+\n+    Relations:\n+\n+    :cvar scratchpad: Arbitrary information stashed on the repository.\n+    :type scratchpad: fields.GenericRelation\n+\n+    :cvar notes: Arbitrary repository properties.\n+    :type notes: fields.GenericRelation\n+\n+    :cvar content: Associated content.\n+    :type content: models.ManyToManyField\n+    \"\"\"\n+    name = models.TextField(db_index=True, unique=True)\n+    description = models.TextField(blank=True, default='')\n+\n+    last_content_added = models.DateTimeField(blank=True, null=True)\n+    last_content_removed = models.DateTimeField(blank=True, null=True)\n+\n+    scratchpad = fields.GenericRelation(Scratchpad)\n+    notes = fields.GenericRelation(Notes)\n+\n+    content = models.ManyToManyField('Content', through='RepositoryContent')\n+\n+    @property\n+    def content_summary(self):\n+        \"\"\"\n+        The contained content summary.\n+\n+        :return: A dict of {<type>: <count>}\n+        :rtype:  dict\n+        \"\"\"\n+        mapping = self.content.values('type').annotate(count=models.Count('type'))\n+        return {m['type']: m['count'] for m in mapping}\n+\n+\n+class RepositoryGroup(Model):\n+    \"\"\"\n+    A group of repositories.\n+\n+    Fields:\n+\n+    :cvar name: The group name.\n+    :type name: models.TextField\n+\n+    :cvar: description: An optional description.\n+    :type: models.TextField\n+\n+    Relations:\n+    :cvar notes: Arbitrary group properties.\n+    :type notes: fields.GenericRelation\n+\n+    :cvar members: Repositories associated with the group.\n+    :type members: models.ManyToManyField\n+    \"\"\"\n+    name = models.TextField(db_index=True, unique=True)\n+    description = models.TextField(blank=True, default='')\n+\n+    members = models.ManyToManyField('Repository')\n+    scratchpad = fields.GenericRelation(Scratchpad)\n+    notes = fields.GenericRelation(Notes)\n+\n+\n+class Plugin(MasterModel):\n+    \"\"\"\n+    An Abstract model for plugins.\n+\n+    Fields:\n+\n+    :cvar name: The plugin name.\n+    :type type: models.TextField\n+\n+    :cvar type: The plugin type.\n+    :type type: models.TextField\n+\n+    :cvar last_updated: When the plugin was last updated.\n+    :type last_updated: fields.DateTimeField\n+\n+    Relations:\n+\n+    \"\"\"\n+    name = models.TextField(db_index=True)\n+    type = models.TextField()\n+    last_updated = models.DateTimeField(auto_now=True, blank=True, null=True)\n+\n+    class Meta:\n+        abstract = True\n+\n+\n+class Importer(Plugin):\n+    \"\"\"\n+    A abstract content importer.\n+\n+    Fields:\n+\n+    :cvar feed_url: The URL of an external content source.\n+    :type feed_url: models.TextField\n+\n+    :cvar validate: Validate the imported context.\n+    :type validate: models.BooleanField\n+\n+    :cvar ssl_ca_certificate: A PEM encoded CA certificate used for authentication.\n+    :type ssl_ca_certificate: models.TextField\n+\n+    :cvar ssl_client_certificate: A PEM encoded client certificate used for authentication.\n+    :type ssl_client_certificate: models.TextField\n+\n+    :cvar ssl_client_key: A PEM encoded private key used for authentication.\n+    :type ssl_client_key: models.TextField\n+\n+    :cvar ssl_validation: Indicates whether SSL peer validation must be performed.\n+    :type ssl_validation: models.BooleanField\n+\n+    :cvar proxy_host: The hostname of an SSL proxy to be used.\n+    :type proxy_host: models.TextField\n+\n+    :cvar proxy_port: The TCP port number of an SSL proxy to be used.\n+    :type proxy_port: models.IntegerField\n+\n+    :cvar proxy_user: The user used to authenticate with an SSL proxy to be used.\n+    :type proxy_user: models.TextField\n+\n+    :cvar proxy_password: The password used to authenticate with an SSL proxy to be used.\n+    :type proxy_password: models.TextField\n+\n+    :cvar basic_auth_user: The user used in HTTP basic authentication.\n+    :type basic_auth_user: models.TextField\n+\n+    :cvar basic_auth_password: The password used in HTTP basic authentication.\n+    :type basic_auth_password: models.TextField\n+\n+    :cvar max_download_bandwidth: The max amount of bandwidth used per download.\n+    :type max_download_bandwidth: models.IntegerField\n+\n+    :cvar max_concurrent_downloads: The number of concurrent downloads permitted.\n+    :type max_concurrent_downloads: models.IntegerField\n+\n+    :cvar download_policy: The policy for downloading content.\n+    :type download_policy: models.TextField\n+\n+    :cvar last_sync: When the last successful synchronization occurred.\n+    :type last_sync: models.DateTimeField\n+\n+    Relations:\n+\n+    :cvar scratchpad: Arbitrary information stashed by the importer.\n+    :type scratchpad: fields.GenericRelation\n+    \"\"\"\n+\n+    # Download Policies\n+    IMMEDIATE = 'immediate'\n+    ON_DEMAND = 'on_demand'\n+    BACKGROUND = 'background'\n+    DOWNLOAD_POLICIES = (\n+        (IMMEDIATE, 'Download Immediately'),\n+        (ON_DEMAND, 'Download On Demand'),\n+        (BACKGROUND, 'Download In Background'))\n+\n+    feed_url = models.TextField()\n+    validate = models.BooleanField(default=False)\n+\n+    ssl_ca_certificate = models.TextField(blank=True, default='')\n+    ssl_client_certificate = models.TextField(blank=True, default='')\n+    ssl_client_key = models.TextField(blank=True, default='')\n+    ssl_validation = models.BooleanField(default=False)\n+\n+    proxy_host = models.TextField(blank=True, default='')\n+    proxy_port = models.IntegerField(null=True)\n+    proxy_user = models.TextField(blank=True, default='')\n+    proxy_password = models.TextField(blank=True, default='')\n+\n+    basic_auth_user = models.TextField(blank=True, default='')\n+    basic_auth_password = models.TextField(blank=True, default='')\n+\n+    max_download_bandwidth = models.IntegerField(null=True)\n+    max_concurrent_downloads = models.IntegerField(null=True)\n+\n+    download_policy = models.TextField(choices=DOWNLOAD_POLICIES)\n+    last_sync = models.DateTimeField(blank=True, null=True)\n+\n+    scratchpad = fields.GenericRelation(Scratchpad)\n+\n+    class Meta:\n+        abstract = True\n+        unique_together = ('name', 'repository')\n+\n+\n+class RepositoryImporter(Importer):\n+    \"\"\"\n+    A content importer that is associated with a repository..\n+\n+    Fields:\n+\n+    Relations:\n+\n+    :cvar repository: The associated repository.\n+    :type repository: models.ForeignKey\n+    \"\"\"\n+\n+    repository = models.ForeignKey(\n+        Repository, related_name='importers', on_delete=models.CASCADE)\n+\n+    class Meta:\n+        unique_together = ('name', 'repository')\n+\n+\n+class Distributor(Plugin):\n+    \"\"\"\n+    An abstract content distributor.\n+\n+    Fields:\n+\n+    :cvar relative_path: The (relative) path component of the published url.\n+    :type relative_path: models.TextField\n+\n+    :cvar last_published: When the last successful publish occurred.\n+    :type last_published: models.DateTimeField\n+\n+    Relations:\n+\n+    \"\"\"\n+    relative_path = models.TextField(blank=True, default='')","path":"platform/pulp/platform/models/repository.py","position":258,"original_position":258,"commit_id":"5df18e37f1b743d5b9040f424e0db183a61ed312","original_commit_id":"5df18e37f1b743d5b9040f424e0db183a61ed312","user":{"login":"mhrivnak","id":53091,"avatar_url":"https://avatars.githubusercontent.com/u/53091?v=3","gravatar_id":"","url":"https://api.github.com/users/mhrivnak","html_url":"https://github.com/mhrivnak","followers_url":"https://api.github.com/users/mhrivnak/followers","following_url":"https://api.github.com/users/mhrivnak/following{/other_user}","gists_url":"https://api.github.com/users/mhrivnak/gists{/gist_id}","starred_url":"https://api.github.com/users/mhrivnak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mhrivnak/subscriptions","organizations_url":"https://api.github.com/users/mhrivnak/orgs","repos_url":"https://api.github.com/users/mhrivnak/repos","events_url":"https://api.github.com/users/mhrivnak/events{/privacy}","received_events_url":"https://api.github.com/users/mhrivnak/received_events","type":"User","site_admin":false},"body":"I think the current collision logic also prevents publishing one repo within the path of another. That can't be covered by a uniqueness constraint.","created_at":"2016-08-11T16:57:21Z","updated_at":"2016-08-11T16:57:21Z","html_url":"https://github.com/pulp/pulp/pull/2684#discussion_r74460561","pull_request_url":"https://api.github.com/repos/pulp/pulp/pulls/2684","_links":{"self":{"href":"https://api.github.com/repos/pulp/pulp/pulls/comments/74460561"},"html":{"href":"https://github.com/pulp/pulp/pull/2684#discussion_r74460561"},"pull_request":{"href":"https://api.github.com/repos/pulp/pulp/pulls/2684"}}},"pull_request":{"url":"https://api.github.com/repos/pulp/pulp/pulls/2684","id":80296647,"html_url":"https://github.com/pulp/pulp/pull/2684","diff_url":"https://github.com/pulp/pulp/pull/2684.diff","patch_url":"https://github.com/pulp/pulp/pull/2684.patch","issue_url":"https://api.github.com/repos/pulp/pulp/issues/2684","number":2684,"state":"open","locked":false,"title":"Add repository models.","user":{"login":"jortel","id":1126767,"avatar_url":"https://avatars.githubusercontent.com/u/1126767?v=3","gravatar_id":"","url":"https://api.github.com/users/jortel","html_url":"https://github.com/jortel","followers_url":"https://api.github.com/users/jortel/followers","following_url":"https://api.github.com/users/jortel/following{/other_user}","gists_url":"https://api.github.com/users/jortel/gists{/gist_id}","starred_url":"https://api.github.com/users/jortel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jortel/subscriptions","organizations_url":"https://api.github.com/users/jortel/orgs","repos_url":"https://api.github.com/users/jortel/repos","events_url":"https://api.github.com/users/jortel/events{/privacy}","received_events_url":"https://api.github.com/users/jortel/received_events","type":"User","site_admin":false},"body":"https://pulp.plan.io/issues/2089\r\n\r\nNot sold on `RepositoryContent.save()` and `RepositoryContent.delete()` managing the `last_content_added` and `last_content_removed`.  As a rule, we don't have one model update another.  *Maybe* it's okay in cases like this where the model is an *association* (join tables)?  Perhaps managing the `last_content_*` should be in the control layer?\r\n\r\nIgnore the `Content` model (for now).\r\n\r\nAnyone know if `RepositoryGroup.scratchpad` is need?  Used?\r\n","created_at":"2016-08-05T19:42:55Z","updated_at":"2016-08-11T16:57:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4811a5e21dac64a59e116c052330819f55e8c52f","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/pulp/pulp/pulls/2684/commits","review_comments_url":"https://api.github.com/repos/pulp/pulp/pulls/2684/comments","review_comment_url":"https://api.github.com/repos/pulp/pulp/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pulp/pulp/issues/2684/comments","statuses_url":"https://api.github.com/repos/pulp/pulp/statuses/5df18e37f1b743d5b9040f424e0db183a61ed312","head":{"label":"jortel:3.0-dev-2089","ref":"3.0-dev-2089","sha":"5df18e37f1b743d5b9040f424e0db183a61ed312","user":{"login":"jortel","id":1126767,"avatar_url":"https://avatars.githubusercontent.com/u/1126767?v=3","gravatar_id":"","url":"https://api.github.com/users/jortel","html_url":"https://github.com/jortel","followers_url":"https://api.github.com/users/jortel/followers","following_url":"https://api.github.com/users/jortel/following{/other_user}","gists_url":"https://api.github.com/users/jortel/gists{/gist_id}","starred_url":"https://api.github.com/users/jortel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jortel/subscriptions","organizations_url":"https://api.github.com/users/jortel/orgs","repos_url":"https://api.github.com/users/jortel/repos","events_url":"https://api.github.com/users/jortel/events{/privacy}","received_events_url":"https://api.github.com/users/jortel/received_events","type":"User","site_admin":false},"repo":{"id":26142168,"name":"pulp","full_name":"jortel/pulp","owner":{"login":"jortel","id":1126767,"avatar_url":"https://avatars.githubusercontent.com/u/1126767?v=3","gravatar_id":"","url":"https://api.github.com/users/jortel","html_url":"https://github.com/jortel","followers_url":"https://api.github.com/users/jortel/followers","following_url":"https://api.github.com/users/jortel/following{/other_user}","gists_url":"https://api.github.com/users/jortel/gists{/gist_id}","starred_url":"https://api.github.com/users/jortel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jortel/subscriptions","organizations_url":"https://api.github.com/users/jortel/orgs","repos_url":"https://api.github.com/users/jortel/repos","events_url":"https://api.github.com/users/jortel/events{/privacy}","received_events_url":"https://api.github.com/users/jortel/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jortel/pulp","description":"Repository for Pulp platform code, including the server and base admin and consumer clients","fork":true,"url":"https://api.github.com/repos/jortel/pulp","forks_url":"https://api.github.com/repos/jortel/pulp/forks","keys_url":"https://api.github.com/repos/jortel/pulp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jortel/pulp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jortel/pulp/teams","hooks_url":"https://api.github.com/repos/jortel/pulp/hooks","issue_events_url":"https://api.github.com/repos/jortel/pulp/issues/events{/number}","events_url":"https://api.github.com/repos/jortel/pulp/events","assignees_url":"https://api.github.com/repos/jortel/pulp/assignees{/user}","branches_url":"https://api.github.com/repos/jortel/pulp/branches{/branch}","tags_url":"https://api.github.com/repos/jortel/pulp/tags","blobs_url":"https://api.github.com/repos/jortel/pulp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jortel/pulp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jortel/pulp/git/refs{/sha}","trees_url":"https://api.github.com/repos/jortel/pulp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jortel/pulp/statuses/{sha}","languages_url":"https://api.github.com/repos/jortel/pulp/languages","stargazers_url":"https://api.github.com/repos/jortel/pulp/stargazers","contributors_url":"https://api.github.com/repos/jortel/pulp/contributors","subscribers_url":"https://api.github.com/repos/jortel/pulp/subscribers","subscription_url":"https://api.github.com/repos/jortel/pulp/subscription","commits_url":"https://api.github.com/repos/jortel/pulp/commits{/sha}","git_commits_url":"https://api.github.com/repos/jortel/pulp/git/commits{/sha}","comments_url":"https://api.github.com/repos/jortel/pulp/comments{/number}","issue_comment_url":"https://api.github.com/repos/jortel/pulp/issues/comments{/number}","contents_url":"https://api.github.com/repos/jortel/pulp/contents/{+path}","compare_url":"https://api.github.com/repos/jortel/pulp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jortel/pulp/merges","archive_url":"https://api.github.com/repos/jortel/pulp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jortel/pulp/downloads","issues_url":"https://api.github.com/repos/jortel/pulp/issues{/number}","pulls_url":"https://api.github.com/repos/jortel/pulp/pulls{/number}","milestones_url":"https://api.github.com/repos/jortel/pulp/milestones{/number}","notifications_url":"https://api.github.com/repos/jortel/pulp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jortel/pulp/labels{/name}","releases_url":"https://api.github.com/repos/jortel/pulp/releases{/id}","deployments_url":"https://api.github.com/repos/jortel/pulp/deployments","created_at":"2014-11-03T22:37:29Z","updated_at":"2016-01-13T20:46:29Z","pushed_at":"2016-08-10T18:07:16Z","git_url":"git://github.com/jortel/pulp.git","ssh_url":"git@github.com:jortel/pulp.git","clone_url":"https://github.com/jortel/pulp.git","svn_url":"https://github.com/jortel/pulp","homepage":"","size":91830,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"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":"pulp:3.0-dev","ref":"3.0-dev","sha":"5165b0a29cd4e54f7d8e7a82be5115eec05b0778","user":{"login":"pulp","id":2103606,"avatar_url":"https://avatars.githubusercontent.com/u/2103606?v=3","gravatar_id":"","url":"https://api.github.com/users/pulp","html_url":"https://github.com/pulp","followers_url":"https://api.github.com/users/pulp/followers","following_url":"https://api.github.com/users/pulp/following{/other_user}","gists_url":"https://api.github.com/users/pulp/gists{/gist_id}","starred_url":"https://api.github.com/users/pulp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pulp/subscriptions","organizations_url":"https://api.github.com/users/pulp/orgs","repos_url":"https://api.github.com/users/pulp/repos","events_url":"https://api.github.com/users/pulp/events{/privacy}","received_events_url":"https://api.github.com/users/pulp/received_events","type":"Organization","site_admin":false},"repo":{"id":5314652,"name":"pulp","full_name":"pulp/pulp","owner":{"login":"pulp","id":2103606,"avatar_url":"https://avatars.githubusercontent.com/u/2103606?v=3","gravatar_id":"","url":"https://api.github.com/users/pulp","html_url":"https://github.com/pulp","followers_url":"https://api.github.com/users/pulp/followers","following_url":"https://api.github.com/users/pulp/following{/other_user}","gists_url":"https://api.github.com/users/pulp/gists{/gist_id}","starred_url":"https://api.github.com/users/pulp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pulp/subscriptions","organizations_url":"https://api.github.com/users/pulp/orgs","repos_url":"https://api.github.com/users/pulp/repos","events_url":"https://api.github.com/users/pulp/events{/privacy}","received_events_url":"https://api.github.com/users/pulp/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/pulp/pulp","description":"Repository for Pulp platform code, including the server and base admin and consumer clients","fork":false,"url":"https://api.github.com/repos/pulp/pulp","forks_url":"https://api.github.com/repos/pulp/pulp/forks","keys_url":"https://api.github.com/repos/pulp/pulp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pulp/pulp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pulp/pulp/teams","hooks_url":"https://api.github.com/repos/pulp/pulp/hooks","issue_events_url":"https://api.github.com/repos/pulp/pulp/issues/events{/number}","events_url":"https://api.github.com/repos/pulp/pulp/events","assignees_url":"https://api.github.com/repos/pulp/pulp/assignees{/user}","branches_url":"https://api.github.com/repos/pulp/pulp/branches{/branch}","tags_url":"https://api.github.com/repos/pulp/pulp/tags","blobs_url":"https://api.github.com/repos/pulp/pulp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pulp/pulp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pulp/pulp/git/refs{/sha}","trees_url":"https://api.github.com/repos/pulp/pulp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pulp/pulp/statuses/{sha}","languages_url":"https://api.github.com/repos/pulp/pulp/languages","stargazers_url":"https://api.github.com/repos/pulp/pulp/stargazers","contributors_url":"https://api.github.com/repos/pulp/pulp/contributors","subscribers_url":"https://api.github.com/repos/pulp/pulp/subscribers","subscription_url":"https://api.github.com/repos/pulp/pulp/subscription","commits_url":"https://api.github.com/repos/pulp/pulp/commits{/sha}","git_commits_url":"https://api.github.com/repos/pulp/pulp/git/commits{/sha}","comments_url":"https://api.github.com/repos/pulp/pulp/comments{/number}","issue_comment_url":"https://api.github.com/repos/pulp/pulp/issues/comments{/number}","contents_url":"https://api.github.com/repos/pulp/pulp/contents/{+path}","compare_url":"https://api.github.com/repos/pulp/pulp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pulp/pulp/merges","archive_url":"https://api.github.com/repos/pulp/pulp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pulp/pulp/downloads","issues_url":"https://api.github.com/repos/pulp/pulp/issues{/number}","pulls_url":"https://api.github.com/repos/pulp/pulp/pulls{/number}","milestones_url":"https://api.github.com/repos/pulp/pulp/milestones{/number}","notifications_url":"https://api.github.com/repos/pulp/pulp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pulp/pulp/labels{/name}","releases_url":"https://api.github.com/repos/pulp/pulp/releases{/id}","deployments_url":"https://api.github.com/repos/pulp/pulp/deployments","created_at":"2012-08-06T13:49:20Z","updated_at":"2016-07-23T19:14:08Z","pushed_at":"2016-08-11T16:20:54Z","git_url":"git://github.com/pulp/pulp.git","ssh_url":"git@github.com:pulp/pulp.git","clone_url":"https://github.com/pulp/pulp.git","svn_url":"https://github.com/pulp/pulp","homepage":"","size":102613,"stargazers_count":274,"watchers_count":274,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":111,"mirror_url":null,"open_issues_count":17,"forks":111,"open_issues":17,"watchers":274,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pulp/pulp/pulls/2684"},"html":{"href":"https://github.com/pulp/pulp/pull/2684"},"issue":{"href":"https://api.github.com/repos/pulp/pulp/issues/2684"},"comments":{"href":"https://api.github.com/repos/pulp/pulp/issues/2684/comments"},"review_comments":{"href":"https://api.github.com/repos/pulp/pulp/pulls/2684/comments"},"review_comment":{"href":"https://api.github.com/repos/pulp/pulp/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pulp/pulp/pulls/2684/commits"},"statuses":{"href":"https://api.github.com/repos/pulp/pulp/statuses/5df18e37f1b743d5b9040f424e0db183a61ed312"}}}}
{"actor":{"display_login":"mhrivnak"}}