{"action":"created","comment":{"url":"https://api.github.com/repos/docker/docker/pulls/comments/57464301","id":57464301,"diff_hunk":"@@ -117,116 +121,133 @@ func (s *DockerSuite) TestHelpTextVerify(c *check.C) {\n \t\tcmdsToTest = append(cmdsToTest, \"volume ls\")\n \t\tcmdsToTest = append(cmdsToTest, \"volume rm\")\n \n-\t\tfor _, cmd := range cmdsToTest {\n-\t\t\tvar stderr string\n+\t\ttestcommand := func(cmdsToTest []string) {\n+\t\t\tdefer wg.Done()\n \n-\t\t\targs := strings.Split(cmd+\" --help\", \" \")\n+\t\t\tfor _, cmd := range cmdsToTest {\n+\t\t\t\tvar stderr string\n \n-\t\t\t// Check the full usage text\n-\t\t\thelpCmd := exec.Command(dockerBinary, args...)\n-\t\t\thelpCmd.Env = newEnvs\n-\t\t\tout, stderr, _, err = runCommandWithStdoutStderr(helpCmd)\n-\t\t\tc.Assert(len(stderr), checker.Equals, 0, check.Commentf(\"Error on %q help. non-empty stderr:%q\", cmd, stderr))\n-\t\t\tc.Assert(out, checker.Not(checker.HasSuffix), \"\\n\\n\", check.Commentf(\"Should not have blank line on %q\\n\", cmd))\n-\t\t\tc.Assert(out, checker.Contains, \"--help\", check.Commentf(\"All commands should mention '--help'. Command '%v' did not.\\n\", cmd))\n+\t\t\t\targs := strings.Split(cmd+\" --help\", \" \")\n \n-\t\t\tc.Assert(err, checker.IsNil, check.Commentf(out))\n+\t\t\t\t// Check the full usage text\n+\t\t\t\thelpCmd := exec.Command(dockerBinary, args...)\n+\t\t\t\thelpCmd.Env = newEnvs\n+\t\t\t\tout, stderr, _, err = runCommandWithStdoutStderr(helpCmd)\n+\t\t\t\tc.Assert(len(stderr), checker.Equals, 0, check.Commentf(\"Error on %q help. non-empty stderr:%q\", cmd, stderr))\n+\t\t\t\tc.Assert(out, checker.Not(checker.HasSuffix), \"\\n\\n\", check.Commentf(\"Should not have blank line on %q\\n\", cmd))\n+\t\t\t\tc.Assert(out, checker.Contains, \"--help\", check.Commentf(\"All commands should mention '--help'. Command '%v' did not.\\n\", cmd))\n \n-\t\t\t// Check each line for lots of stuff\n-\t\t\tlines := strings.Split(out, \"\\n\")\n-\t\t\tfor _, line := range lines {\n-\t\t\t\tc.Assert(len(line), checker.LessOrEqualThan, 107, check.Commentf(\"Help for %q is too long:\\n%s\", cmd, line))\n+\t\t\t\tc.Assert(err, checker.IsNil, check.Commentf(out))\n \n-\t\t\t\tif scanForHome && strings.Contains(line, `\"`+home) {\n-\t\t\t\t\tc.Fatalf(\"Help for %q should use ~ instead of %q on:\\n%s\",\n-\t\t\t\t\t\tcmd, home, line)\n-\t\t\t\t}\n-\t\t\t\ti := strings.Index(line, \"~\")\n-\t\t\t\tif i >= 0 && i != len(line)-1 && line[i+1] != '/' {\n-\t\t\t\t\tc.Fatalf(\"Help for %q should not have used ~:\\n%s\", cmd, line)\n-\t\t\t\t}\n-\n-\t\t\t\t// If a line starts with 4 spaces then assume someone\n-\t\t\t\t// added a multi-line description for an option and we need\n-\t\t\t\t// to flag it\n-\t\t\t\tc.Assert(line, checker.Not(checker.HasPrefix), \"    \", check.Commentf(\"Help for %q should not have a multi-line option\", cmd))\n+\t\t\t\t// Check each line for lots of stuff\n+\t\t\t\tlines := strings.Split(out, \"\\n\")\n+\t\t\t\tfor _, line := range lines {\n+\t\t\t\t\tc.Assert(len(line), checker.LessOrEqualThan, 107, check.Commentf(\"Help for %q is too long:\\n%s\", cmd, line))\n \n-\t\t\t\t// Options should NOT end with a period\n-\t\t\t\tif strings.HasPrefix(line, \"  -\") && strings.HasSuffix(line, \".\") {\n-\t\t\t\t\tc.Fatalf(\"Help for %q should not end with a period: %s\", cmd, line)\n-\t\t\t\t}\n+\t\t\t\t\tif scanForHome && strings.Contains(line, `\"`+home) {\n+\t\t\t\t\t\tc.Fatalf(\"Help for %q should use ~ instead of %q on:\\n%s\",\n+\t\t\t\t\t\t\tcmd, home, line)\n+\t\t\t\t\t}\n+\t\t\t\t\ti := strings.Index(line, \"~\")\n+\t\t\t\t\tif i >= 0 && i != len(line)-1 && line[i+1] != '/' {\n+\t\t\t\t\t\tc.Fatalf(\"Help for %q should not have used ~:\\n%s\", cmd, line)\n+\t\t\t\t\t}\n \n-\t\t\t\t// Options should NOT end with a space\n-\t\t\t\tc.Assert(line, checker.Not(checker.HasSuffix), \" \", check.Commentf(\"Help for %q should not end with a space\", cmd))\n+\t\t\t\t\t// If a line starts with 4 spaces then assume someone\n+\t\t\t\t\t// added a multi-line description for an option and we need\n+\t\t\t\t\t// to flag it\n+\t\t\t\t\tc.Assert(line, checker.Not(checker.HasPrefix), \"    \", check.Commentf(\"Help for %q should not have a multi-line option\", cmd))\n \n-\t\t\t}\n+\t\t\t\t\t// Options should NOT end with a period\n+\t\t\t\t\tif strings.HasPrefix(line, \"  -\") && strings.HasSuffix(line, \".\") {\n+\t\t\t\t\t\tc.Fatalf(\"Help for %q should not end with a period: %s\", cmd, line)\n+\t\t\t\t\t}\n \n-\t\t\t// For each command make sure we generate an error\n-\t\t\t// if we give a bad arg\n-\t\t\targs = strings.Split(cmd+\" --badArg\", \" \")\n-\n-\t\t\tout, _, err = dockerCmdWithError(args...)\n-\t\t\tc.Assert(err, checker.NotNil, check.Commentf(out))\n-\t\t\t// Be really picky\n-\t\t\tc.Assert(stderr, checker.Not(checker.HasSuffix), \"\\n\\n\", check.Commentf(\"Should not have a blank line at the end of 'docker rm'\\n\"))\n-\n-\t\t\t// Now make sure that each command will print a short-usage\n-\t\t\t// (not a full usage - meaning no opts section) if we\n-\t\t\t// are missing a required arg or pass in a bad arg\n-\n-\t\t\t// These commands will never print a short-usage so don't test\n-\t\t\tnoShortUsage := map[string]string{\n-\t\t\t\t\"images\":  \"\",\n-\t\t\t\t\"login\":   \"\",\n-\t\t\t\t\"logout\":  \"\",\n-\t\t\t\t\"network\": \"\",\n-\t\t\t\t\"stats\":   \"\",\n-\t\t\t}\n+\t\t\t\t\t// Options should NOT end with a space\n+\t\t\t\t\tc.Assert(line, checker.Not(checker.HasSuffix), \" \", check.Commentf(\"Help for %q should not end with a space\", cmd))\n \n-\t\t\tif _, ok := noShortUsage[cmd]; !ok {\n-\t\t\t\t// For each command run it w/o any args. It will either return\n-\t\t\t\t// valid output or print a short-usage\n-\t\t\t\tvar dCmd *exec.Cmd\n-\t\t\t\tvar stdout, stderr string\n-\t\t\t\tvar args []string\n-\n-\t\t\t\t// skipNoArgs are ones that we don't want to try w/o\n-\t\t\t\t// any args. Either because it'll hang the test or\n-\t\t\t\t// lead to incorrect test result (like false negative).\n-\t\t\t\t// Whatever the reason, skip trying to run w/o args and\n-\t\t\t\t// jump to trying with a bogus arg.\n-\t\t\t\tskipNoArgs := map[string]struct{}{\n-\t\t\t\t\t\"daemon\": {},\n-\t\t\t\t\t\"events\": {},\n-\t\t\t\t\t\"load\":   {},\n \t\t\t\t}\n \n-\t\t\t\tec := 0\n-\t\t\t\tif _, ok := skipNoArgs[cmd]; !ok {\n-\t\t\t\t\targs = strings.Split(cmd, \" \")\n-\t\t\t\t\tdCmd = exec.Command(dockerBinary, args...)\n-\t\t\t\t\tstdout, stderr, ec, err = runCommandWithStdoutStderr(dCmd)\n+\t\t\t\t// For each command make sure we generate an error\n+\t\t\t\t// if we give a bad arg\n+\t\t\t\targs = strings.Split(cmd+\" --badArg\", \" \")\n+\n+\t\t\t\tout, _, err = dockerCmdWithError(args...)\n+\t\t\t\tc.Assert(err, checker.NotNil, check.Commentf(out))\n+\t\t\t\t// Be really picky\n+\t\t\t\tc.Assert(stderr, checker.Not(checker.HasSuffix), \"\\n\\n\", check.Commentf(\"Should not have a blank line at the end of 'docker rm'\\n\"))\n+\n+\t\t\t\t// Now make sure that each command will print a short-usage\n+\t\t\t\t// (not a full usage - meaning no opts section) if we\n+\t\t\t\t// are missing a required arg or pass in a bad arg\n+\n+\t\t\t\t// These commands will never print a short-usage so don't test\n+\t\t\t\tnoShortUsage := map[string]string{\n+\t\t\t\t\t\"images\":  \"\",\n+\t\t\t\t\t\"login\":   \"\",\n+\t\t\t\t\t\"logout\":  \"\",\n+\t\t\t\t\t\"network\": \"\",\n+\t\t\t\t\t\"stats\":   \"\",\n \t\t\t\t}\n \n-\t\t\t\t// If its ok w/o any args then try again with an arg\n-\t\t\t\tif ec == 0 {\n-\t\t\t\t\targs = strings.Split(cmd+\" badArg\", \" \")\n-\t\t\t\t\tdCmd = exec.Command(dockerBinary, args...)\n-\t\t\t\t\tstdout, stderr, ec, err = runCommandWithStdoutStderr(dCmd)\n+\t\t\t\tif _, ok := noShortUsage[cmd]; !ok {\n+\t\t\t\t\t// For each command run it w/o any args. It will either return\n+\t\t\t\t\t// valid output or print a short-usage\n+\t\t\t\t\tvar dCmd *exec.Cmd\n+\t\t\t\t\tvar stdout, stderr string\n+\t\t\t\t\tvar args []string\n+\n+\t\t\t\t\t// skipNoArgs are ones that we don't want to try w/o\n+\t\t\t\t\t// any args. Either because it'll hang the test or\n+\t\t\t\t\t// lead to incorrect test result (like false negative).\n+\t\t\t\t\t// Whatever the reason, skip trying to run w/o args and\n+\t\t\t\t\t// jump to trying with a bogus arg.\n+\t\t\t\t\tskipNoArgs := map[string]struct{}{\n+\t\t\t\t\t\t\"daemon\": {},\n+\t\t\t\t\t\t\"events\": {},\n+\t\t\t\t\t\t\"load\":   {},\n+\t\t\t\t\t}\n+\n+\t\t\t\t\tec := 0\n+\t\t\t\t\tif _, ok := skipNoArgs[cmd]; !ok {\n+\t\t\t\t\t\targs = strings.Split(cmd, \" \")\n+\t\t\t\t\t\tdCmd = exec.Command(dockerBinary, args...)\n+\t\t\t\t\t\tstdout, stderr, ec, err = runCommandWithStdoutStderr(dCmd)\n+\t\t\t\t\t}\n+\n+\t\t\t\t\t// If its ok w/o any args then try again with an arg\n+\t\t\t\t\tif ec == 0 {\n+\t\t\t\t\t\targs = strings.Split(cmd+\" badArg\", \" \")\n+\t\t\t\t\t\tdCmd = exec.Command(dockerBinary, args...)\n+\t\t\t\t\t\tstdout, stderr, ec, err = runCommandWithStdoutStderr(dCmd)\n+\t\t\t\t\t}\n+\n+\t\t\t\t\tif len(stdout) != 0 || len(stderr) == 0 || ec == 0 || err == nil {\n+\t\t\t\t\t\tc.Fatalf(\"Bad output from %q\\nstdout:%q\\nstderr:%q\\nec:%d\\nerr:%q\", args, stdout, stderr, ec, err)\n+\t\t\t\t\t}\n+\t\t\t\t\t// Should have just short usage\n+\t\t\t\t\tc.Assert(stderr, checker.Contains, \"\\nUsage:\\t\", check.Commentf(\"Missing short usage on %q\\n\", args))\n+\t\t\t\t\t// But shouldn't have full usage\n+\t\t\t\t\tc.Assert(stderr, checker.Not(checker.Contains), \"--help=false\", check.Commentf(\"Should not have full usage on %q\\n\", args))\n+\t\t\t\t\tc.Assert(stderr, checker.Not(checker.HasSuffix), \"\\n\\n\", check.Commentf(\"Should not have a blank line on %q\\n\", args))\n \t\t\t\t}\n \n-\t\t\t\tif len(stdout) != 0 || len(stderr) == 0 || ec == 0 || err == nil {\n-\t\t\t\t\tc.Fatalf(\"Bad output from %q\\nstdout:%q\\nstderr:%q\\nec:%d\\nerr:%q\", args, stdout, stderr, ec, err)\n-\t\t\t\t}\n-\t\t\t\t// Should have just short usage\n-\t\t\t\tc.Assert(stderr, checker.Contains, \"\\nUsage:\\t\", check.Commentf(\"Missing short usage on %q\\n\", args))\n-\t\t\t\t// But shouldn't have full usage\n-\t\t\t\tc.Assert(stderr, checker.Not(checker.Contains), \"--help=false\", check.Commentf(\"Should not have full usage on %q\\n\", args))\n-\t\t\t\tc.Assert(stderr, checker.Not(checker.HasSuffix), \"\\n\\n\", check.Commentf(\"Should not have a blank line on %q\\n\", args))\n \t\t\t}\n-\n \t\t}\n \n+\t\t// Divide the list of commands to 5 sets and run the func testcommand on these five sets in parallel\n+\t\t// to save runtime of test\n+\t\tn := len(cmdsToTest) / 5\n+\t\twg.Add(5)\n+\n+\t\tgo testcommand(cmdsToTest[0 : n-1])\n+\t\tgo testcommand(cmdsToTest[n : 2*n-1])\n+\t\tgo testcommand(cmdsToTest[2*n : 3*n-1])\n+\t\tgo testcommand(cmdsToTest[3*n : 4*n-1])\n+\t\tgo testcommand(cmdsToTest[5*n:])","path":"integration-cli/docker_cli_help_test.go","position":236,"original_position":236,"commit_id":"b059775c9c791378fbe65bfd607a5cceb18840c0","original_commit_id":"b059775c9c791378fbe65bfd607a5cceb18840c0","user":{"login":"aaronlehmann","id":10601430,"avatar_url":"https://avatars.githubusercontent.com/u/10601430?v=3","gravatar_id":"","url":"https://api.github.com/users/aaronlehmann","html_url":"https://github.com/aaronlehmann","followers_url":"https://api.github.com/users/aaronlehmann/followers","following_url":"https://api.github.com/users/aaronlehmann/following{/other_user}","gists_url":"https://api.github.com/users/aaronlehmann/gists{/gist_id}","starred_url":"https://api.github.com/users/aaronlehmann/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aaronlehmann/subscriptions","organizations_url":"https://api.github.com/users/aaronlehmann/orgs","repos_url":"https://api.github.com/users/aaronlehmann/repos","events_url":"https://api.github.com/users/aaronlehmann/events{/privacy}","received_events_url":"https://api.github.com/users/aaronlehmann/received_events","type":"User","site_admin":false},"body":"@sainath14: The slicing is still wrong. Here's my original comment, which no longer shows up:\r\n\r\n> The slicing here doesn't look right. For example, if n is 2, the first slice will be cmdsToTest[0:1] and the next will be cmdsToTest[2:3]. Neither contains cmdsToTest[1].\r\n> \r\n> I think this might be easier to verify and maintain if it's turned into a loop.","created_at":"2016-03-25T17:06:05Z","updated_at":"2016-03-25T17:06:05Z","html_url":"https://github.com/docker/docker/pull/21380#discussion_r57464301","pull_request_url":"https://api.github.com/repos/docker/docker/pulls/21380","_links":{"self":{"href":"https://api.github.com/repos/docker/docker/pulls/comments/57464301"},"html":{"href":"https://github.com/docker/docker/pull/21380#discussion_r57464301"},"pull_request":{"href":"https://api.github.com/repos/docker/docker/pulls/21380"}}},"pull_request":{"url":"https://api.github.com/repos/docker/docker/pulls/21380","id":63646465,"html_url":"https://github.com/docker/docker/pull/21380","diff_url":"https://github.com/docker/docker/pull/21380.diff","patch_url":"https://github.com/docker/docker/pull/21380.patch","issue_url":"https://api.github.com/repos/docker/docker/issues/21380","number":21380,"state":"open","locked":false,"title":"Improve the time taken by DockerSuite.TestHelpTextVerify","user":{"login":"sainath14","id":6599957,"avatar_url":"https://avatars.githubusercontent.com/u/6599957?v=3","gravatar_id":"","url":"https://api.github.com/users/sainath14","html_url":"https://github.com/sainath14","followers_url":"https://api.github.com/users/sainath14/followers","following_url":"https://api.github.com/users/sainath14/following{/other_user}","gists_url":"https://api.github.com/users/sainath14/gists{/gist_id}","starred_url":"https://api.github.com/users/sainath14/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sainath14/subscriptions","organizations_url":"https://api.github.com/users/sainath14/orgs","repos_url":"https://api.github.com/users/sainath14/repos","events_url":"https://api.github.com/users/sainath14/events{/privacy}","received_events_url":"https://api.github.com/users/sainath14/received_events","type":"User","site_admin":false},"body":"Helps with #19425 for the test DockerSuite.TestHelpTextVerify.\r\nThis test runs docker <command> --help on all commands in a serial fashion and checks the content of the help for various things like length of text. Also it tests each command for bad arguments and no arguments. It takes around 8-9 seconds to complete.\r\n\r\nThis patch would divide the list of commands into 5 sets and runs them in parallel in go routines.\r\nTime is reduced to around 2 seconds.\r\n","created_at":"2016-03-21T23:02:35Z","updated_at":"2016-03-25T17:06:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f8b0b50b8c3cfa682b9a983b1b79b631918e3201","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/docker/docker/pulls/21380/commits","review_comments_url":"https://api.github.com/repos/docker/docker/pulls/21380/comments","review_comment_url":"https://api.github.com/repos/docker/docker/pulls/comments{/number}","comments_url":"https://api.github.com/repos/docker/docker/issues/21380/comments","statuses_url":"https://api.github.com/repos/docker/docker/statuses/b059775c9c791378fbe65bfd607a5cceb18840c0","head":{"label":"sainath14:improve_help_text_test_time","ref":"improve_help_text_test_time","sha":"b059775c9c791378fbe65bfd607a5cceb18840c0","user":{"login":"sainath14","id":6599957,"avatar_url":"https://avatars.githubusercontent.com/u/6599957?v=3","gravatar_id":"","url":"https://api.github.com/users/sainath14","html_url":"https://github.com/sainath14","followers_url":"https://api.github.com/users/sainath14/followers","following_url":"https://api.github.com/users/sainath14/following{/other_user}","gists_url":"https://api.github.com/users/sainath14/gists{/gist_id}","starred_url":"https://api.github.com/users/sainath14/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sainath14/subscriptions","organizations_url":"https://api.github.com/users/sainath14/orgs","repos_url":"https://api.github.com/users/sainath14/repos","events_url":"https://api.github.com/users/sainath14/events{/privacy}","received_events_url":"https://api.github.com/users/sainath14/received_events","type":"User","site_admin":false},"repo":{"id":52126440,"name":"docker","full_name":"sainath14/docker","owner":{"login":"sainath14","id":6599957,"avatar_url":"https://avatars.githubusercontent.com/u/6599957?v=3","gravatar_id":"","url":"https://api.github.com/users/sainath14","html_url":"https://github.com/sainath14","followers_url":"https://api.github.com/users/sainath14/followers","following_url":"https://api.github.com/users/sainath14/following{/other_user}","gists_url":"https://api.github.com/users/sainath14/gists{/gist_id}","starred_url":"https://api.github.com/users/sainath14/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sainath14/subscriptions","organizations_url":"https://api.github.com/users/sainath14/orgs","repos_url":"https://api.github.com/users/sainath14/repos","events_url":"https://api.github.com/users/sainath14/events{/privacy}","received_events_url":"https://api.github.com/users/sainath14/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sainath14/docker","description":"Docker - the open-source application container engine","fork":true,"url":"https://api.github.com/repos/sainath14/docker","forks_url":"https://api.github.com/repos/sainath14/docker/forks","keys_url":"https://api.github.com/repos/sainath14/docker/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sainath14/docker/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sainath14/docker/teams","hooks_url":"https://api.github.com/repos/sainath14/docker/hooks","issue_events_url":"https://api.github.com/repos/sainath14/docker/issues/events{/number}","events_url":"https://api.github.com/repos/sainath14/docker/events","assignees_url":"https://api.github.com/repos/sainath14/docker/assignees{/user}","branches_url":"https://api.github.com/repos/sainath14/docker/branches{/branch}","tags_url":"https://api.github.com/repos/sainath14/docker/tags","blobs_url":"https://api.github.com/repos/sainath14/docker/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sainath14/docker/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sainath14/docker/git/refs{/sha}","trees_url":"https://api.github.com/repos/sainath14/docker/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sainath14/docker/statuses/{sha}","languages_url":"https://api.github.com/repos/sainath14/docker/languages","stargazers_url":"https://api.github.com/repos/sainath14/docker/stargazers","contributors_url":"https://api.github.com/repos/sainath14/docker/contributors","subscribers_url":"https://api.github.com/repos/sainath14/docker/subscribers","subscription_url":"https://api.github.com/repos/sainath14/docker/subscription","commits_url":"https://api.github.com/repos/sainath14/docker/commits{/sha}","git_commits_url":"https://api.github.com/repos/sainath14/docker/git/commits{/sha}","comments_url":"https://api.github.com/repos/sainath14/docker/comments{/number}","issue_comment_url":"https://api.github.com/repos/sainath14/docker/issues/comments{/number}","contents_url":"https://api.github.com/repos/sainath14/docker/contents/{+path}","compare_url":"https://api.github.com/repos/sainath14/docker/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sainath14/docker/merges","archive_url":"https://api.github.com/repos/sainath14/docker/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sainath14/docker/downloads","issues_url":"https://api.github.com/repos/sainath14/docker/issues{/number}","pulls_url":"https://api.github.com/repos/sainath14/docker/pulls{/number}","milestones_url":"https://api.github.com/repos/sainath14/docker/milestones{/number}","notifications_url":"https://api.github.com/repos/sainath14/docker/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sainath14/docker/labels{/name}","releases_url":"https://api.github.com/repos/sainath14/docker/releases{/id}","deployments_url":"https://api.github.com/repos/sainath14/docker/deployments","created_at":"2016-02-19T23:59:05Z","updated_at":"2016-02-19T23:59:15Z","pushed_at":"2016-03-21T23:56:24Z","git_url":"git://github.com/sainath14/docker.git","ssh_url":"git@github.com:sainath14/docker.git","clone_url":"https://github.com/sainath14/docker.git","svn_url":"https://github.com/sainath14/docker","homepage":"http://www.docker.com","size":86102,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"docker:master","ref":"master","sha":"c22d09f56336b31a0569c424957b13f7baf01a92","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}","deployments_url":"https://api.github.com/repos/docker/docker/deployments","created_at":"2013-01-18T18:10:57Z","updated_at":"2016-03-25T16:59:53Z","pushed_at":"2016-03-25T16:56:55Z","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":144036,"stargazers_count":29835,"watchers_count":29835,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8396,"mirror_url":null,"open_issues_count":1422,"forks":8396,"open_issues":1422,"watchers":29835,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/docker/docker/pulls/21380"},"html":{"href":"https://github.com/docker/docker/pull/21380"},"issue":{"href":"https://api.github.com/repos/docker/docker/issues/21380"},"comments":{"href":"https://api.github.com/repos/docker/docker/issues/21380/comments"},"review_comments":{"href":"https://api.github.com/repos/docker/docker/pulls/21380/comments"},"review_comment":{"href":"https://api.github.com/repos/docker/docker/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/docker/docker/pulls/21380/commits"},"statuses":{"href":"https://api.github.com/repos/docker/docker/statuses/b059775c9c791378fbe65bfd607a5cceb18840c0"}}}}