{"action":"created","comment":{"url":"https://api.github.com/repos/docker/distribution/pulls/comments/35935565","id":35935565,"diff_hunk":"@@ -0,0 +1,824 @@\n+// Package oss provides a storagedriver.StorageDriver implementation to\n+// store blobs in Aliyun OSS cloud storage.\n+//\n+// This package leverages the denverdino/aliyungo client library for interfacing with\n+// oss.\n+//\n+// Because OSS is a key, value store the Stat call does not support last modification\n+// time for directories (directories are an abstraction for key, value stores)\n+//\n+// +build include_oss\n+\n+package oss\n+\n+import (\n+\t\"bytes\"\n+\t\"fmt\"\n+\t\"github.com/docker/distribution/context\"\n+\t\"io\"\n+\t\"io/ioutil\"\n+\t\"net/http\"\n+\t\"reflect\"\n+\t\"strconv\"\n+\t\"strings\"\n+\t\"sync\"\n+\t\"time\"\n+\n+\t\"github.com/Sirupsen/logrus\"\n+\t\"github.com/denverdino/aliyungo/oss\"\n+\tstoragedriver \"github.com/docker/distribution/registry/storage/driver\"\n+\t\"github.com/docker/distribution/registry/storage/driver/base\"\n+\t\"github.com/docker/distribution/registry/storage/driver/factory\"\n+)\n+\n+const driverName = \"oss\"\n+\n+// minChunkSize defines the minimum multipart upload chunk size\n+// OSS API requires multipart upload chunks to be at least 5MB\n+const minChunkSize = 5 << 20\n+\n+const defaultChunkSize = 2 * minChunkSize\n+\n+// listMax is the largest amount of objects you can request from OSS in a list call\n+const listMax = 1000\n+\n+//DriverParameters A struct that encapsulates all of the driver parameters after all values have been set\n+type DriverParameters struct {\n+\tAccessKeyID     string\n+\tAccessKeySecret string\n+\tBucket          string\n+\tRegion          oss.Region\n+\tInternal        bool\n+\tEncrypt         bool\n+\tSecure          bool\n+\tChunkSize       int64\n+\tRootDirectory   string\n+\tEndpoint        string\n+}\n+\n+func init() {\n+\tfactory.Register(driverName, &ossDriverFactory{})\n+}\n+\n+// ossDriverFactory implements the factory.StorageDriverFactory interface\n+type ossDriverFactory struct{}\n+\n+func (factory *ossDriverFactory) Create(parameters map[string]interface{}) (storagedriver.StorageDriver, error) {\n+\treturn FromParameters(parameters)\n+}\n+\n+type driver struct {\n+\tClient        *oss.Client\n+\tBucket        *oss.Bucket\n+\tChunkSize     int64\n+\tEncrypt       bool\n+\tRootDirectory string\n+\n+\tpool  sync.Pool // pool []byte buffers used for WriteStream\n+\tzeros []byte    // shared, zero-valued buffer used for WriteStream\n+}\n+\n+type baseEmbed struct {\n+\tbase.Base\n+}\n+\n+// Driver is a storagedriver.StorageDriver implementation backed by Aliyun OSS\n+// Objects are stored at absolute keys in the provided bucket.\n+type Driver struct {\n+\tbaseEmbed\n+}\n+\n+// FromParameters constructs a new Driver with a given parameters map\n+// Required parameters:\n+// - accesskey\n+// - secretkey\n+// - region\n+// - bucket\n+// - encrypt\n+func FromParameters(parameters map[string]interface{}) (*Driver, error) {\n+\t// Providing no values for these is valid in case the user is authenticating\n+\t// with an IAM on an ec2 instance (in which case the instance credentials will\n+\t// be summoned when GetAuth is called)\n+\taccessKey, ok := parameters[\"accesskeyid\"]\n+\tif !ok {\n+\t\treturn nil, fmt.Errorf(\"No accesskeyid parameter provided\")\n+\t}\n+\tsecretKey, ok := parameters[\"accesskeysecret\"]\n+\tif !ok {\n+\t\treturn nil, fmt.Errorf(\"No accesskeysecret parameter provided\")\n+\t}\n+\n+\tregionName, ok := parameters[\"region\"]\n+\tif !ok || fmt.Sprint(regionName) == \"\" {\n+\t\treturn nil, fmt.Errorf(\"No region parameter provided\")\n+\t}\n+\n+\tbucket, ok := parameters[\"bucket\"]\n+\tif !ok || fmt.Sprint(bucket) == \"\" {\n+\t\treturn nil, fmt.Errorf(\"No bucket parameter provided\")\n+\t}\n+\n+\tinternalBool := false\n+\tinternal, ok := parameters[\"internal\"]\n+\tif ok {\n+\t\tinternalBool, ok = internal.(bool)\n+\t\tif !ok {\n+\t\t\treturn nil, fmt.Errorf(\"The internal parameter should be a boolean\")\n+\t\t}\n+\t}\n+\n+\tencryptBool := false\n+\tencrypt, ok := parameters[\"encrypt\"]\n+\tif ok {\n+\t\tencryptBool, ok = encrypt.(bool)\n+\t\tif !ok {\n+\t\t\treturn nil, fmt.Errorf(\"The encrypt parameter should be a boolean\")\n+\t\t}\n+\t}\n+\n+\tsecureBool := true\n+\tsecure, ok := parameters[\"secure\"]\n+\tif ok {\n+\t\tsecureBool, ok = secure.(bool)\n+\t\tif !ok {\n+\t\t\treturn nil, fmt.Errorf(\"The secure parameter should be a boolean\")\n+\t\t}\n+\t}\n+\n+\tchunkSize := int64(defaultChunkSize)\n+\tchunkSizeParam, ok := parameters[\"chunksize\"]\n+\tif ok {\n+\t\tswitch v := chunkSizeParam.(type) {\n+\t\tcase string:\n+\t\t\tvv, err := strconv.ParseInt(v, 0, 64)\n+\t\t\tif err != nil {\n+\t\t\t\treturn nil, fmt.Errorf(\"chunksize parameter must be an integer, %v invalid\", chunkSizeParam)\n+\t\t\t}\n+\t\t\tchunkSize = vv\n+\t\tcase int64:\n+\t\t\tchunkSize = v\n+\t\tcase int, uint, int32, uint32, uint64:\n+\t\t\tchunkSize = reflect.ValueOf(v).Convert(reflect.TypeOf(chunkSize)).Int()\n+\t\tdefault:\n+\t\t\treturn nil, fmt.Errorf(\"invalid valud for chunksize: %#v\", chunkSizeParam)\n+\t\t}\n+\n+\t\tif chunkSize < minChunkSize {\n+\t\t\treturn nil, fmt.Errorf(\"The chunksize %#v parameter should be a number that is larger than or equal to %d\", chunkSize, minChunkSize)\n+\t\t}\n+\t}\n+\n+\trootDirectory, ok := parameters[\"rootdirectory\"]\n+\tif !ok {\n+\t\trootDirectory = \"\"\n+\t}\n+\n+\tendpoint, ok := parameters[\"endpoint\"]\n+\tif !ok {\n+\t\tendpoint = \"\"\n+\t}\n+\n+\tparams := DriverParameters{\n+\t\tAccessKeyID:     fmt.Sprint(accessKey),\n+\t\tAccessKeySecret: fmt.Sprint(secretKey),\n+\t\tBucket:          fmt.Sprint(bucket),\n+\t\tRegion:          oss.Region(fmt.Sprint(regionName)),\n+\t\tChunkSize:       chunkSize,\n+\t\tRootDirectory:   fmt.Sprint(rootDirectory),\n+\t\tEncrypt:         encryptBool,\n+\t\tSecure:          secureBool,\n+\t\tInternal:        internalBool,\n+\t\tEndpoint:        fmt.Sprint(endpoint),\n+\t}\n+\n+\treturn New(params)\n+}\n+\n+// New constructs a new Driver with the given AWS credentials, region, encryption flag, and\n+// bucketName\n+func New(params DriverParameters) (*Driver, error) {\n+\n+\tclient := oss.NewOSSClient(params.Region, params.Internal, params.AccessKeyID, params.AccessKeySecret, params.Secure)\n+\tclient.SetEndpoint(params.Endpoint)\n+\tbucket := client.Bucket(params.Bucket)\n+\n+\t// Validate that the given credentials have at least read permissions in the\n+\t// given bucket scope.\n+\tif _, err := bucket.List(strings.TrimRight(params.RootDirectory, \"/\"), \"\", \"\", 1); err != nil {\n+\t\treturn nil, err\n+\t}\n+\n+\t// TODO Currently multipart uploads have no timestamps, so this would be unwise","path":"registry/storage/driver/oss/oss.go","position":211,"original_position":211,"commit_id":"6211a663d5ce2c61082da84fde5b36d837ee8e62","original_commit_id":"6211a663d5ce2c61082da84fde5b36d837ee8e62","user":{"login":"stevvooe","id":120601,"avatar_url":"https://avatars.githubusercontent.com/u/120601?v=3","gravatar_id":"","url":"https://api.github.com/users/stevvooe","html_url":"https://github.com/stevvooe","followers_url":"https://api.github.com/users/stevvooe/followers","following_url":"https://api.github.com/users/stevvooe/following{/other_user}","gists_url":"https://api.github.com/users/stevvooe/gists{/gist_id}","starred_url":"https://api.github.com/users/stevvooe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stevvooe/subscriptions","organizations_url":"https://api.github.com/users/stevvooe/orgs","repos_url":"https://api.github.com/users/stevvooe/repos","events_url":"https://api.github.com/users/stevvooe/events{/privacy}","received_events_url":"https://api.github.com/users/stevvooe/received_events","type":"User","site_admin":false},"body":"TODO format: `TODO(you): ...`","created_at":"2015-07-31T00:04:46Z","updated_at":"2015-07-31T00:04:46Z","html_url":"https://github.com/docker/distribution/pull/514#discussion_r35935565","pull_request_url":"https://api.github.com/repos/docker/distribution/pulls/514","_links":{"self":{"href":"https://api.github.com/repos/docker/distribution/pulls/comments/35935565"},"html":{"href":"https://github.com/docker/distribution/pull/514#discussion_r35935565"},"pull_request":{"href":"https://api.github.com/repos/docker/distribution/pulls/514"}}},"pull_request":{"url":"https://api.github.com/repos/docker/distribution/pulls/514","id":35141076,"html_url":"https://github.com/docker/distribution/pull/514","diff_url":"https://github.com/docker/distribution/pull/514.diff","patch_url":"https://github.com/docker/distribution/pull/514.patch","issue_url":"https://api.github.com/repos/docker/distribution/issues/514","number":514,"state":"open","locked":false,"title":"Storage Driver for Aliyun OSS","user":{"login":"denverdino","id":409721,"avatar_url":"https://avatars.githubusercontent.com/u/409721?v=3","gravatar_id":"","url":"https://api.github.com/users/denverdino","html_url":"https://github.com/denverdino","followers_url":"https://api.github.com/users/denverdino/followers","following_url":"https://api.github.com/users/denverdino/following{/other_user}","gists_url":"https://api.github.com/users/denverdino/gists{/gist_id}","starred_url":"https://api.github.com/users/denverdino/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denverdino/subscriptions","organizations_url":"https://api.github.com/users/denverdino/orgs","repos_url":"https://api.github.com/users/denverdino/repos","events_url":"https://api.github.com/users/denverdino/events{/privacy}","received_events_url":"https://api.github.com/users/denverdino/received_events","type":"User","site_admin":false},"body":"This driver implements the storagedriver.StorageDriver interface and uses Aliyun OSS Open Storage Service as storage backend.\r\n\r\nThe documentation for this driver is in [https://github.com/denverdino/distribution/blob/master/docs/storage-drivers/oss.md](https://github.com/denverdino/distribution/blob/master/docs/storage-drivers/oss.md)\r\n\r\nTo run the unit test case for this driver, you need set the following environment variables before\r\n\r\n```\r\nexport ALIYUN_ACCESS_KEY_ID=<YOUR_ACCESS_KEY_ID>\r\nexport ALIYUN_ACCESS_KEY_SECRET=<YOUR_ACCESS_SECRET>\r\nexport OSS_REGION=<OSS_REGION_ID>   E.g. oss-us-west-1\r\nexport OSS_BUCKET=<OSS_BUCKET_NAME>\r\nexport OSS_ENCRYPT=false\r\n```\r\n\r\nNOTE: This driver reuses the code logic from the S3 driver. \r\n\r\nSigned-off-by: Li Yi (denverdino@gmail.com) Boshi Lian(farmer1992@gmail.com)","created_at":"2015-05-11T15:54:25Z","updated_at":"2015-07-31T00:04:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0544d6411b193ec79115320d26b5fe6dbb555f43","assignee":{"login":"stevvooe","id":120601,"avatar_url":"https://avatars.githubusercontent.com/u/120601?v=3","gravatar_id":"","url":"https://api.github.com/users/stevvooe","html_url":"https://github.com/stevvooe","followers_url":"https://api.github.com/users/stevvooe/followers","following_url":"https://api.github.com/users/stevvooe/following{/other_user}","gists_url":"https://api.github.com/users/stevvooe/gists{/gist_id}","starred_url":"https://api.github.com/users/stevvooe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stevvooe/subscriptions","organizations_url":"https://api.github.com/users/stevvooe/orgs","repos_url":"https://api.github.com/users/stevvooe/repos","events_url":"https://api.github.com/users/stevvooe/events{/privacy}","received_events_url":"https://api.github.com/users/stevvooe/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/docker/distribution/milestones/8","html_url":"https://github.com/docker/distribution/milestones/Registry/2.1","labels_url":"https://api.github.com/repos/docker/distribution/milestones/8/labels","id":1026598,"number":8,"title":"Registry/2.1","description":"Items in this roadmap will be part of the registry 2.1 release.","creator":{"login":"stevvooe","id":120601,"avatar_url":"https://avatars.githubusercontent.com/u/120601?v=3","gravatar_id":"","url":"https://api.github.com/users/stevvooe","html_url":"https://github.com/stevvooe","followers_url":"https://api.github.com/users/stevvooe/followers","following_url":"https://api.github.com/users/stevvooe/following{/other_user}","gists_url":"https://api.github.com/users/stevvooe/gists{/gist_id}","starred_url":"https://api.github.com/users/stevvooe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stevvooe/subscriptions","organizations_url":"https://api.github.com/users/stevvooe/orgs","repos_url":"https://api.github.com/users/stevvooe/repos","events_url":"https://api.github.com/users/stevvooe/events{/privacy}","received_events_url":"https://api.github.com/users/stevvooe/received_events","type":"User","site_admin":false},"open_issues":25,"closed_issues":169,"state":"open","created_at":"2015-03-18T04:15:41Z","updated_at":"2015-07-30T23:41:14Z","due_on":"2015-08-04T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/docker/distribution/pulls/514/commits","review_comments_url":"https://api.github.com/repos/docker/distribution/pulls/514/comments","review_comment_url":"https://api.github.com/repos/docker/distribution/pulls/comments{/number}","comments_url":"https://api.github.com/repos/docker/distribution/issues/514/comments","statuses_url":"https://api.github.com/repos/docker/distribution/statuses/6211a663d5ce2c61082da84fde5b36d837ee8e62","head":{"label":"denverdino:master","ref":"master","sha":"6211a663d5ce2c61082da84fde5b36d837ee8e62","user":{"login":"denverdino","id":409721,"avatar_url":"https://avatars.githubusercontent.com/u/409721?v=3","gravatar_id":"","url":"https://api.github.com/users/denverdino","html_url":"https://github.com/denverdino","followers_url":"https://api.github.com/users/denverdino/followers","following_url":"https://api.github.com/users/denverdino/following{/other_user}","gists_url":"https://api.github.com/users/denverdino/gists{/gist_id}","starred_url":"https://api.github.com/users/denverdino/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denverdino/subscriptions","organizations_url":"https://api.github.com/users/denverdino/orgs","repos_url":"https://api.github.com/users/denverdino/repos","events_url":"https://api.github.com/users/denverdino/events{/privacy}","received_events_url":"https://api.github.com/users/denverdino/received_events","type":"User","site_admin":false},"repo":{"id":35431389,"name":"distribution","full_name":"denverdino/distribution","owner":{"login":"denverdino","id":409721,"avatar_url":"https://avatars.githubusercontent.com/u/409721?v=3","gravatar_id":"","url":"https://api.github.com/users/denverdino","html_url":"https://github.com/denverdino","followers_url":"https://api.github.com/users/denverdino/followers","following_url":"https://api.github.com/users/denverdino/following{/other_user}","gists_url":"https://api.github.com/users/denverdino/gists{/gist_id}","starred_url":"https://api.github.com/users/denverdino/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denverdino/subscriptions","organizations_url":"https://api.github.com/users/denverdino/orgs","repos_url":"https://api.github.com/users/denverdino/repos","events_url":"https://api.github.com/users/denverdino/events{/privacy}","received_events_url":"https://api.github.com/users/denverdino/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/denverdino/distribution","description":"The Docker toolset to pack, ship, store, and deliver content","fork":true,"url":"https://api.github.com/repos/denverdino/distribution","forks_url":"https://api.github.com/repos/denverdino/distribution/forks","keys_url":"https://api.github.com/repos/denverdino/distribution/keys{/key_id}","collaborators_url":"https://api.github.com/repos/denverdino/distribution/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/denverdino/distribution/teams","hooks_url":"https://api.github.com/repos/denverdino/distribution/hooks","issue_events_url":"https://api.github.com/repos/denverdino/distribution/issues/events{/number}","events_url":"https://api.github.com/repos/denverdino/distribution/events","assignees_url":"https://api.github.com/repos/denverdino/distribution/assignees{/user}","branches_url":"https://api.github.com/repos/denverdino/distribution/branches{/branch}","tags_url":"https://api.github.com/repos/denverdino/distribution/tags","blobs_url":"https://api.github.com/repos/denverdino/distribution/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/denverdino/distribution/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/denverdino/distribution/git/refs{/sha}","trees_url":"https://api.github.com/repos/denverdino/distribution/git/trees{/sha}","statuses_url":"https://api.github.com/repos/denverdino/distribution/statuses/{sha}","languages_url":"https://api.github.com/repos/denverdino/distribution/languages","stargazers_url":"https://api.github.com/repos/denverdino/distribution/stargazers","contributors_url":"https://api.github.com/repos/denverdino/distribution/contributors","subscribers_url":"https://api.github.com/repos/denverdino/distribution/subscribers","subscription_url":"https://api.github.com/repos/denverdino/distribution/subscription","commits_url":"https://api.github.com/repos/denverdino/distribution/commits{/sha}","git_commits_url":"https://api.github.com/repos/denverdino/distribution/git/commits{/sha}","comments_url":"https://api.github.com/repos/denverdino/distribution/comments{/number}","issue_comment_url":"https://api.github.com/repos/denverdino/distribution/issues/comments{/number}","contents_url":"https://api.github.com/repos/denverdino/distribution/contents/{+path}","compare_url":"https://api.github.com/repos/denverdino/distribution/compare/{base}...{head}","merges_url":"https://api.github.com/repos/denverdino/distribution/merges","archive_url":"https://api.github.com/repos/denverdino/distribution/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/denverdino/distribution/downloads","issues_url":"https://api.github.com/repos/denverdino/distribution/issues{/number}","pulls_url":"https://api.github.com/repos/denverdino/distribution/pulls{/number}","milestones_url":"https://api.github.com/repos/denverdino/distribution/milestones{/number}","notifications_url":"https://api.github.com/repos/denverdino/distribution/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/denverdino/distribution/labels{/name}","releases_url":"https://api.github.com/repos/denverdino/distribution/releases{/id}","created_at":"2015-05-11T15:09:07Z","updated_at":"2015-05-11T15:09:08Z","pushed_at":"2015-07-28T07:32:52Z","git_url":"git://github.com/denverdino/distribution.git","ssh_url":"git@github.com:denverdino/distribution.git","clone_url":"https://github.com/denverdino/distribution.git","svn_url":"https://github.com/denverdino/distribution","homepage":null,"size":3159,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"docker:master","ref":"master","sha":"cd87b3d70f37cdd3cdfa419ded4aea31ede5ca35","user":{"login":"docker","id":5429470,"avatar_url":"https://avatars.githubusercontent.com/u/5429470?v=3","gravatar_id":"","url":"https://api.github.com/users/docker","html_url":"https://github.com/docker","followers_url":"https://api.github.com/users/docker/followers","following_url":"https://api.github.com/users/docker/following{/other_user}","gists_url":"https://api.github.com/users/docker/gists{/gist_id}","starred_url":"https://api.github.com/users/docker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/docker/subscriptions","organizations_url":"https://api.github.com/users/docker/orgs","repos_url":"https://api.github.com/users/docker/repos","events_url":"https://api.github.com/users/docker/events{/privacy}","received_events_url":"https://api.github.com/users/docker/received_events","type":"Organization","site_admin":false},"repo":{"id":28366058,"name":"distribution","full_name":"docker/distribution","owner":{"login":"docker","id":5429470,"avatar_url":"https://avatars.githubusercontent.com/u/5429470?v=3","gravatar_id":"","url":"https://api.github.com/users/docker","html_url":"https://github.com/docker","followers_url":"https://api.github.com/users/docker/followers","following_url":"https://api.github.com/users/docker/following{/other_user}","gists_url":"https://api.github.com/users/docker/gists{/gist_id}","starred_url":"https://api.github.com/users/docker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/docker/subscriptions","organizations_url":"https://api.github.com/users/docker/orgs","repos_url":"https://api.github.com/users/docker/repos","events_url":"https://api.github.com/users/docker/events{/privacy}","received_events_url":"https://api.github.com/users/docker/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/docker/distribution","description":"The Docker toolset to pack, ship, store, and deliver content","fork":false,"url":"https://api.github.com/repos/docker/distribution","forks_url":"https://api.github.com/repos/docker/distribution/forks","keys_url":"https://api.github.com/repos/docker/distribution/keys{/key_id}","collaborators_url":"https://api.github.com/repos/docker/distribution/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/docker/distribution/teams","hooks_url":"https://api.github.com/repos/docker/distribution/hooks","issue_events_url":"https://api.github.com/repos/docker/distribution/issues/events{/number}","events_url":"https://api.github.com/repos/docker/distribution/events","assignees_url":"https://api.github.com/repos/docker/distribution/assignees{/user}","branches_url":"https://api.github.com/repos/docker/distribution/branches{/branch}","tags_url":"https://api.github.com/repos/docker/distribution/tags","blobs_url":"https://api.github.com/repos/docker/distribution/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/docker/distribution/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/docker/distribution/git/refs{/sha}","trees_url":"https://api.github.com/repos/docker/distribution/git/trees{/sha}","statuses_url":"https://api.github.com/repos/docker/distribution/statuses/{sha}","languages_url":"https://api.github.com/repos/docker/distribution/languages","stargazers_url":"https://api.github.com/repos/docker/distribution/stargazers","contributors_url":"https://api.github.com/repos/docker/distribution/contributors","subscribers_url":"https://api.github.com/repos/docker/distribution/subscribers","subscription_url":"https://api.github.com/repos/docker/distribution/subscription","commits_url":"https://api.github.com/repos/docker/distribution/commits{/sha}","git_commits_url":"https://api.github.com/repos/docker/distribution/git/commits{/sha}","comments_url":"https://api.github.com/repos/docker/distribution/comments{/number}","issue_comment_url":"https://api.github.com/repos/docker/distribution/issues/comments{/number}","contents_url":"https://api.github.com/repos/docker/distribution/contents/{+path}","compare_url":"https://api.github.com/repos/docker/distribution/compare/{base}...{head}","merges_url":"https://api.github.com/repos/docker/distribution/merges","archive_url":"https://api.github.com/repos/docker/distribution/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/docker/distribution/downloads","issues_url":"https://api.github.com/repos/docker/distribution/issues{/number}","pulls_url":"https://api.github.com/repos/docker/distribution/pulls{/number}","milestones_url":"https://api.github.com/repos/docker/distribution/milestones{/number}","notifications_url":"https://api.github.com/repos/docker/distribution/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/docker/distribution/labels{/name}","releases_url":"https://api.github.com/repos/docker/distribution/releases{/id}","created_at":"2014-12-22T23:49:26Z","updated_at":"2015-07-30T20:35:09Z","pushed_at":"2015-07-30T23:41:14Z","git_url":"git://github.com/docker/distribution.git","ssh_url":"git@github.com:docker/distribution.git","clone_url":"https://github.com/docker/distribution.git","svn_url":"https://github.com/docker/distribution","homepage":null,"size":12369,"stargazers_count":793,"watchers_count":793,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":306,"mirror_url":null,"open_issues_count":108,"forks":306,"open_issues":108,"watchers":793,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/docker/distribution/pulls/514"},"html":{"href":"https://github.com/docker/distribution/pull/514"},"issue":{"href":"https://api.github.com/repos/docker/distribution/issues/514"},"comments":{"href":"https://api.github.com/repos/docker/distribution/issues/514/comments"},"review_comments":{"href":"https://api.github.com/repos/docker/distribution/pulls/514/comments"},"review_comment":{"href":"https://api.github.com/repos/docker/distribution/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/docker/distribution/pulls/514/commits"},"statuses":{"href":"https://api.github.com/repos/docker/distribution/statuses/6211a663d5ce2c61082da84fde5b36d837ee8e62"}}}}