{"action":"created","comment":{"url":"https://api.github.com/repos/docker/docker/pulls/comments/40633427","id":40633427,"diff_hunk":"@@ -30,16 +49,236 @@ func TestDecodeContainerConfig(t *testing.T) {\n \t\t\tt.Fatal(fmt.Errorf(\"Error parsing %s: %v\", f, err))\n \t\t}\n \n-\t\tif c.Image != \"ubuntu\" {\n-\t\t\tt.Fatalf(\"Expected ubuntu image, found %s\\n\", c.Image)\n+\t\tif c.Image != image {\n+\t\t\tt.Fatalf(\"Expected %s image, found %s\\n\", image, c.Image)\n \t\t}\n \n \t\tif c.Entrypoint.Len() != f.entrypoint.Len() {\n \t\t\tt.Fatalf(\"Expected %v, found %v\\n\", f.entrypoint, c.Entrypoint)\n \t\t}\n \n-\t\tif h.Memory != 1000 {\n+\t\tif h != nil && h.Memory != 1000 {\n \t\t\tt.Fatalf(\"Expected memory to be 1000, found %d\\n\", h.Memory)\n \t\t}\n \t}\n }\n+\n+// check if (a == c && b == d) || (a == d && b == c)\n+// because maps are randomized\n+func compareRandomizedStrings(a, b, c, d string) error {\n+\tif a == c && b == d {\n+\t\treturn nil\n+\t}\n+\tif a == d && b == c {\n+\t\treturn nil\n+\t}\n+\treturn fmt.Errorf(\"strings don't match\")\n+}\n+\n+func TestDecodeContainerConfigVolumes(t *testing.T) {\n+\tvar (\n+\t\tconfig     *Config\n+\t\thostConfig *HostConfig\n+\t\terr        error\n+\t\ttryit      []string\n+\t)\n+\n+\t// A single volume\n+\ttryit = volSetup([]string{`/tmp`}, []string{`c:\\tmp`})\n+\tif config, hostConfig, err = callDCC(tryit); err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tif hostConfig.Binds != nil {\n+\t\tt.Fatalf(\"Error parsing volume flags, %q should not mount-bind anything. Received %v\", tryit, hostConfig.Binds)\n+\t} else if _, exists := config.Volumes[tryit[0]]; !exists {\n+\t\tt.Fatalf(\"Error parsing volume flags, %q is missing from volumes. Received %v\", tryit, config.Volumes)\n+\t}\n+\n+\t// Two volumes\n+\ttryit = volSetup([]string{`/tmp`, `/var`}, []string{`c:\\tmp`, `c:\\var`})\n+\tif config, hostConfig, err = callDCC(tryit); err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tif hostConfig.Binds != nil {\n+\t\tt.Fatalf(\"Error parsing volume flags, %q should not mount-bind anything. Received %v\", tryit, hostConfig.Binds)\n+\t} else if _, exists := config.Volumes[tryit[0]]; !exists {\n+\t\tt.Fatalf(\"Error parsing volume flags, %s is missing from volumes. Received %v\", tryit[0], config.Volumes)\n+\t} else if _, exists := config.Volumes[tryit[1]]; !exists {\n+\t\tt.Fatalf(\"Error parsing volume flags, %s is missing from volumes. Received %v\", tryit[1], config.Volumes)\n+\t}\n+\n+\t// A single bind-mount\n+\ttryit = volSetup([]string{`/hostTmp:/containerTmp`}, []string{os.Getenv(\"TEMP\") + `:c:\\containerTmp`})\n+\tif config, hostConfig, err = callDCC(tryit); err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tif hostConfig.Binds == nil || hostConfig.Binds[0] != tryit[0] {\n+\t\tt.Fatalf(\"Error parsing volume flags, %q should mount-bind the path before the colon into the path after the colon. Received %v\", tryit[0], hostConfig.Binds)\n+\t}\n+\n+\t// Two bind-mounts.\n+\ttryit = volSetup([]string{`/hostTmp:/containerTmp`, `/hostVar:/containerVar`}, []string{os.Getenv(\"TEMP\") + `:c:\\containerTmp`, os.Getenv(\"ProgramFiles\") + `:c:\\ContainerPF`})\n+\tif config, hostConfig, err = callDCC(tryit); err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tif hostConfig.Binds == nil || compareRandomizedStrings(hostConfig.Binds[0], hostConfig.Binds[1], tryit[0], tryit[1]) != nil {\n+\t\tt.Fatalf(\"Error parsing volume flags, `%s and %s` did not mount-bind correctly. Received %v\", tryit[0], tryit[1], hostConfig.Binds)\n+\t}\n+\n+\t// Two bind-mounts, first read-only, second read-write.\n+\t// TODO Windows: The Windows version uses read-write as that's the only mode it supports. Can change this post TP4\n+\ttryit = volSetup([]string{`/hostTmp:/containerTmp:ro`, `/hostVar:/containerVar:rw`}, []string{os.Getenv(\"TEMP\") + `:c:\\containerTmp:rw`, os.Getenv(\"ProgramFiles\") + `:c:\\ContainerPF:rw`})\n+\tif config, hostConfig, err = callDCC(tryit); err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tif hostConfig.Binds == nil || compareRandomizedStrings(hostConfig.Binds[0], hostConfig.Binds[1], tryit[0], tryit[1]) != nil {\n+\t\tt.Fatalf(\"Error parsing volume flags, `%s and %s` did not mount-bind correctly. Received %v\", tryit[0], tryit[1], hostConfig.Binds)\n+\t}\n+\n+\t// Similar to previous test but with alternate modes which are only supported by Linux\n+\tif runtime.GOOS != \"windows\" {\n+\t\ttryit = volSetup([]string{`/hostTmp:/containerTmp:ro,Z`, `/hostVar:/containerVar:rw,Z`}, []string{})\n+\t\tif config, hostConfig, err = callDCC(tryit); err != nil {\n+\t\t\tt.Fatal(err)\n+\t\t}\n+\t\tif hostConfig.Binds == nil || compareRandomizedStrings(hostConfig.Binds[0], hostConfig.Binds[1], tryit[0], tryit[1]) != nil {\n+\t\t\tt.Fatalf(\"Error parsing volume flags, `%s and %s` did not mount-bind correctly. Received %v\", tryit[0], tryit[1], hostConfig.Binds)\n+\t\t}\n+\n+\t\ttryit = volSetup([]string{`/hostTmp:/containerTmp:Z`, `/hostVar:/containerVar:z`}, []string{})\n+\t\tif config, hostConfig, err = callDCC(tryit); err != nil {\n+\t\t\tt.Fatal(err)\n+\t\t}\n+\t\tif hostConfig.Binds == nil || compareRandomizedStrings(hostConfig.Binds[0], hostConfig.Binds[1], tryit[0], tryit[1]) != nil {\n+\t\t\tt.Fatalf(\"Error parsing volume flags, `%s and %s` did not mount-bind correctly. Received %v\", tryit[0], tryit[1], hostConfig.Binds)\n+\t\t}\n+\t}\n+\n+\t// One bind mount and one volume\n+\ttryit = volSetup([]string{`/hostTmp:/containerTmp`, `/containerVar`}, []string{os.Getenv(\"TEMP\") + `:c:\\containerTmp`, `c:\\containerTmp`})\n+\tif config, hostConfig, err = callDCC(tryit); err != nil {\n+\t\tt.Fatal(err)\n+\t}\n+\tif hostConfig.Binds == nil || len(hostConfig.Binds) > 1 || hostConfig.Binds[0] != tryit[0] {\n+\t\tt.Fatalf(\"Error parsing volume flags, %s and %s should only one and only one bind mount %s. Received %s\", tryit[0], tryit[1], tryit[0], hostConfig.Binds)\n+\t} else if _, exists := config.Volumes[tryit[1]]; !exists {\n+\t\tt.Fatalf(\"Error parsing volume flags %s and %s. %s is missing from volumes. Received %v\", tryit[0], tryit[1], tryit[1], config.Volumes)\n+\t}\n+\n+\t// Root to non-c: drive letter (Windows specific)\n+\tif runtime.GOOS == \"windows\" {\n+\t\ttryit = volSetup([]string{}, []string{os.Getenv(\"SystemDrive\") + `\\:d:`})\n+\t\tif config, hostConfig, err = callDCC(tryit); err != nil {\n+\t\t\tt.Fatal(err)\n+\t\t}\n+\t\tif hostConfig.Binds == nil || len(hostConfig.Binds) > 1 || hostConfig.Binds[0] != tryit[0] || len(config.Volumes) != 0 {\n+\t\t\tt.Fatalf(\"Error parsing %s. Should have a single bind mount and no volumes\", tryit[0])\n+\t\t}\n+\t}\n+\n+\t//\n+\t// Error cases\n+\t//\n+\n+\t// Empty spec\n+\ttryit = []string{}\n+\tif config, hostConfig, err = callDCC(tryit); err != nil {\n+\t\tif hostConfig.Binds != nil || len(config.Volumes) != 0 {\n+\t\t\tt.Fatalf(\"Empty volume spec should have no binds or volumes. Received %s %q\", hostConfig.Binds, config.Volumes)\n+\t\t}\n+\t}\n+\n+\t// Root to root\n+\ttryit = volSetup([]string{`/:/`}, []string{os.Getenv(\"SystemDrive\") + `\\:c:\\`})\n+\tif config, hostConfig, err = callDCC(tryit); err == nil {\n+\t\tt.Fatalf(\"%s should have failed\", tryit[0])\n+\t}\n+\n+\t// No destination path\n+\ttryit = volSetup([]string{`/tmp:`}, []string{os.Getenv(\"TEMP\") + `\\:`})\n+\tif config, hostConfig, err = callDCC(tryit); err == nil {\n+\t\tt.Fatalf(\"%s should have failed\", tryit[0])\n+\t}\n+\n+\t// No destination path or mode\n+\ttryit = volSetup([]string{`/tmp::`}, []string{os.Getenv(\"TEMP\") + `\\::`})\n+\tif config, hostConfig, err = callDCC(tryit); err == nil {\n+\t\tt.Fatalf(\"%s should have failed\", tryit[0])\n+\t}\n+\n+\t// A whole lot of nothing\n+\ttryit = []string{`:`}\n+\tif config, hostConfig, err = callDCC(tryit); err == nil {\n+\t\tt.Fatalf(\"%s should have failed\", tryit[0])\n+\t}\n+\n+\t// A whole lot of nothing with no mode\n+\ttryit = []string{`::`}\n+\tif config, hostConfig, err = callDCC(tryit); err == nil {\n+\t\tt.Fatalf(\"%s should have failed\", tryit[0])\n+\t}\n+\n+\t// Too much including an invalid mode\n+\twTmp := os.Getenv(\"TEMP\")\n+\ttryit = volSetup([]string{`/tmp:/tmp:/tmp:/tmp:`}, []string{wTmp + \":\" + wTmp + \":\" + wTmp + \":\" + wTmp})\n+\tif config, hostConfig, err = callDCC(tryit); err == nil {\n+\t\tt.Fatalf(\"%s should have failed\", tryit[0])\n+\t}\n+\n+\t// Windows specific error tests\n+\tif runtime.GOOS == \"windows\" {\n+\t\t// Volume which does not include a drive letter\n+\t\ttryit = []string{\"\\tmp\"}\n+\t\tif config, hostConfig, err = callDCC(tryit); err == nil {\n+\t\t\tt.Fatalf(\"%s should have failed\", tryit[0])\n+\t\t}\n+\n+\t\t// Root to C-Drive\n+\t\tif runtime.GOOS == \"windows\" {\n+\t\t\ttryit = volSetup([]string{}, []string{os.Getenv(\"SystemDrive\") + `\\:c:`})\n+\t\t\tif config, hostConfig, err = callDCC(tryit); err == nil {\n+\t\t\t\tt.Fatalf(\"%s should have failed\", tryit[0])\n+\t\t\t}\n+\t\t}\n+\n+\t\t// Container path that does not include a drive letter\n+\t\ttryit = []string{\"c:\\tmp:\\tmp\"}\n+\t\tif config, hostConfig, err = callDCC(tryit); err == nil {\n+\t\t\tt.Fatalf(\"%s should have failed\", tryit[0])\n+\t\t}\n+\t}\n+}\n+\n+func volSetup(u []string, w []string) []string {\n+\tif runtime.GOOS == \"windows\" {\n+\t\treturn w\n+\t}\n+\treturn u\n+}\n+\n+func callDCC(volumes []string) (*Config, *HostConfig, error) {","path":"runconfig/config_test.go","position":262,"original_position":262,"commit_id":"b3fb944020865e4ddb9e20f55777d1936e134b3c","original_commit_id":"b3fb944020865e4ddb9e20f55777d1936e134b3c","user":{"login":"jhowardmsft","id":10522484,"avatar_url":"https://avatars.githubusercontent.com/u/10522484?v=3","gravatar_id":"","url":"https://api.github.com/users/jhowardmsft","html_url":"https://github.com/jhowardmsft","followers_url":"https://api.github.com/users/jhowardmsft/followers","following_url":"https://api.github.com/users/jhowardmsft/following{/other_user}","gists_url":"https://api.github.com/users/jhowardmsft/gists{/gist_id}","starred_url":"https://api.github.com/users/jhowardmsft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jhowardmsft/subscriptions","organizations_url":"https://api.github.com/users/jhowardmsft/orgs","repos_url":"https://api.github.com/users/jhowardmsft/repos","events_url":"https://api.github.com/users/jhowardmsft/events{/privacy}","received_events_url":"https://api.github.com/users/jhowardmsft/received_events","type":"User","site_admin":false},"body":"DCC was DecodeContainerConfig. You want me to change it to callDecodeContainerConfig?","created_at":"2015-09-29T04:19:05Z","updated_at":"2015-09-29T04:19:05Z","html_url":"https://github.com/docker/docker/pull/16433#discussion_r40633427","pull_request_url":"https://api.github.com/repos/docker/docker/pulls/16433","_links":{"self":{"href":"https://api.github.com/repos/docker/docker/pulls/comments/40633427"},"html":{"href":"https://github.com/docker/docker/pull/16433#discussion_r40633427"},"pull_request":{"href":"https://api.github.com/repos/docker/docker/pulls/16433"}}},"pull_request":{"url":"https://api.github.com/repos/docker/docker/pulls/16433","id":45488633,"html_url":"https://github.com/docker/docker/pull/16433","diff_url":"https://github.com/docker/docker/pull/16433.diff","patch_url":"https://github.com/docker/docker/pull/16433.patch","issue_url":"https://api.github.com/repos/docker/docker/issues/16433","number":16433,"state":"open","locked":false,"title":"Windows: [TP4] Add volume support","user":{"login":"jhowardmsft","id":10522484,"avatar_url":"https://avatars.githubusercontent.com/u/10522484?v=3","gravatar_id":"","url":"https://api.github.com/users/jhowardmsft","html_url":"https://github.com/jhowardmsft","followers_url":"https://api.github.com/users/jhowardmsft/followers","following_url":"https://api.github.com/users/jhowardmsft/following{/other_user}","gists_url":"https://api.github.com/users/jhowardmsft/gists{/gist_id}","starred_url":"https://api.github.com/users/jhowardmsft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jhowardmsft/subscriptions","organizations_url":"https://api.github.com/users/jhowardmsft/orgs","repos_url":"https://api.github.com/users/jhowardmsft/repos","events_url":"https://api.github.com/users/jhowardmsft/events{/privacy}","received_events_url":"https://api.github.com/users/jhowardmsft/received_events","type":"User","site_admin":false},"body":"Signed-off-by: John Howard <jhoward@microsoft.com>\r\n\r\nThis PR adds volume support to Windows.\r\n\r\nThere are a HUGE number of moving pieces of code in this PR which makes rebasing it a true nightmare. Hence, getting it merged soon so I can continue to do more work/finish off in this area for TP4 would be GREATLY appreciated! @cpuguy83 @cavalera @jfrazelle @icecrime\r\n\r\nTo verify for yourselves, this will need a very recent TP4 build. It will not work on TP3 as mapped directory support is not in the platform.\r\n\r\nVOLUME in the builder works, but only if there is no content pre-existing in the directory. There is a FIXME comment for post TP4 in create_windows.go for this as it will require platform support.\r\n","created_at":"2015-09-20T02:50:44Z","updated_at":"2015-09-29T04:19:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1fd5495a45582289692ca498390e89854535d99a","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/docker/docker/pulls/16433/commits","review_comments_url":"https://api.github.com/repos/docker/docker/pulls/16433/comments","review_comment_url":"https://api.github.com/repos/docker/docker/pulls/comments{/number}","comments_url":"https://api.github.com/repos/docker/docker/issues/16433/comments","statuses_url":"https://api.github.com/repos/docker/docker/statuses/b3fb944020865e4ddb9e20f55777d1936e134b3c","head":{"label":"Microsoft:10662-volumes5","ref":"10662-volumes5","sha":"b3fb944020865e4ddb9e20f55777d1936e134b3c","user":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"repo":{"id":30096470,"name":"docker","full_name":"Microsoft/docker","owner":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Microsoft/docker","description":"Docker - the open-source application container engine","fork":true,"url":"https://api.github.com/repos/Microsoft/docker","forks_url":"https://api.github.com/repos/Microsoft/docker/forks","keys_url":"https://api.github.com/repos/Microsoft/docker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Microsoft/docker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Microsoft/docker/teams","hooks_url":"https://api.github.com/repos/Microsoft/docker/hooks","issue_events_url":"https://api.github.com/repos/Microsoft/docker/issues/events{/number}","events_url":"https://api.github.com/repos/Microsoft/docker/events","assignees_url":"https://api.github.com/repos/Microsoft/docker/assignees{/user}","branches_url":"https://api.github.com/repos/Microsoft/docker/branches{/branch}","tags_url":"https://api.github.com/repos/Microsoft/docker/tags","blobs_url":"https://api.github.com/repos/Microsoft/docker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Microsoft/docker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Microsoft/docker/git/refs{/sha}","trees_url":"https://api.github.com/repos/Microsoft/docker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Microsoft/docker/statuses/{sha}","languages_url":"https://api.github.com/repos/Microsoft/docker/languages","stargazers_url":"https://api.github.com/repos/Microsoft/docker/stargazers","contributors_url":"https://api.github.com/repos/Microsoft/docker/contributors","subscribers_url":"https://api.github.com/repos/Microsoft/docker/subscribers","subscription_url":"https://api.github.com/repos/Microsoft/docker/subscription","commits_url":"https://api.github.com/repos/Microsoft/docker/commits{/sha}","git_commits_url":"https://api.github.com/repos/Microsoft/docker/git/commits{/sha}","comments_url":"https://api.github.com/repos/Microsoft/docker/comments{/number}","issue_comment_url":"https://api.github.com/repos/Microsoft/docker/issues/comments{/number}","contents_url":"https://api.github.com/repos/Microsoft/docker/contents/{+path}","compare_url":"https://api.github.com/repos/Microsoft/docker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Microsoft/docker/merges","archive_url":"https://api.github.com/repos/Microsoft/docker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Microsoft/docker/downloads","issues_url":"https://api.github.com/repos/Microsoft/docker/issues{/number}","pulls_url":"https://api.github.com/repos/Microsoft/docker/pulls{/number}","milestones_url":"https://api.github.com/repos/Microsoft/docker/milestones{/number}","notifications_url":"https://api.github.com/repos/Microsoft/docker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Microsoft/docker/labels{/name}","releases_url":"https://api.github.com/repos/Microsoft/docker/releases{/id}","created_at":"2015-01-31T00:05:16Z","updated_at":"2015-09-27T14:55:39Z","pushed_at":"2015-09-28T23:30:57Z","git_url":"git://github.com/Microsoft/docker.git","ssh_url":"git@github.com:Microsoft/docker.git","clone_url":"https://github.com/Microsoft/docker.git","svn_url":"https://github.com/Microsoft/docker","homepage":"http://www.docker.com","size":71936,"stargazers_count":185,"watchers_count":185,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":35,"mirror_url":null,"open_issues_count":0,"forks":35,"open_issues":0,"watchers":185,"default_branch":"master"}},"base":{"label":"docker:master","ref":"master","sha":"d6e7350b961d856dcc39db5accd898279d1be3da","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":7691631,"name":"docker","full_name":"docker/docker","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/docker","description":"Docker - the open-source application container engine","fork":false,"url":"https://api.github.com/repos/docker/docker","forks_url":"https://api.github.com/repos/docker/docker/forks","keys_url":"https://api.github.com/repos/docker/docker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/docker/docker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/docker/docker/teams","hooks_url":"https://api.github.com/repos/docker/docker/hooks","issue_events_url":"https://api.github.com/repos/docker/docker/issues/events{/number}","events_url":"https://api.github.com/repos/docker/docker/events","assignees_url":"https://api.github.com/repos/docker/docker/assignees{/user}","branches_url":"https://api.github.com/repos/docker/docker/branches{/branch}","tags_url":"https://api.github.com/repos/docker/docker/tags","blobs_url":"https://api.github.com/repos/docker/docker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/docker/docker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/docker/docker/git/refs{/sha}","trees_url":"https://api.github.com/repos/docker/docker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/docker/docker/statuses/{sha}","languages_url":"https://api.github.com/repos/docker/docker/languages","stargazers_url":"https://api.github.com/repos/docker/docker/stargazers","contributors_url":"https://api.github.com/repos/docker/docker/contributors","subscribers_url":"https://api.github.com/repos/docker/docker/subscribers","subscription_url":"https://api.github.com/repos/docker/docker/subscription","commits_url":"https://api.github.com/repos/docker/docker/commits{/sha}","git_commits_url":"https://api.github.com/repos/docker/docker/git/commits{/sha}","comments_url":"https://api.github.com/repos/docker/docker/comments{/number}","issue_comment_url":"https://api.github.com/repos/docker/docker/issues/comments{/number}","contents_url":"https://api.github.com/repos/docker/docker/contents/{+path}","compare_url":"https://api.github.com/repos/docker/docker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/docker/docker/merges","archive_url":"https://api.github.com/repos/docker/docker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/docker/docker/downloads","issues_url":"https://api.github.com/repos/docker/docker/issues{/number}","pulls_url":"https://api.github.com/repos/docker/docker/pulls{/number}","milestones_url":"https://api.github.com/repos/docker/docker/milestones{/number}","notifications_url":"https://api.github.com/repos/docker/docker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/docker/docker/labels{/name}","releases_url":"https://api.github.com/repos/docker/docker/releases{/id}","created_at":"2013-01-18T18:10:57Z","updated_at":"2015-09-29T02:50:56Z","pushed_at":"2015-09-29T03:50:36Z","git_url":"git://github.com/docker/docker.git","ssh_url":"git@github.com:docker/docker.git","clone_url":"https://github.com/docker/docker.git","svn_url":"https://github.com/docker/docker","homepage":"http://www.docker.com","size":259555,"stargazers_count":25097,"watchers_count":25097,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6550,"mirror_url":null,"open_issues_count":1116,"forks":6550,"open_issues":1116,"watchers":25097,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/docker/docker/pulls/16433"},"html":{"href":"https://github.com/docker/docker/pull/16433"},"issue":{"href":"https://api.github.com/repos/docker/docker/issues/16433"},"comments":{"href":"https://api.github.com/repos/docker/docker/issues/16433/comments"},"review_comments":{"href":"https://api.github.com/repos/docker/docker/pulls/16433/comments"},"review_comment":{"href":"https://api.github.com/repos/docker/docker/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/docker/docker/pulls/16433/commits"},"statuses":{"href":"https://api.github.com/repos/docker/docker/statuses/b3fb944020865e4ddb9e20f55777d1936e134b3c"}}}}