{"action":"created","comment":{"url":"https://api.github.com/repos/owncloud/core/pulls/comments/85365697","pull_request_review_id":6085485,"id":85365697,"diff_hunk":"@@ -0,0 +1,145 @@\n+<?php\n+/**\n+ * @author Jörn Friedrich Dreyer <jfd@butonic.de>\n+ *\n+ * @copyright Copyright (c) 2016, ownCloud GmbH.\n+ * @license AGPL-3.0\n+ *\n+ * This code is free software: you can redistribute it and/or modify\n+ * it under the terms of the GNU Affero General Public License, version 3,\n+ * as published by the Free Software Foundation.\n+ *\n+ * This program is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+ * GNU Affero General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU Affero General Public License, version 3,\n+ * along with this program.  If not, see <http://www.gnu.org/licenses/>\n+ *\n+ */\n+\n+namespace OCA\\Files_Sharing\\Command;\n+\n+use OCP\\DB\\QueryBuilder\\IQueryBuilder;\n+use OCP\\IDBConnection;\n+use Symfony\\Component\\Console\\Command\\Command;\n+use Symfony\\Component\\Console\\Input\\InputInterface;\n+use Symfony\\Component\\Console\\Input\\InputOption;\n+use Symfony\\Component\\Console\\Output\\OutputInterface;\n+\n+/**\n+ * Delete all storage entries that have no matching entries in the shares_external table.\n+ */\n+class CleanupRemoteStorages extends Command {\n+\n+\t/**\n+\t * @var IDBConnection\n+\t */\n+\tprotected $connection;\n+\n+\tpublic function __construct(IDBConnection $connection) {\n+\t\t$this->connection = $connection;\n+\t\tparent::__construct();\n+\t}\n+\n+\tprotected function configure() {\n+\t\t$this\n+\t\t\t->setName('sharing:cleanup-remote-storages')\n+\t\t\t->setDescription('Show or delete storage entries that have no matching entries in the shares_external table')\n+\t\t\t->addOption(\n+\t\t\t\t'dry-run',\n+\t\t\t\tnull,\n+\t\t\t\tInputOption::VALUE_NONE,\n+\t\t\t\t'only show which storages would be deleted'\n+\t\t\t);\n+\t}\n+\n+\tpublic function execute(InputInterface $input, OutputInterface $output) {\n+\n+\t\t$remoteStorages = $this->getRemoteStorages();\n+\n+\t\t$output->writeln(count($remoteStorages) . \" remote storage(s) need(s) to be checked\");\n+\n+\t\t$remoteShareIds = $this->getRemoteShareIds();\n+\n+\t\t$output->writeln(count($remoteShareIds) . \" remote share(s) exist\");\n+\n+\t\tforeach ($remoteShareIds as $id => $remoteShareId) {\n+\t\t\tif (isset($remoteStorages[$remoteShareId])) {\n+\t\t\t\t$output->writeln(\"$remoteShareId belongs to remote share $id\");\n+\t\t\t\tunset($remoteStorages[$remoteShareId]);\n+\t\t\t} else {\n+\t\t\t\t$output->writeln(\"$remoteShareId for share $id has no matching storage, yet\");\n+\t\t\t}\n+\t\t}\n+\n+\t\tif (empty($remoteStorages)) {\n+\t\t\t$output->writeln(\"no storages deleted\");\n+\t\t} else {\n+\t\t\t$dryRun = $input->getOption('dry-run');\n+\t\t\tforeach ($remoteStorages as $id => $numericId) {\n+\t\t\t\tif ($dryRun) {\n+\t\t\t\t\t$output->writeln(\"$id [$numericId] can be deleted\");\n+\t\t\t\t} else {\n+\t\t\t\t\t$this->deleteStorage($id, $numericId, $output);\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\tpublic function deleteStorage ($id, $numericId, OutputInterface $output) {\n+\t\t$queryBuilder = \\OC::$server->getDatabaseConnection()->getQueryBuilder();\n+\t\t$queryBuilder->delete('storages')\n+\t\t\t->where($queryBuilder->expr()->eq(\n+\t\t\t\t'id',\n+\t\t\t\t$queryBuilder->createNamedParameter($id, IQueryBuilder::PARAM_STR),\n+\t\t\t\tIQueryBuilder::PARAM_STR)\n+\t\t\t);\n+\t\t$output->write(\"deleting $id [$numericId] ... \");\n+\t\t$count = $queryBuilder->execute();\n+\t\t$output->writeln(\"deleted $count\");\n+\t}\n+\n+\tpublic function getRemoteStorages() {\n+\n+\t\t$queryBuilder = \\OC::$server->getDatabaseConnection()->getQueryBuilder();\n+\t\t$queryBuilder->select(['id', 'numeric_id'])\n+\t\t\t->from('storages')\n+\t\t\t->where($queryBuilder->expr()->like(\n+\t\t\t\t'id',\n+\t\t\t\t$queryBuilder->createNamedParameter('shared::________________________________', IQueryBuilder::PARAM_STR),\n+\t\t\t\tIQueryBuilder::PARAM_STR)\n+\t\t\t)\n+\t\t\t->andWhere($queryBuilder->expr()->notLike(\n+\t\t\t\t'id',\n+\t\t\t\t$queryBuilder->createNamedParameter('shared::/%', IQueryBuilder::PARAM_STR),","path":"apps/files_sharing/lib/Command/CleanupRemoteStorages.php","position":116,"original_position":116,"commit_id":"55a702e19d78496057e47fad343f13bc395dee79","original_commit_id":"55a702e19d78496057e47fad343f13bc395dee79","user":{"login":"PVince81","id":277525,"avatar_url":"https://avatars.githubusercontent.com/u/277525?v=3","gravatar_id":"","url":"https://api.github.com/users/PVince81","html_url":"https://github.com/PVince81","followers_url":"https://api.github.com/users/PVince81/followers","following_url":"https://api.github.com/users/PVince81/following{/other_user}","gists_url":"https://api.github.com/users/PVince81/gists{/gist_id}","starred_url":"https://api.github.com/users/PVince81/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PVince81/subscriptions","organizations_url":"https://api.github.com/users/PVince81/orgs","repos_url":"https://api.github.com/users/PVince81/repos","events_url":"https://api.github.com/users/PVince81/events{/privacy}","received_events_url":"https://api.github.com/users/PVince81/received_events","type":"User","site_admin":false},"body":"good call, just to be safe","created_at":"2016-10-27T15:42:05Z","updated_at":"2016-10-27T15:53:51Z","html_url":"https://github.com/owncloud/core/pull/26379#discussion_r85365697","pull_request_url":"https://api.github.com/repos/owncloud/core/pulls/26379","_links":{"self":{"href":"https://api.github.com/repos/owncloud/core/pulls/comments/85365697"},"html":{"href":"https://github.com/owncloud/core/pull/26379#discussion_r85365697"},"pull_request":{"href":"https://api.github.com/repos/owncloud/core/pulls/26379"}}},"pull_request":{"url":"https://api.github.com/repos/owncloud/core/pulls/26379","id":89375295,"html_url":"https://github.com/owncloud/core/pull/26379","diff_url":"https://github.com/owncloud/core/pull/26379.diff","patch_url":"https://github.com/owncloud/core/pull/26379.patch","issue_url":"https://api.github.com/repos/owncloud/core/issues/26379","number":26379,"state":"open","locked":false,"title":"Add CleanupRemoteStorages command","user":{"login":"butonic","id":956847,"avatar_url":"https://avatars.githubusercontent.com/u/956847?v=3","gravatar_id":"","url":"https://api.github.com/users/butonic","html_url":"https://github.com/butonic","followers_url":"https://api.github.com/users/butonic/followers","following_url":"https://api.github.com/users/butonic/following{/other_user}","gists_url":"https://api.github.com/users/butonic/gists{/gist_id}","starred_url":"https://api.github.com/users/butonic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/butonic/subscriptions","organizations_url":"https://api.github.com/users/butonic/orgs","repos_url":"https://api.github.com/users/butonic/repos","events_url":"https://api.github.com/users/butonic/events{/privacy}","received_events_url":"https://api.github.com/users/butonic/received_events","type":"User","site_admin":false},"body":"<!--\r\nThanks for submitting a change to ownCloud!\r\n\r\nThis is the bug tracker for the Server component. Find other components at https://github.com/owncloud/core/blob/master/.github/CONTRIBUTING.md#guidelines\r\n\r\nFor fixing potential security issues please see https://owncloud.org/security/\r\n\r\nTo make it possible for us to get your change reviewed and merged please fill out below information carefully.\r\n\r\nPlease note that any kind of change first has to be submitted to the master branch which holds the next major version of ownCloud.\r\n\r\nWe will carefully discuss if your change can or has to be backported to stable branches.\r\n-->\r\n\r\n## Description\r\n```console\r\n# occ sharing:cleanup-remote-storages --help\r\nUsage:\r\n  sharing:cleanup-remote-storages\r\n\r\nOptions:\r\n  -h, --help            Display this help message\r\n[...]\r\nHelp:\r\n Delete all storage entries that have no matching entries in the shares_external table\r\n```\r\n\r\n## Related Issue\r\n<!--- This project only accepts pull requests related to open issues -->\r\n<!--- If suggesting a new feature or change, please discuss it in an issue first -->\r\n<!--- If fixing a bug, there should be an issue describing it with steps to reproduce -->\r\n<!--- Please link to the issue here: -->\r\ncleanup for https://github.com/owncloud/core/issues/15701\r\n- [ ] ~~find the right place where we can delete the storage along with the remote share~~ in https://github.com/owncloud/core/pull/26490\r\n\r\n## Motivation and Context\r\n<!--- Why is this change required? What problem does it solve? -->\r\nremote storages with \"shared::<md5>\" never get deleted. This becomes a problem if a user has reshared an incoming remote share that has been deleted, because that internal re share never gets deleted (fileid still exists in filecache and storage for that file is never deleted). The reshare recipient now gets an errer when trying to access that file/folder. \r\n\r\n## How Has This Been Tested?\r\n<!--- Please describe in detail how you tested your changes. -->\r\n<!--- Include details of your testing environment, and the tests you ran to -->\r\n<!--- see how your change affects other areas of the code, etc. -->\r\non my personal instance:\r\n```\r\n18 remote storage(s) need(s) to be checked\r\n8 remote share(s) exist\r\nshared::801c61b92c2aae00412ee21003bd2026 belongs to remote share 11\r\nshared::7fe41a07d3f517a923f4b2b599e72cbb belongs to remote share 12\r\nshared::af712293ab5eb9e6b1745a13818b99fe belongs to remote share 13\r\nshared::c885155131f4487e025943244f4116b1 belongs to remote share 14\r\nshared::113174afdf6e830fc0d7f1c00ec1a581 belongs to remote share 15\r\nshared::6c2632ea130cd1bfc21d839bdc656e62 belongs to remote share 16\r\nshared::cf3b58cc953fdef753867fd4d96a24b7 belongs to remote share 17\r\nshared::0293022aa2a0813ab3f3488ef9336d6b has no matching storage, yet\r\nshared::0ba88523c45c206b91ad8b97141ff020 [23] can be deleted\r\nshared::0d45f25ee68fe0cda20df2139620082e [26] can be deleted\r\nshared::207d9354a47a54e5749b235d0f42aac4 [22] can be deleted\r\nshared::4c783debcc30ff253cf93f2a94a90c08 [27] can be deleted\r\nshared::57ae748a3aa8934484aa70b23675cc93 [35] can be deleted\r\nshared::662f5adeffe1a342f9475066bf94a0f3 [24] can be deleted\r\nshared::99bb21dca2832e9311e3714dd92b8ff2 [18] can be deleted\r\nshared::9b9f0b149480a3baaab8156eb64e5165 [21] can be deleted\r\nshared::ac6f074d3b011e20b0f6a0a5c79b8b4b [20] can be deleted\r\nshared::f7de882bbfcc2cf26780098fda9e1657 [34] can be deleted\r\nshared::fd171b4b7b3c5907f4983e7825e96725 [25] can be deleted\r\n```\r\n\r\n\r\n## Screenshots (if appropriate):\r\nsee above\r\n\r\n## Types of changes\r\n<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->\r\n- [x] Bug fix (non-breaking change which fixes an issue)\r\n- [x] New feature (non-breaking change which adds functionality)\r\n- [ ] Breaking change (fix or feature that would cause existing functionality to change)\r\n\r\n## Checklist:\r\n<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->\r\n<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->\r\n- [x] My code follows the code style of this project.\r\n- [x] My change requires a change to the documentation.\r\n- [ ] I have updated the documentation accordingly.\r\n- [x] I have read the **CONTRIBUTING** document.\r\n- [x] I have added tests to cover my changes.\r\n- [ ] All new and existing tests passed.\r\n\r\n# TODO\r\n- [x] actually delete storages and files\r\n- [ ] what happens when accessing a loca reshare of a remote storage that becomes unavailable (eg. due to network outage)","created_at":"2016-10-14T12:24:46Z","updated_at":"2016-10-27T15:53:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a5d5eec4874297a097b783af382620353d906d64","assignee":{"login":"butonic","id":956847,"avatar_url":"https://avatars.githubusercontent.com/u/956847?v=3","gravatar_id":"","url":"https://api.github.com/users/butonic","html_url":"https://github.com/butonic","followers_url":"https://api.github.com/users/butonic/followers","following_url":"https://api.github.com/users/butonic/following{/other_user}","gists_url":"https://api.github.com/users/butonic/gists{/gist_id}","starred_url":"https://api.github.com/users/butonic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/butonic/subscriptions","organizations_url":"https://api.github.com/users/butonic/orgs","repos_url":"https://api.github.com/users/butonic/repos","events_url":"https://api.github.com/users/butonic/events{/privacy}","received_events_url":"https://api.github.com/users/butonic/received_events","type":"User","site_admin":false},"assignees":[{"login":"butonic","id":956847,"avatar_url":"https://avatars.githubusercontent.com/u/956847?v=3","gravatar_id":"","url":"https://api.github.com/users/butonic","html_url":"https://github.com/butonic","followers_url":"https://api.github.com/users/butonic/followers","following_url":"https://api.github.com/users/butonic/following{/other_user}","gists_url":"https://api.github.com/users/butonic/gists{/gist_id}","starred_url":"https://api.github.com/users/butonic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/butonic/subscriptions","organizations_url":"https://api.github.com/users/butonic/orgs","repos_url":"https://api.github.com/users/butonic/repos","events_url":"https://api.github.com/users/butonic/events{/privacy}","received_events_url":"https://api.github.com/users/butonic/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/owncloud/core/pulls/26379/commits","review_comments_url":"https://api.github.com/repos/owncloud/core/pulls/26379/comments","review_comment_url":"https://api.github.com/repos/owncloud/core/pulls/comments{/number}","comments_url":"https://api.github.com/repos/owncloud/core/issues/26379/comments","statuses_url":"https://api.github.com/repos/owncloud/core/statuses/55a702e19d78496057e47fad343f13bc395dee79","head":{"label":"owncloud:cleanupremotestorages","ref":"cleanupremotestorages","sha":"55a702e19d78496057e47fad343f13bc395dee79","user":{"login":"owncloud","id":1645051,"avatar_url":"https://avatars.githubusercontent.com/u/1645051?v=3","gravatar_id":"","url":"https://api.github.com/users/owncloud","html_url":"https://github.com/owncloud","followers_url":"https://api.github.com/users/owncloud/followers","following_url":"https://api.github.com/users/owncloud/following{/other_user}","gists_url":"https://api.github.com/users/owncloud/gists{/gist_id}","starred_url":"https://api.github.com/users/owncloud/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/owncloud/subscriptions","organizations_url":"https://api.github.com/users/owncloud/orgs","repos_url":"https://api.github.com/users/owncloud/repos","events_url":"https://api.github.com/users/owncloud/events{/privacy}","received_events_url":"https://api.github.com/users/owncloud/received_events","type":"Organization","site_admin":false},"repo":{"id":5550552,"name":"core","full_name":"owncloud/core","owner":{"login":"owncloud","id":1645051,"avatar_url":"https://avatars.githubusercontent.com/u/1645051?v=3","gravatar_id":"","url":"https://api.github.com/users/owncloud","html_url":"https://github.com/owncloud","followers_url":"https://api.github.com/users/owncloud/followers","following_url":"https://api.github.com/users/owncloud/following{/other_user}","gists_url":"https://api.github.com/users/owncloud/gists{/gist_id}","starred_url":"https://api.github.com/users/owncloud/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/owncloud/subscriptions","organizations_url":"https://api.github.com/users/owncloud/orgs","repos_url":"https://api.github.com/users/owncloud/repos","events_url":"https://api.github.com/users/owncloud/events{/privacy}","received_events_url":"https://api.github.com/users/owncloud/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/owncloud/core","description":":cloud: ownCloud web server core (Files, DAV, etc.)","fork":false,"url":"https://api.github.com/repos/owncloud/core","forks_url":"https://api.github.com/repos/owncloud/core/forks","keys_url":"https://api.github.com/repos/owncloud/core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/owncloud/core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/owncloud/core/teams","hooks_url":"https://api.github.com/repos/owncloud/core/hooks","issue_events_url":"https://api.github.com/repos/owncloud/core/issues/events{/number}","events_url":"https://api.github.com/repos/owncloud/core/events","assignees_url":"https://api.github.com/repos/owncloud/core/assignees{/user}","branches_url":"https://api.github.com/repos/owncloud/core/branches{/branch}","tags_url":"https://api.github.com/repos/owncloud/core/tags","blobs_url":"https://api.github.com/repos/owncloud/core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/owncloud/core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/owncloud/core/git/refs{/sha}","trees_url":"https://api.github.com/repos/owncloud/core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/owncloud/core/statuses/{sha}","languages_url":"https://api.github.com/repos/owncloud/core/languages","stargazers_url":"https://api.github.com/repos/owncloud/core/stargazers","contributors_url":"https://api.github.com/repos/owncloud/core/contributors","subscribers_url":"https://api.github.com/repos/owncloud/core/subscribers","subscription_url":"https://api.github.com/repos/owncloud/core/subscription","commits_url":"https://api.github.com/repos/owncloud/core/commits{/sha}","git_commits_url":"https://api.github.com/repos/owncloud/core/git/commits{/sha}","comments_url":"https://api.github.com/repos/owncloud/core/comments{/number}","issue_comment_url":"https://api.github.com/repos/owncloud/core/issues/comments{/number}","contents_url":"https://api.github.com/repos/owncloud/core/contents/{+path}","compare_url":"https://api.github.com/repos/owncloud/core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/owncloud/core/merges","archive_url":"https://api.github.com/repos/owncloud/core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/owncloud/core/downloads","issues_url":"https://api.github.com/repos/owncloud/core/issues{/number}","pulls_url":"https://api.github.com/repos/owncloud/core/pulls{/number}","milestones_url":"https://api.github.com/repos/owncloud/core/milestones{/number}","notifications_url":"https://api.github.com/repos/owncloud/core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/owncloud/core/labels{/name}","releases_url":"https://api.github.com/repos/owncloud/core/releases{/id}","deployments_url":"https://api.github.com/repos/owncloud/core/deployments","created_at":"2012-08-25T10:32:48Z","updated_at":"2016-10-27T15:38:44Z","pushed_at":"2016-10-27T15:32:10Z","git_url":"git://github.com/owncloud/core.git","ssh_url":"git@github.com:owncloud/core.git","clone_url":"https://github.com/owncloud/core.git","svn_url":"https://github.com/owncloud/core","homepage":"https://owncloud.org/","size":327801,"stargazers_count":4910,"watchers_count":4910,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1586,"mirror_url":null,"open_issues_count":1733,"forks":1586,"open_issues":1733,"watchers":4910,"default_branch":"master"}},"base":{"label":"owncloud:master","ref":"master","sha":"5297c40374bdf396a83466501b37ba53ee2471da","user":{"login":"owncloud","id":1645051,"avatar_url":"https://avatars.githubusercontent.com/u/1645051?v=3","gravatar_id":"","url":"https://api.github.com/users/owncloud","html_url":"https://github.com/owncloud","followers_url":"https://api.github.com/users/owncloud/followers","following_url":"https://api.github.com/users/owncloud/following{/other_user}","gists_url":"https://api.github.com/users/owncloud/gists{/gist_id}","starred_url":"https://api.github.com/users/owncloud/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/owncloud/subscriptions","organizations_url":"https://api.github.com/users/owncloud/orgs","repos_url":"https://api.github.com/users/owncloud/repos","events_url":"https://api.github.com/users/owncloud/events{/privacy}","received_events_url":"https://api.github.com/users/owncloud/received_events","type":"Organization","site_admin":false},"repo":{"id":5550552,"name":"core","full_name":"owncloud/core","owner":{"login":"owncloud","id":1645051,"avatar_url":"https://avatars.githubusercontent.com/u/1645051?v=3","gravatar_id":"","url":"https://api.github.com/users/owncloud","html_url":"https://github.com/owncloud","followers_url":"https://api.github.com/users/owncloud/followers","following_url":"https://api.github.com/users/owncloud/following{/other_user}","gists_url":"https://api.github.com/users/owncloud/gists{/gist_id}","starred_url":"https://api.github.com/users/owncloud/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/owncloud/subscriptions","organizations_url":"https://api.github.com/users/owncloud/orgs","repos_url":"https://api.github.com/users/owncloud/repos","events_url":"https://api.github.com/users/owncloud/events{/privacy}","received_events_url":"https://api.github.com/users/owncloud/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/owncloud/core","description":":cloud: ownCloud web server core (Files, DAV, etc.)","fork":false,"url":"https://api.github.com/repos/owncloud/core","forks_url":"https://api.github.com/repos/owncloud/core/forks","keys_url":"https://api.github.com/repos/owncloud/core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/owncloud/core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/owncloud/core/teams","hooks_url":"https://api.github.com/repos/owncloud/core/hooks","issue_events_url":"https://api.github.com/repos/owncloud/core/issues/events{/number}","events_url":"https://api.github.com/repos/owncloud/core/events","assignees_url":"https://api.github.com/repos/owncloud/core/assignees{/user}","branches_url":"https://api.github.com/repos/owncloud/core/branches{/branch}","tags_url":"https://api.github.com/repos/owncloud/core/tags","blobs_url":"https://api.github.com/repos/owncloud/core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/owncloud/core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/owncloud/core/git/refs{/sha}","trees_url":"https://api.github.com/repos/owncloud/core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/owncloud/core/statuses/{sha}","languages_url":"https://api.github.com/repos/owncloud/core/languages","stargazers_url":"https://api.github.com/repos/owncloud/core/stargazers","contributors_url":"https://api.github.com/repos/owncloud/core/contributors","subscribers_url":"https://api.github.com/repos/owncloud/core/subscribers","subscription_url":"https://api.github.com/repos/owncloud/core/subscription","commits_url":"https://api.github.com/repos/owncloud/core/commits{/sha}","git_commits_url":"https://api.github.com/repos/owncloud/core/git/commits{/sha}","comments_url":"https://api.github.com/repos/owncloud/core/comments{/number}","issue_comment_url":"https://api.github.com/repos/owncloud/core/issues/comments{/number}","contents_url":"https://api.github.com/repos/owncloud/core/contents/{+path}","compare_url":"https://api.github.com/repos/owncloud/core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/owncloud/core/merges","archive_url":"https://api.github.com/repos/owncloud/core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/owncloud/core/downloads","issues_url":"https://api.github.com/repos/owncloud/core/issues{/number}","pulls_url":"https://api.github.com/repos/owncloud/core/pulls{/number}","milestones_url":"https://api.github.com/repos/owncloud/core/milestones{/number}","notifications_url":"https://api.github.com/repos/owncloud/core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/owncloud/core/labels{/name}","releases_url":"https://api.github.com/repos/owncloud/core/releases{/id}","deployments_url":"https://api.github.com/repos/owncloud/core/deployments","created_at":"2012-08-25T10:32:48Z","updated_at":"2016-10-27T15:38:44Z","pushed_at":"2016-10-27T15:32:10Z","git_url":"git://github.com/owncloud/core.git","ssh_url":"git@github.com:owncloud/core.git","clone_url":"https://github.com/owncloud/core.git","svn_url":"https://github.com/owncloud/core","homepage":"https://owncloud.org/","size":327801,"stargazers_count":4910,"watchers_count":4910,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1586,"mirror_url":null,"open_issues_count":1733,"forks":1586,"open_issues":1733,"watchers":4910,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/owncloud/core/pulls/26379"},"html":{"href":"https://github.com/owncloud/core/pull/26379"},"issue":{"href":"https://api.github.com/repos/owncloud/core/issues/26379"},"comments":{"href":"https://api.github.com/repos/owncloud/core/issues/26379/comments"},"review_comments":{"href":"https://api.github.com/repos/owncloud/core/pulls/26379/comments"},"review_comment":{"href":"https://api.github.com/repos/owncloud/core/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/owncloud/core/pulls/26379/commits"},"statuses":{"href":"https://api.github.com/repos/owncloud/core/statuses/55a702e19d78496057e47fad343f13bc395dee79"}}}}
{"actor":{"display_login":"PVince81"}}