{"action":"created","comment":{"url":"https://api.github.com/repos/owncloud/core/pulls/comments/36409909","id":36409909,"diff_hunk":"@@ -0,0 +1,244 @@\n+<?php\n+/**\n+ * @author Björn Schießle <schiessle@owncloud.com>\n+ *\n+ * @copyright Copyright (c) 2015, ownCloud, Inc.\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+\n+namespace Tests\\Core\\Command\\Encryption;\n+\n+\n+use OC\\Core\\Command\\Encryption\\ChangeKeyStorageRoot;\n+use OC\\Encryption\\Util;\n+use OC\\Files\\View;\n+use OCP\\IConfig;\n+use OCP\\IUserManager;\n+use Symfony\\Component\\Console\\Helper\\QuestionHelper;\n+use Symfony\\Component\\Console\\Input\\InputInterface;\n+use Symfony\\Component\\Console\\Output\\OutputInterface;\n+use Test\\TestCase;\n+\n+class ChangeKeyStorageRootTest extends TestCase {\n+\n+\t/** @var ChangeKeyStorageRoot */\n+\tprotected $changeKeyStorageRoot;\n+\n+\t/** @var View | \\PHPUnit_Framework_MockObject_MockObject */\n+\tprotected $view;\n+\n+\t/** @var IUserManager | \\PHPUnit_Framework_MockObject_MockObject */\n+\tprotected $userManager;\n+\n+\t/** @var IConfig | \\PHPUnit_Framework_MockObject_MockObject */\n+\tprotected $config;\n+\n+\t/**  @var Util | \\PHPUnit_Framework_MockObject_MockObject */\n+\tprotected $util;\n+\n+\t/** @var QuestionHelper | \\PHPUnit_Framework_MockObject_MockObject */\n+\tprotected $questionHelper;\n+\n+\t/** @var InputInterface | \\PHPUnit_Framework_MockObject_MockObject */\n+\tprotected $inputInterface;\n+\n+\t/** @var OutputInterface | \\PHPUnit_Framework_MockObject_MockObject */\n+\tprotected $outputInterface;\n+\n+\tpublic function setUp() {\n+\t\tparent::setUp();\n+\n+\t\t$this->view = $this->getMock('\\OC\\Files\\View');\n+\t\t$this->userManager = $this->getMock('\\OCP\\IUserManager');\n+\t\t$this->config = $this->getMock('\\OCP\\IConfig');\n+\t\t$this->util = $this->getMockBuilder('OC\\Encryption\\Util')->disableOriginalConstructor()->getMock();\n+\t\t$this->questionHelper = $this->getMock('Symfony\\Component\\Console\\Helper\\QuestionHelper');\n+\t\t$this->inputInterface = $this->getMock('Symfony\\Component\\Console\\Input\\InputInterface');\n+\t\t$this->outputInterface = $this->getMock('Symfony\\Component\\Console\\Output\\OutputInterface');\n+\n+\t\t$outputFormaterInterface = $this->getMock('Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface');\n+\t\t$this->outputInterface->expects($this->any())->method('getFormatter')\n+\t\t\t->willReturn($outputFormaterInterface);\n+\n+\t\t$this->changeKeyStorageRoot = new ChangeKeyStorageRoot(\n+\t\t\t$this->view,\n+\t\t\t$this->userManager,\n+\t\t\t$this->config,\n+\t\t\t$this->util,\n+\t\t\t$this->questionHelper\n+\t\t);\n+\n+\t}\n+\n+\t/**\n+\t * @dataProvider dataTestExecute\n+\t */\n+\tpublic function testExecute($newRoot, $answer, $successMoveKey) {\n+\n+\t\t$changeKeyStorageRoot = $this->getMockBuilder('OC\\Core\\Command\\Encryption\\ChangeKeyStorageRoot')\n+\t\t\t->setConstructorArgs(\n+\t\t\t\t[\n+\t\t\t\t\t$this->view,\n+\t\t\t\t\t$this->userManager,\n+\t\t\t\t\t$this->config,\n+\t\t\t\t\t$this->util,\n+\t\t\t\t\t$this->questionHelper\n+\t\t\t\t]\n+\t\t\t)->setMethods(['moveKeys'])->getMock();\n+\n+\t\t$this->util->expects($this->once())->method('getKeyStorageRoot')\n+\t\t\t->willReturn('');\n+\t\t$this->inputInterface->expects($this->once())->method('getArgument')\n+\t\t\t->with('newRoot')->willReturn($newRoot);\n+\n+\t\tif ($answer === true || $newRoot !== null) {\n+\t\t\t$changeKeyStorageRoot->expects($this->once())->method('moveKeys')\n+\t\t\t\t->willReturn($successMoveKey);\n+\t\t} else {\n+\t\t\t$changeKeyStorageRoot->expects($this->never())->method('moveKeys');\n+\t\t}\n+\n+\t\tif ($successMoveKey === true) {\n+\t\t\t$this->util->expects($this->once())->method('setKeyStorageRoot');\n+\t\t} else {\n+\t\t\t$this->util->expects($this->never())->method('setKeyStorageRoot');\n+\t\t}\n+\n+\t\tif ($newRoot === null) {\n+\t\t\t$this->questionHelper->expects($this->once())->method('ask')->willReturn($answer);\n+\t\t} else {\n+\t\t\t$this->questionHelper->expects($this->never())->method('ask');\n+\t\t}\n+\n+\t\t$this->invokePrivate(\n+\t\t\t$changeKeyStorageRoot,\n+\t\t\t'execute',\n+\t\t\t[$this->inputInterface, $this->outputInterface]\n+\t\t);\n+\t}\n+\n+\tpublic function dataTestExecute() {\n+\t\treturn [\n+\t\t\t[null, true, true],\n+\t\t\t[null, true, false],\n+\t\t\t[null, false, null],\n+\t\t\t['/newRoot', null, true],\n+\t\t\t['/newRoot', null, false]\n+\t\t];\n+\t}\n+\n+\t/**\n+\t * @dataProvider dataTestMoveKeys\n+\t */\n+\tpublic function testMoveKeys($oldRoot, $newRoot, $dirContent, $expected) {\n+\n+\t\t$this->view->expects($this->any())->method(('is_dir'))\n+\t\t\t->willReturnCallback(\n+\t\t\t\tfunction($path) {\n+\t\t\t\t\tif ($path === 'doesNotExist') {\n+\t\t\t\t\t\treturn false;\n+\t\t\t\t\t}\n+\t\t\t\t\treturn true;\n+\t\t\t\t}\n+\t\t\t);\n+\n+\t\t$this->view->expects($this->any())->method('getDirectoryContent')\n+\t\t\t->willReturn($dirContent);\n+\n+\t\t$changeKeyStorageRoot = $this->getMockBuilder('OC\\Core\\Command\\Encryption\\ChangeKeyStorageRoot')\n+\t\t\t->setConstructorArgs(\n+\t\t\t\t[\n+\t\t\t\t\t$this->view,\n+\t\t\t\t\t$this->userManager,\n+\t\t\t\t\t$this->config,\n+\t\t\t\t\t$this->util,\n+\t\t\t\t\t$this->questionHelper\n+\t\t\t\t]\n+\t\t\t)->setMethods(['moveUserEncryptionFolder'])->getMock();\n+\n+\t\t$changeKeyStorageRoot->expects($this->exactly(count($dirContent)))\n+\t\t\t->method('moveUserEncryptionFolder')\n+\t\t\t->willReturnCallback(\n+\t\t\t\tfunction($user, $old, $new) use ($dirContent, $oldRoot, $newRoot) {\n+\t\t\t\t\t$found = false;\n+\t\t\t\t\tforeach ($dirContent as $c) {\n+\t\t\t\t\t\tif ($c['name'] === $user) {\n+\t\t\t\t\t\t\t$found = true;\n+\t\t\t\t\t\t\tbreak;\n+\t\t\t\t\t\t}\n+\t\t\t\t\t}\n+\t\t\t\t\t$this->assertTrue($found);\n+\t\t\t\t\t$this->assertSame($oldRoot, $old);\n+\t\t\t\t\t$this->assertSame($newRoot, $new);\n+\t\t\t\t}\n+\t\t\t);\n+\n+\n+\t\t$result = $this->invokePrivate(\n+\t\t\t$changeKeyStorageRoot,\n+\t\t\t'moveKeys',\n+\t\t\t[$oldRoot, $newRoot, $this->outputInterface]\n+\t\t);\n+\n+\t\t$this->assertSame($expected, $result);\n+\n+\t}\n+\n+\tpublic function dataTestMoveKeys() {\n+\t\treturn [\n+\t\t\t['/foo', '/bar', [['name' => 'user1'], ['name' => 'user2']], true],\n+\t\t\t['doesNotExist', '/bar', [], false],","path":"tests/core/command/encryption/changekeystorageroottest.php","position":204,"original_position":204,"commit_id":"ac14a9ff1ff6a5b373599183069a29f79a9d3d19","original_commit_id":"ac14a9ff1ff6a5b373599183069a29f79a9d3d19","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":"Please add test cases for moving from default dir '' to another dir and also the reverse.","created_at":"2015-08-06T12:53:23Z","updated_at":"2015-08-06T12:53:23Z","html_url":"https://github.com/owncloud/core/pull/17899#discussion_r36409909","pull_request_url":"https://api.github.com/repos/owncloud/core/pulls/17899","_links":{"self":{"href":"https://api.github.com/repos/owncloud/core/pulls/comments/36409909"},"html":{"href":"https://github.com/owncloud/core/pull/17899#discussion_r36409909"},"pull_request":{"href":"https://api.github.com/repos/owncloud/core/pulls/17899"}}},"pull_request":{"url":"https://api.github.com/repos/owncloud/core/pulls/17899","id":40889924,"html_url":"https://github.com/owncloud/core/pull/17899","diff_url":"https://github.com/owncloud/core/pull/17899.diff","patch_url":"https://github.com/owncloud/core/pull/17899.patch","issue_url":"https://api.github.com/repos/owncloud/core/issues/17899","number":17899,"state":"open","locked":false,"title":"Make root of key storage configurable","user":{"login":"schiesbn","id":1589737,"avatar_url":"https://avatars.githubusercontent.com/u/1589737?v=3","gravatar_id":"","url":"https://api.github.com/users/schiesbn","html_url":"https://github.com/schiesbn","followers_url":"https://api.github.com/users/schiesbn/followers","following_url":"https://api.github.com/users/schiesbn/following{/other_user}","gists_url":"https://api.github.com/users/schiesbn/gists{/gist_id}","starred_url":"https://api.github.com/users/schiesbn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/schiesbn/subscriptions","organizations_url":"https://api.github.com/users/schiesbn/orgs","repos_url":"https://api.github.com/users/schiesbn/repos","events_url":"https://api.github.com/users/schiesbn/events{/privacy}","received_events_url":"https://api.github.com/users/schiesbn/received_events","type":"User","site_admin":false},"body":"Make root of key storage configurable and provide occ script to move the keys from the old root to the new one.\r\n\r\npart of https://github.com/owncloud/core/issues/16341\r\n\r\nNote: The root always need to be in the data/ folder.\r\n\r\nUsage:\r\n\r\n````\r\n$ sudo -u www-data ./occ encryption:change-key-storage-root --help\r\nUsage:\r\n encryption:change-key-storage-root [newRoot]\r\n\r\nArguments:\r\n newRoot               new root of the key storage relative to the data folder\r\n````\r\n\r\nif no \"newRoot\" is given we assume that you want to set the key storage back to the default root. We will ask you to confirm before continue.\r\n\r\nIf you just want to see the current key storage root call:\r\n\r\n````\r\n./occ encryption:show-key-storage-root\r\n````\r\n\r\n- [x] unit tests needed\r\n\r\nImprovements:\r\n\r\n- [x]  move setting to the database and manipulate it with occ only\r\n- [x] add .keystorage hidden file to detect if the storage is mounted or not\r\n- [x] add progress bar\r\n","created_at":"2015-07-27T10:34:39Z","updated_at":"2015-08-06T12:53:23Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a89dd67fcf1310bc34d5d3d07486439fce4fe66a","assignee":null,"milestone":{"url":"https://api.github.com/repos/owncloud/core/milestones/37","html_url":"https://github.com/owncloud/core/milestones/8.2-current","labels_url":"https://api.github.com/repos/owncloud/core/milestones/37/labels","id":993629,"number":37,"title":"8.2-current","description":"","creator":{"login":"craigpg","id":160667,"avatar_url":"https://avatars.githubusercontent.com/u/160667?v=3","gravatar_id":"","url":"https://api.github.com/users/craigpg","html_url":"https://github.com/craigpg","followers_url":"https://api.github.com/users/craigpg/followers","following_url":"https://api.github.com/users/craigpg/following{/other_user}","gists_url":"https://api.github.com/users/craigpg/gists{/gist_id}","starred_url":"https://api.github.com/users/craigpg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/craigpg/subscriptions","organizations_url":"https://api.github.com/users/craigpg/orgs","repos_url":"https://api.github.com/users/craigpg/repos","events_url":"https://api.github.com/users/craigpg/events{/privacy}","received_events_url":"https://api.github.com/users/craigpg/received_events","type":"User","site_admin":false},"open_issues":633,"closed_issues":276,"state":"open","created_at":"2015-02-24T16:19:37Z","updated_at":"2015-08-06T10:22:15Z","due_on":"2015-10-20T04:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/owncloud/core/pulls/17899/commits","review_comments_url":"https://api.github.com/repos/owncloud/core/pulls/17899/comments","review_comment_url":"https://api.github.com/repos/owncloud/core/pulls/comments{/number}","comments_url":"https://api.github.com/repos/owncloud/core/issues/17899/comments","statuses_url":"https://api.github.com/repos/owncloud/core/statuses/ac14a9ff1ff6a5b373599183069a29f79a9d3d19","head":{"label":"owncloud:enc_make_key_storage_root_configurable","ref":"enc_make_key_storage_root_configurable","sha":"ac14a9ff1ff6a5b373599183069a29f79a9d3d19","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":"The ownCloud core","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}","created_at":"2012-08-25T10:32:48Z","updated_at":"2015-08-06T09:08:02Z","pushed_at":"2015-08-06T12:33:06Z","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":1081105,"stargazers_count":3530,"watchers_count":3530,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1132,"mirror_url":null,"open_issues_count":1949,"forks":1132,"open_issues":1949,"watchers":3530,"default_branch":"master"}},"base":{"label":"owncloud:master","ref":"master","sha":"a70f145d71808204193d3e1d63ad94bcf849b700","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":"The ownCloud core","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}","created_at":"2012-08-25T10:32:48Z","updated_at":"2015-08-06T09:08:02Z","pushed_at":"2015-08-06T12:33:06Z","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":1081105,"stargazers_count":3530,"watchers_count":3530,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1132,"mirror_url":null,"open_issues_count":1949,"forks":1132,"open_issues":1949,"watchers":3530,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/owncloud/core/pulls/17899"},"html":{"href":"https://github.com/owncloud/core/pull/17899"},"issue":{"href":"https://api.github.com/repos/owncloud/core/issues/17899"},"comments":{"href":"https://api.github.com/repos/owncloud/core/issues/17899/comments"},"review_comments":{"href":"https://api.github.com/repos/owncloud/core/pulls/17899/comments"},"review_comment":{"href":"https://api.github.com/repos/owncloud/core/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/owncloud/core/pulls/17899/commits"},"statuses":{"href":"https://api.github.com/repos/owncloud/core/statuses/ac14a9ff1ff6a5b373599183069a29f79a9d3d19"}}}}