{"action":"created","comment":{"url":"https://api.github.com/repos/alibaba/pouch/pulls/comments/170170160","pull_request_review_id":98816101,"id":170170160,"diff_hunk":"@@ -0,0 +1,307 @@\n+package local\n+\n+import (\n+\t\"fmt\"\n+\t\"io/ioutil\"\n+\t\"strconv\"\n+\t\"strings\"\n+\t\"sync\"\n+\t\"syscall\"\n+\n+\t\"github.com/alibaba/pouch/pkg/bytefmt\"\n+\t\"github.com/alibaba/pouch/pkg/exec\"\n+\n+\t\"github.com/sirupsen/logrus\"\n+)\n+\n+// PrjQuota represents project quota.\n+type PrjQuota struct {\n+\tlock sync.Mutex\n+\t// quotaIDs saves all of quota ids.\n+\tquotaIDs map[uint32]uint32\n+\t// mountPoints saves all the mount point of volume.\n+\tmountPoints map[uint64]string\n+\t// devLimits saves all the limit of device.\n+\tdevLimits map[uint64]uint64\n+\t// quotaLastID is used to mark last used quota id.\n+\tquotaLastID uint32\n+}\n+\n+// StartQuotaDriver is used to start quota driver.\n+func (quota *PrjQuota) StartQuotaDriver(dir string) (string, error) {\n+\tif !UseQuota {\n+\t\treturn \"\", nil\n+\t}\n+\n+\tdevID, err := GetDevID(dir)\n+\tif err != nil {\n+\t\treturn \"\", err\n+\t}\n+\n+\tif _, err = quota.setDevLimit(dir, devID); err != nil {\n+\t\treturn \"\", err\n+\t}\n+\n+\tquota.lock.Lock()\n+\tdefer quota.lock.Unlock()\n+\n+\tif mp, ok := quota.mountPoints[devID]; ok {\n+\t\treturn mp, nil\n+\t}\n+\n+\tmountPoint, hasQuota, _ := quota.CheckMountpoint(devID)\n+\tif len(mountPoint) == 0 {\n+\t\treturn mountPoint, fmt.Errorf(\"mountPoint not found: %s\", dir)\n+\t}\n+\tif !hasQuota {\n+\t\texec.Run(0, \"mount\", \"-o\", \"remount,prjquota\", mountPoint)\n+\t}\n+\n+\t// on\n+\t_, out, _, err := exec.Run(0, \"quotaon\", \"-P\", mountPoint)\n+\tif err != nil {\n+\t\tif strings.Contains(out, \" File exists\") {\n+\t\t\terr = nil\n+\t\t} else {\n+\t\t\tmountPoint = \"\"\n+\t\t}\n+\t}\n+\n+\tquota.mountPoints[devID] = mountPoint\n+\treturn mountPoint, err\n+}\n+\n+// SetSubtree is used to set quota id for directory,\n+//chattr -p qid +P $QUOTAID\n+func (quota *PrjQuota) SetSubtree(dir string, qid uint32) (uint32, error) {\n+\tif !UseQuota {\n+\t\treturn 0, nil\n+\t}\n+\n+\tid := qid\n+\tvar err error\n+\tif id == 0 {\n+\t\tid = quota.GetFileAttr(dir)\n+\t\tif id > 0 {\n+\t\t\treturn id, nil\n+\t\t}\n+\t\tid, err = quota.GetNextQuatoID()\n+\t}\n+\n+\tif err != nil {\n+\t\treturn 0, err\n+\t}\n+\tstrid := strconv.FormatUint(uint64(id), 10)\n+\t_, _, _, err = exec.Run(0, \"chattr\", \"-p\", strid, \"+P\", dir)\n+\treturn id, err\n+}\n+\n+// SetDiskQuota is used to set quota for directory.\n+func (quota *PrjQuota) SetDiskQuota(dir string, size string, quotaID int) error {\n+\tif !UseQuota {\n+\t\treturn nil\n+\t}\n+\n+\tmountPoint, err := quota.StartQuotaDriver(dir)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\tif len(mountPoint) == 0 {\n+\t\treturn fmt.Errorf(\"mountpoint not found: %s\", dir)\n+\t}\n+\n+\tid, err := quota.SetSubtree(dir, uint32(quotaID))\n+\tif id == 0 {\n+\t\treturn fmt.Errorf(\"subtree not found: %s %v\", dir, err)\n+\t}\n+\n+\tlimit, err := bytefmt.ToKilobytes(size)\n+\n+\t// transfer limit from kbyte to byte\n+\tif err := quota.checkDevLimit(dir, limit*1024); err != nil {\n+\t\treturn err\n+\t}\n+\n+\treturn quota.setUserQuota(id, limit, mountPoint)\n+}\n+\n+// CheckMountpoint is used to check mount point.\n+// cat /proc/mounts as follows:\n+// /dev/sda3 / ext4 rw,relatime,data=ordered 0 0\n+// /dev/sda2 /boot/grub2 ext4 rw,relatime,stripe=4,data=ordered 0 0\n+// /dev/sda5 /home ext4 rw,relatime,data=ordered 0 0\n+// /dev/sdb1 /home/pouch ext4 rw,relatime,prjquota,data=ordered 0 0\n+// tmpfs /run tmpfs rw,nosuid,nodev,mode=755 0 0\n+// tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755 0 0\n+// cgroup /sys/fs/cgroup/cpuset,cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct,cpu,cpuset 0 0\n+// cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0\n+// cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0\n+// cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0\n+func (quota *PrjQuota) CheckMountpoint(devID uint64) (string, bool, string) {\n+\toutput, err := ioutil.ReadFile(\"/proc/mounts\")\n+\tif err != nil {\n+\t\tlogrus.Warnf(\"ReadFile: %v\", err)\n+\t\treturn \"\", false, \"\"\n+\t}\n+\n+\tvar mountPoint, fsType string\n+\thasQuota := false\n+\t// /dev/sdb1 /home/pouch ext4 rw,relatime,prjquota,data=ordered 0 0\n+\tfor _, line := range strings.Split(string(output), \"\\n\") {\n+\t\tparts := strings.Split(line, \" \")\n+\t\tif len(parts) != 6 {\n+\t\t\tcontinue\n+\t\t}\n+\t\tdevID2, _ := GetDevID(parts[1])\n+\t\tif devID == devID2 {\n+\t\t\tmountPoint = parts[1]\n+\t\t\tfsType = parts[2]\n+\t\t\tfor _, opt := range strings.Split(parts[3], \",\") {","path":"volume/modules/local/prjquota.go","position":159,"original_position":159,"commit_id":"d964f2e7f2219ea48b80b675820003300770dbe9","original_commit_id":"d964f2e7f2219ea48b80b675820003300770dbe9","user":{"login":"allencloud","id":9465626,"avatar_url":"https://avatars3.githubusercontent.com/u/9465626?v=4","gravatar_id":"","url":"https://api.github.com/users/allencloud","html_url":"https://github.com/allencloud","followers_url":"https://api.github.com/users/allencloud/followers","following_url":"https://api.github.com/users/allencloud/following{/other_user}","gists_url":"https://api.github.com/users/allencloud/gists{/gist_id}","starred_url":"https://api.github.com/users/allencloud/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/allencloud/subscriptions","organizations_url":"https://api.github.com/users/allencloud/orgs","repos_url":"https://api.github.com/users/allencloud/repos","events_url":"https://api.github.com/users/allencloud/events{/privacy}","received_events_url":"https://api.github.com/users/allencloud/received_events","type":"User","site_admin":false},"body":"Could we just use \r\n```\r\nif strings.Contains(parts[3], \"prjquota\") {\r\n    hasQuota = true\r\n}\r\n```","created_at":"2018-02-23T05:34:36Z","updated_at":"2018-02-23T05:34:37Z","html_url":"https://github.com/alibaba/pouch/pull/725#discussion_r170170160","pull_request_url":"https://api.github.com/repos/alibaba/pouch/pulls/725","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/alibaba/pouch/pulls/comments/170170160"},"html":{"href":"https://github.com/alibaba/pouch/pull/725#discussion_r170170160"},"pull_request":{"href":"https://api.github.com/repos/alibaba/pouch/pulls/725"}}},"pull_request":{"url":"https://api.github.com/repos/alibaba/pouch/pulls/725","id":168434085,"html_url":"https://github.com/alibaba/pouch/pull/725","diff_url":"https://github.com/alibaba/pouch/pull/725.diff","patch_url":"https://github.com/alibaba/pouch/pull/725.patch","issue_url":"https://api.github.com/repos/alibaba/pouch/issues/725","number":725,"state":"open","locked":false,"title":"feature: add local disk quota","user":{"login":"rudyfly","id":2264659,"avatar_url":"https://avatars3.githubusercontent.com/u/2264659?v=4","gravatar_id":"","url":"https://api.github.com/users/rudyfly","html_url":"https://github.com/rudyfly","followers_url":"https://api.github.com/users/rudyfly/followers","following_url":"https://api.github.com/users/rudyfly/following{/other_user}","gists_url":"https://api.github.com/users/rudyfly/gists{/gist_id}","starred_url":"https://api.github.com/users/rudyfly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rudyfly/subscriptions","organizations_url":"https://api.github.com/users/rudyfly/orgs","repos_url":"https://api.github.com/users/rudyfly/repos","events_url":"https://api.github.com/users/rudyfly/events{/privacy}","received_events_url":"https://api.github.com/users/rudyfly/received_events","type":"User","site_admin":false},"body":"<!-- \r\nPlease make sure you have read and understood the contributing guidelines;\r\nhttps://github.com/alibaba/pouch/blob/master/CONTRIBUTING.md -->\r\n\r\n### Ⅰ. Describe what this PR did\r\nAdd local disk quota. In alikernel, with dirquota feature to limit\r\ndirectory block size.\r\n\r\n### Ⅱ. Does this pull request fix one issue?\r\n<!--If that, add \"fixes #xxxx\" below in the next line, for example, fixes #15. Otherwise, add \"NONE\" -->\r\nNONE\r\n\r\n### Ⅲ. Describe how you did it\r\n\r\n\r\n### Ⅳ. Describe how to verify it\r\nIn alikernel, you can use it like this:\r\nset volume size is 10G\r\n```bash\r\n#pouch volume create -d local -n pouchvolume -o size=10g\r\nCreatedAt:\r\nDriver:       local\r\nMountpoint:\r\nName:         pouchvolume\r\nScope:\r\n```\r\nrun a container, use df to see the volume size.\r\n```bash\r\n# pouch run -ti -v pouchvolume:/mnt --name test registry.hub.docker.com/library/busybox:latest df -h\r\nFilesystem                Size      Used Available Use% Mounted on\r\noverlay                  29.4G     19.6G      8.3G  70% /\r\ntmpfs                    64.0M         0     64.0M   0% /dev\r\nshm                      64.0M         0     64.0M   0% /dev/shm\r\ntmpfs                    64.0M         0     64.0M   0% /run\r\n/dev/sda3                10.0G      4.0K     10.0G   0% /mnt\r\n```\r\n\r\n### Ⅴ. Special notes for reviews\r\n\r\nSigned-off-by: Rudy Zhang <rudyflyzhang@gmail.com>\r\n","created_at":"2018-02-11T03:24:00Z","updated_at":"2018-02-23T05:34:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e296de02a2a1ce8cd4e717430d04f60e79e6a98f","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":722352215,"url":"https://api.github.com/repos/alibaba/pouch/labels/LGTM","name":"LGTM","color":"88f486","default":false},{"id":722348097,"url":"https://api.github.com/repos/alibaba/pouch/labels/kind/feature","name":"kind/feature","color":"1d76db","default":false},{"id":722355711,"url":"https://api.github.com/repos/alibaba/pouch/labels/size/XXL","name":"size/XXL","color":"cc3d73","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/alibaba/pouch/pulls/725/commits","review_comments_url":"https://api.github.com/repos/alibaba/pouch/pulls/725/comments","review_comment_url":"https://api.github.com/repos/alibaba/pouch/pulls/comments{/number}","comments_url":"https://api.github.com/repos/alibaba/pouch/issues/725/comments","statuses_url":"https://api.github.com/repos/alibaba/pouch/statuses/d964f2e7f2219ea48b80b675820003300770dbe9","head":{"label":"rudyfly:volume","ref":"volume","sha":"d964f2e7f2219ea48b80b675820003300770dbe9","user":{"login":"rudyfly","id":2264659,"avatar_url":"https://avatars3.githubusercontent.com/u/2264659?v=4","gravatar_id":"","url":"https://api.github.com/users/rudyfly","html_url":"https://github.com/rudyfly","followers_url":"https://api.github.com/users/rudyfly/followers","following_url":"https://api.github.com/users/rudyfly/following{/other_user}","gists_url":"https://api.github.com/users/rudyfly/gists{/gist_id}","starred_url":"https://api.github.com/users/rudyfly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rudyfly/subscriptions","organizations_url":"https://api.github.com/users/rudyfly/orgs","repos_url":"https://api.github.com/users/rudyfly/repos","events_url":"https://api.github.com/users/rudyfly/events{/privacy}","received_events_url":"https://api.github.com/users/rudyfly/received_events","type":"User","site_admin":false},"repo":{"id":111486695,"name":"pouch","full_name":"rudyfly/pouch","owner":{"login":"rudyfly","id":2264659,"avatar_url":"https://avatars3.githubusercontent.com/u/2264659?v=4","gravatar_id":"","url":"https://api.github.com/users/rudyfly","html_url":"https://github.com/rudyfly","followers_url":"https://api.github.com/users/rudyfly/followers","following_url":"https://api.github.com/users/rudyfly/following{/other_user}","gists_url":"https://api.github.com/users/rudyfly/gists{/gist_id}","starred_url":"https://api.github.com/users/rudyfly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rudyfly/subscriptions","organizations_url":"https://api.github.com/users/rudyfly/orgs","repos_url":"https://api.github.com/users/rudyfly/repos","events_url":"https://api.github.com/users/rudyfly/events{/privacy}","received_events_url":"https://api.github.com/users/rudyfly/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rudyfly/pouch","description":"Pouch is an open-source project created to promote the container technology movement.","fork":true,"url":"https://api.github.com/repos/rudyfly/pouch","forks_url":"https://api.github.com/repos/rudyfly/pouch/forks","keys_url":"https://api.github.com/repos/rudyfly/pouch/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rudyfly/pouch/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rudyfly/pouch/teams","hooks_url":"https://api.github.com/repos/rudyfly/pouch/hooks","issue_events_url":"https://api.github.com/repos/rudyfly/pouch/issues/events{/number}","events_url":"https://api.github.com/repos/rudyfly/pouch/events","assignees_url":"https://api.github.com/repos/rudyfly/pouch/assignees{/user}","branches_url":"https://api.github.com/repos/rudyfly/pouch/branches{/branch}","tags_url":"https://api.github.com/repos/rudyfly/pouch/tags","blobs_url":"https://api.github.com/repos/rudyfly/pouch/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rudyfly/pouch/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rudyfly/pouch/git/refs{/sha}","trees_url":"https://api.github.com/repos/rudyfly/pouch/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rudyfly/pouch/statuses/{sha}","languages_url":"https://api.github.com/repos/rudyfly/pouch/languages","stargazers_url":"https://api.github.com/repos/rudyfly/pouch/stargazers","contributors_url":"https://api.github.com/repos/rudyfly/pouch/contributors","subscribers_url":"https://api.github.com/repos/rudyfly/pouch/subscribers","subscription_url":"https://api.github.com/repos/rudyfly/pouch/subscription","commits_url":"https://api.github.com/repos/rudyfly/pouch/commits{/sha}","git_commits_url":"https://api.github.com/repos/rudyfly/pouch/git/commits{/sha}","comments_url":"https://api.github.com/repos/rudyfly/pouch/comments{/number}","issue_comment_url":"https://api.github.com/repos/rudyfly/pouch/issues/comments{/number}","contents_url":"https://api.github.com/repos/rudyfly/pouch/contents/{+path}","compare_url":"https://api.github.com/repos/rudyfly/pouch/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rudyfly/pouch/merges","archive_url":"https://api.github.com/repos/rudyfly/pouch/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rudyfly/pouch/downloads","issues_url":"https://api.github.com/repos/rudyfly/pouch/issues{/number}","pulls_url":"https://api.github.com/repos/rudyfly/pouch/pulls{/number}","milestones_url":"https://api.github.com/repos/rudyfly/pouch/milestones{/number}","notifications_url":"https://api.github.com/repos/rudyfly/pouch/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rudyfly/pouch/labels{/name}","releases_url":"https://api.github.com/repos/rudyfly/pouch/releases{/id}","deployments_url":"https://api.github.com/repos/rudyfly/pouch/deployments","created_at":"2017-11-21T02:13:36Z","updated_at":"2017-11-21T02:13:38Z","pushed_at":"2018-02-23T01:56:13Z","git_url":"git://github.com/rudyfly/pouch.git","ssh_url":"git@github.com:rudyfly/pouch.git","clone_url":"https://github.com/rudyfly/pouch.git","svn_url":"https://github.com/rudyfly/pouch","homepage":"","size":6996,"stargazers_count":0,"watchers_count":0,"language":"Go","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":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"alibaba:master","ref":"master","sha":"c18ff536c245d72bfdf2802c0583d7ec4115e936","user":{"login":"alibaba","id":1961952,"avatar_url":"https://avatars1.githubusercontent.com/u/1961952?v=4","gravatar_id":"","url":"https://api.github.com/users/alibaba","html_url":"https://github.com/alibaba","followers_url":"https://api.github.com/users/alibaba/followers","following_url":"https://api.github.com/users/alibaba/following{/other_user}","gists_url":"https://api.github.com/users/alibaba/gists{/gist_id}","starred_url":"https://api.github.com/users/alibaba/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alibaba/subscriptions","organizations_url":"https://api.github.com/users/alibaba/orgs","repos_url":"https://api.github.com/users/alibaba/repos","events_url":"https://api.github.com/users/alibaba/events{/privacy}","received_events_url":"https://api.github.com/users/alibaba/received_events","type":"Organization","site_admin":false},"repo":{"id":102555965,"name":"pouch","full_name":"alibaba/pouch","owner":{"login":"alibaba","id":1961952,"avatar_url":"https://avatars1.githubusercontent.com/u/1961952?v=4","gravatar_id":"","url":"https://api.github.com/users/alibaba","html_url":"https://github.com/alibaba","followers_url":"https://api.github.com/users/alibaba/followers","following_url":"https://api.github.com/users/alibaba/following{/other_user}","gists_url":"https://api.github.com/users/alibaba/gists{/gist_id}","starred_url":"https://api.github.com/users/alibaba/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alibaba/subscriptions","organizations_url":"https://api.github.com/users/alibaba/orgs","repos_url":"https://api.github.com/users/alibaba/repos","events_url":"https://api.github.com/users/alibaba/events{/privacy}","received_events_url":"https://api.github.com/users/alibaba/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/alibaba/pouch","description":"Pouch is an open-source project created to promote the container technology movement.","fork":false,"url":"https://api.github.com/repos/alibaba/pouch","forks_url":"https://api.github.com/repos/alibaba/pouch/forks","keys_url":"https://api.github.com/repos/alibaba/pouch/keys{/key_id}","collaborators_url":"https://api.github.com/repos/alibaba/pouch/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/alibaba/pouch/teams","hooks_url":"https://api.github.com/repos/alibaba/pouch/hooks","issue_events_url":"https://api.github.com/repos/alibaba/pouch/issues/events{/number}","events_url":"https://api.github.com/repos/alibaba/pouch/events","assignees_url":"https://api.github.com/repos/alibaba/pouch/assignees{/user}","branches_url":"https://api.github.com/repos/alibaba/pouch/branches{/branch}","tags_url":"https://api.github.com/repos/alibaba/pouch/tags","blobs_url":"https://api.github.com/repos/alibaba/pouch/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/alibaba/pouch/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/alibaba/pouch/git/refs{/sha}","trees_url":"https://api.github.com/repos/alibaba/pouch/git/trees{/sha}","statuses_url":"https://api.github.com/repos/alibaba/pouch/statuses/{sha}","languages_url":"https://api.github.com/repos/alibaba/pouch/languages","stargazers_url":"https://api.github.com/repos/alibaba/pouch/stargazers","contributors_url":"https://api.github.com/repos/alibaba/pouch/contributors","subscribers_url":"https://api.github.com/repos/alibaba/pouch/subscribers","subscription_url":"https://api.github.com/repos/alibaba/pouch/subscription","commits_url":"https://api.github.com/repos/alibaba/pouch/commits{/sha}","git_commits_url":"https://api.github.com/repos/alibaba/pouch/git/commits{/sha}","comments_url":"https://api.github.com/repos/alibaba/pouch/comments{/number}","issue_comment_url":"https://api.github.com/repos/alibaba/pouch/issues/comments{/number}","contents_url":"https://api.github.com/repos/alibaba/pouch/contents/{+path}","compare_url":"https://api.github.com/repos/alibaba/pouch/compare/{base}...{head}","merges_url":"https://api.github.com/repos/alibaba/pouch/merges","archive_url":"https://api.github.com/repos/alibaba/pouch/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/alibaba/pouch/downloads","issues_url":"https://api.github.com/repos/alibaba/pouch/issues{/number}","pulls_url":"https://api.github.com/repos/alibaba/pouch/pulls{/number}","milestones_url":"https://api.github.com/repos/alibaba/pouch/milestones{/number}","notifications_url":"https://api.github.com/repos/alibaba/pouch/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/alibaba/pouch/labels{/name}","releases_url":"https://api.github.com/repos/alibaba/pouch/releases{/id}","deployments_url":"https://api.github.com/repos/alibaba/pouch/deployments","created_at":"2017-09-06T03:01:51Z","updated_at":"2018-02-23T02:08:04Z","pushed_at":"2018-02-23T03:27:27Z","git_url":"git://github.com/alibaba/pouch.git","ssh_url":"git@github.com:alibaba/pouch.git","clone_url":"https://github.com/alibaba/pouch.git","svn_url":"https://github.com/alibaba/pouch","homepage":"","size":7120,"stargazers_count":2149,"watchers_count":2149,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":378,"mirror_url":null,"archived":false,"open_issues_count":82,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":378,"open_issues":82,"watchers":2149,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/alibaba/pouch/pulls/725"},"html":{"href":"https://github.com/alibaba/pouch/pull/725"},"issue":{"href":"https://api.github.com/repos/alibaba/pouch/issues/725"},"comments":{"href":"https://api.github.com/repos/alibaba/pouch/issues/725/comments"},"review_comments":{"href":"https://api.github.com/repos/alibaba/pouch/pulls/725/comments"},"review_comment":{"href":"https://api.github.com/repos/alibaba/pouch/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/alibaba/pouch/pulls/725/commits"},"statuses":{"href":"https://api.github.com/repos/alibaba/pouch/statuses/d964f2e7f2219ea48b80b675820003300770dbe9"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"allencloud"}}