@@ -12,29 +12,116 @@ import (
1212)
1313
1414func main () {
15- var listIncludeContainerNames bool
16- var listVerbose bool
1715
1816 rootCmd := & cobra.Command {Use : "devcontainer" }
1917
18+ rootCmd .AddCommand (createListCommand ())
19+ rootCmd .AddCommand (createExecCommand ())
20+ rootCmd .AddCommand (createCompleteCommand (rootCmd ))
21+
22+ rootCmd .Execute ()
23+ }
24+
25+ func createListCommand () * cobra.Command {
26+ var listIncludeContainerNames bool
27+ var listVerbose bool
2028 cmdList := & cobra.Command {
2129 Use : "list" ,
2230 Short : "List devcontainers" ,
2331 Long : "Lists devcontainers that are currently running" ,
2432 Run : func (cmd * cobra.Command , args []string ) {
25- runListCommand (cmd , args , listIncludeContainerNames , listVerbose )
33+ if listIncludeContainerNames && listVerbose {
34+ fmt .Println ("Can't use both verbose and include-container-names" )
35+ os .Exit (1 )
36+ }
37+ devcontainers , err := devcontainers .ListDevcontainers ()
38+ if err != nil {
39+ fmt .Printf ("Error: %v" , err )
40+ os .Exit (1 )
41+ }
42+ if listVerbose {
43+ sort .Slice (devcontainers , func (i , j int ) bool { return devcontainers [i ].DevcontainerName < devcontainers [j ].DevcontainerName })
44+
45+ w := new (tabwriter.Writer )
46+ // minwidth, tabwidth, padding, padchar, flags
47+ w .Init (os .Stdout , 8 , 8 , 0 , '\t' , 0 )
48+ defer w .Flush ()
49+
50+ fmt .Fprintf (w , "%s\t %s\n " , "DEVCONTAINER NAME" , "CONTAINER NAME" )
51+ fmt .Fprintf (w , "%s\t %s\n " , "-----------------" , "--------------" )
52+
53+ for _ , devcontainer := range devcontainers {
54+ fmt .Fprintf (w , "%s\t %s\n " , devcontainer .DevcontainerName , devcontainer .ContainerName )
55+ }
56+ return
57+ }
58+ names := []string {}
59+ for _ , devcontainer := range devcontainers {
60+ names = append (names , devcontainer .DevcontainerName )
61+ if listIncludeContainerNames {
62+ names = append (names , devcontainer .ContainerName )
63+ }
64+ }
65+ sort .Strings (names )
66+ for _ , name := range names {
67+ fmt .Println (name )
68+ }
2669 },
2770 }
2871 cmdList .Flags ().BoolVar (& listIncludeContainerNames , "include-container-names" , false , "Also include container names in the list" )
2972 cmdList .Flags ().BoolVarP (& listVerbose , "verbose" , "v" , false , "Verbose output" )
30- rootCmd .AddCommand (cmdList )
73+ return cmdList
74+ }
3175
32- cmdExec := & cobra.Command {
76+ func createExecCommand () * cobra.Command {
77+ cmd := & cobra.Command {
3378 Use : "exec DEVCONTAINER_NAME COMMAND [args...]" ,
3479 Short : "Execute a command in a devcontainer" ,
3580 Long : "Execute a command in a devcontainer, similar to `docker exec`." ,
3681 Run : func (cmd * cobra.Command , args []string ) {
37- runExecCommand (cmd , args )
82+
83+ if len (args ) < 2 {
84+ cmd .Usage ()
85+ os .Exit (1 )
86+ }
87+
88+ devcontainerName := args [0 ]
89+ devcontainers , err := devcontainers .ListDevcontainers ()
90+ if err != nil {
91+ fmt .Printf ("Error: %v" , err )
92+ os .Exit (1 )
93+ }
94+
95+ containerID := ""
96+ for _ , devcontainer := range devcontainers {
97+ if devcontainer .ContainerName == devcontainerName || devcontainer .DevcontainerName == devcontainerName {
98+ containerID = devcontainer .ContainerID
99+ break
100+ }
101+ }
102+ if containerID == "" {
103+ cmd .Usage ()
104+ if err != nil {
105+ fmt .Printf ("Error: %v" , err )
106+ }
107+ os .Exit (1 )
108+ }
109+
110+ dockerArgs := []string {"exec" , "-it" , containerID }
111+ dockerArgs = append (dockerArgs , args [1 :]... )
112+
113+ dockerCmd := exec .Command ("docker" , dockerArgs ... )
114+ dockerCmd .Stdin = os .Stdin
115+ dockerCmd .Stdout = os .Stdout
116+
117+ err = dockerCmd .Start ()
118+ if err != nil {
119+ fmt .Printf ("Exec: start error: %s\n " , err )
120+ }
121+ err = dockerCmd .Wait ()
122+ if err != nil {
123+ fmt .Printf ("Exec: wait error: %s\n " , err )
124+ }
38125 },
39126 Args : cobra .ArbitraryArgs ,
40127 DisableFlagParsing : true ,
@@ -58,9 +145,11 @@ func main() {
58145 return names , cobra .ShellCompDirectiveNoFileComp
59146 },
60147 }
61- rootCmd .AddCommand (cmdExec )
148+ return cmd
149+ }
62150
63- cmdCompletion := & cobra.Command {
151+ func createCompleteCommand (rootCmd * cobra.Command ) * cobra.Command {
152+ return & cobra.Command {
64153 Use : "completion" ,
65154 Short : "Generates bash completion scripts" ,
66155 Long : `To load completion run
@@ -76,93 +165,4 @@ func main() {
76165 rootCmd .GenBashCompletion (os .Stdout )
77166 },
78167 }
79- rootCmd .AddCommand (cmdCompletion )
80-
81- rootCmd .Execute ()
82- }
83-
84- func runListCommand (cmd * cobra.Command , args []string , listIncludeContainerNames bool , listVerbose bool ) {
85- if listIncludeContainerNames && listVerbose {
86- fmt .Println ("Can't use both verbose and include-container-names" )
87- os .Exit (1 )
88- }
89- devcontainers , err := devcontainers .ListDevcontainers ()
90- if err != nil {
91- fmt .Printf ("Error: %v" , err )
92- os .Exit (1 )
93- }
94- if listVerbose {
95- sort .Slice (devcontainers , func (i , j int ) bool { return devcontainers [i ].DevcontainerName < devcontainers [j ].DevcontainerName })
96-
97- w := new (tabwriter.Writer )
98- // minwidth, tabwidth, padding, padchar, flags
99- w .Init (os .Stdout , 8 , 8 , 0 , '\t' , 0 )
100- defer w .Flush ()
101-
102- fmt .Fprintf (w , "%s\t %s\n " , "DEVCONTAINER NAME" , "CONTAINER NAME" )
103- fmt .Fprintf (w , "%s\t %s\n " , "-----------------" , "--------------" )
104-
105- for _ , devcontainer := range devcontainers {
106- fmt .Fprintf (w , "%s\t %s\n " , devcontainer .DevcontainerName , devcontainer .ContainerName )
107- }
108- return
109- }
110- names := []string {}
111- for _ , devcontainer := range devcontainers {
112- names = append (names , devcontainer .DevcontainerName )
113- if listIncludeContainerNames {
114- names = append (names , devcontainer .ContainerName )
115- }
116- }
117- sort .Strings (names )
118- for _ , name := range names {
119- fmt .Println (name )
120- }
121- }
122-
123- func runExecCommand (cmd * cobra.Command , args []string ) {
124- // TODO argument validation!
125-
126- if len (args ) < 2 {
127- cmd .Usage ()
128- os .Exit (1 )
129- }
130-
131- devcontainerName := args [0 ]
132- devcontainers , err := devcontainers .ListDevcontainers ()
133- if err != nil {
134- fmt .Printf ("Error: %v" , err )
135- os .Exit (1 )
136- }
137-
138- containerID := ""
139- for _ , devcontainer := range devcontainers {
140- if devcontainer .ContainerName == devcontainerName || devcontainer .DevcontainerName == devcontainerName {
141- containerID = devcontainer .ContainerID
142- break
143- }
144- }
145- if containerID == "" {
146- cmd .Usage ()
147- if err != nil {
148- fmt .Printf ("Error: %v" , err )
149- }
150- os .Exit (1 )
151- }
152-
153- dockerArgs := []string {"exec" , "-it" , containerID }
154- dockerArgs = append (dockerArgs , args [1 :]... )
155-
156- dockerCmd := exec .Command ("docker" , dockerArgs ... )
157- dockerCmd .Stdin = os .Stdin
158- dockerCmd .Stdout = os .Stdout
159-
160- err = dockerCmd .Start ()
161- if err != nil {
162- fmt .Printf ("Exec: start error: %s\n " , err )
163- }
164- err = dockerCmd .Wait ()
165- if err != nil {
166- fmt .Printf ("Exec: wait error: %s\n " , err )
167- }
168168}
0 commit comments