Merge pull request #689 from dotcloud/help_command-fix

- Runtime: bring Error: Command not found: <command>
This commit is contained in:
Guillaume J. Charmes 2013-05-24 12:01:19 -07:00
commit 064101d82e
2 changed files with 19 additions and 4 deletions

1
api.go
View File

@ -662,6 +662,5 @@ func ListenAndServe(addr string, srv *Server, logging bool) error {
r.Path(localRoute).Methods(localMethod).HandlerFunc(f) r.Path(localRoute).Methods(localMethod).HandlerFunc(f)
} }
} }
return http.ListenAndServe(addr, r) return http.ListenAndServe(addr, r)
} }

View File

@ -30,15 +30,19 @@ var (
GIT_COMMIT string GIT_COMMIT string
) )
func (cli *DockerCli) getMethod(name string) (reflect.Method, bool) {
methodName := "Cmd" + strings.ToUpper(name[:1]) + strings.ToLower(name[1:])
return reflect.TypeOf(cli).MethodByName(methodName)
}
func ParseCommands(addr string, port int, args ...string) error { func ParseCommands(addr string, port int, args ...string) error {
cli := NewDockerCli(addr, port) cli := NewDockerCli(addr, port)
if len(args) > 0 { if len(args) > 0 {
methodName := "Cmd" + strings.ToUpper(args[0][:1]) + strings.ToLower(args[0][1:]) method, exists := cli.getMethod(args[0])
method, exists := reflect.TypeOf(cli).MethodByName(methodName)
if !exists { if !exists {
fmt.Println("Error: Command not found:", args[0]) fmt.Println("Error: Command not found:", args[0])
return cli.CmdHelp(args...) return cli.CmdHelp(args[1:]...)
} }
ret := method.Func.CallSlice([]reflect.Value{ ret := method.Func.CallSlice([]reflect.Value{
reflect.ValueOf(cli), reflect.ValueOf(cli),
@ -53,6 +57,18 @@ func ParseCommands(addr string, port int, args ...string) error {
} }
func (cli *DockerCli) CmdHelp(args ...string) error { func (cli *DockerCli) CmdHelp(args ...string) error {
if len(args) > 0 {
method, exists := cli.getMethod(args[0])
if !exists {
fmt.Println("Error: Command not found:", args[0])
} else {
method.Func.CallSlice([]reflect.Value{
reflect.ValueOf(cli),
reflect.ValueOf([]string{"--help"}),
})[0].Interface()
return nil
}
}
help := fmt.Sprintf("Usage: docker [OPTIONS] COMMAND [arg...]\n -H=\"%s:%d\": Host:port to bind/connect to\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n", cli.addr, cli.port) help := fmt.Sprintf("Usage: docker [OPTIONS] COMMAND [arg...]\n -H=\"%s:%d\": Host:port to bind/connect to\n\nA self-sufficient runtime for linux containers.\n\nCommands:\n", cli.addr, cli.port)
for cmd, description := range map[string]string{ for cmd, description := range map[string]string{
"attach": "Attach to a running container", "attach": "Attach to a running container",